⬆️ Update dependencies
This commit is contained in:
		
							parent
							
								
									a5e5be7450
								
							
						
					
					
						commit
						dc2f90fb0d
					
				
							
								
								
									
										8
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								go.mod
									
									
									
									
									
								
							| @ -4,16 +4,16 @@ go 1.15 | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/alecthomas/kong v0.2.11 | ||||
| 	github.com/go-chi/chi v4.0.2+incompatible // indirect | ||||
| 	github.com/go-chi/chi v4.1.2+incompatible | ||||
| 	github.com/go-yaml/yaml v2.1.0+incompatible // indirect | ||||
| 	github.com/kr/pretty v0.1.0 // indirect | ||||
| 	github.com/satori/go.uuid v1.2.0 | ||||
| 	github.com/sethvargo/go-password v0.1.2 | ||||
| 	github.com/sethvargo/go-password v0.2.0 | ||||
| 	github.com/tidwall/buntdb v1.1.2 | ||||
| 	github.com/tidwall/grect v0.0.0-20161006141115-ba9a043346eb // indirect | ||||
| 	github.com/tidwall/rtree v0.0.0-20180113144539-6cd427091e0e // indirect | ||||
| 	github.com/tidwall/tinyqueue v0.0.0-20180302190814-1e39f5511563 // indirect | ||||
| 	golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 | ||||
| 	golang.org/x/net v0.0.0-20190620200207-3b0461eec859 | ||||
| 	golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 | ||||
| 	golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0 | ||||
| 	gopkg.in/yaml.v2 v2.2.2 // indirect | ||||
| ) | ||||
|  | ||||
							
								
								
									
										15
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								go.sum
									
									
									
									
									
								
							| @ -25,6 +25,8 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn | ||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||
| github.com/go-chi/chi v4.0.2+incompatible h1:maB6vn6FqCxrpz4FqWdh4+lwpyZIQS7YEAUcHlgXVRs= | ||||
| github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= | ||||
| github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= | ||||
| github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= | ||||
| github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= | ||||
| github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= | ||||
| github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= | ||||
| @ -50,6 +52,8 @@ github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= | ||||
| github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= | ||||
| github.com/sethvargo/go-password v0.1.2 h1:fhBF4thiPVKEZ7R6+CX46GWJiPyCyXshbeqZ7lqEeYo= | ||||
| github.com/sethvargo/go-password v0.1.2/go.mod h1:qKHfdSjT26DpHQWHWWR5+X4BI45jT31dg6j4RI2TEb0= | ||||
| github.com/sethvargo/go-password v0.2.0 h1:BTDl4CC/gjf/axHMaDQtw507ogrXLci6XRiLc7i/UHI= | ||||
| github.com/sethvargo/go-password v0.2.0/go.mod h1:Ym4Mr9JXLBycr02MFuVQ/0JHidNetSgbzutTr3zsYXE= | ||||
| github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | ||||
| github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | ||||
| github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= | ||||
| @ -90,16 +94,27 @@ golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/go.mod h1:6SG95UA2DQfeDnf | ||||
| golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= | ||||
| golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U= | ||||
| golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= | ||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0 h1:5kGOVHlq0euqwzgTC9Vu15p6fV1Wi0ArVi8da2urnVg= | ||||
| golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||
| golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= | ||||
| golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= | ||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/github.com/go-chi/chi/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-chi/chi/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -4,6 +4,8 @@ go: | ||||
|   - 1.10.x | ||||
|   - 1.11.x | ||||
|   - 1.12.x | ||||
|   - 1.13.x | ||||
|   - 1.14.x | ||||
| 
 | ||||
| script: | ||||
|   - go get -d -t ./... | ||||
|  | ||||
							
								
								
									
										51
									
								
								vendor/github.com/go-chi/chi/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								vendor/github.com/go-chi/chi/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,5 +1,56 @@ | ||||
| # Changelog | ||||
| 
 | ||||
| ## v4.1.2 (2020-06-02) | ||||
| 
 | ||||
| - fix that handles MethodNotAllowed with path variables, thank you @caseyhadden for your contribution | ||||
| - fix to replace nested wildcards correctly in RoutePattern, thank you @@unmultimedio for your contribution | ||||
| - History of changes: see https://github.com/go-chi/chi/compare/v4.1.1...v4.1.2 | ||||
| 
 | ||||
| 
 | ||||
| ## v4.1.1 (2020-04-16) | ||||
| 
 | ||||
| - fix for issue https://github.com/go-chi/chi/issues/411 which allows for overlapping regexp | ||||
|   route to the correct handler through a recursive tree search, thanks to @Jahaja for the PR/fix! | ||||
| - new middleware.RouteHeaders as a simple router for request headers with wildcard support | ||||
| - History of changes: see https://github.com/go-chi/chi/compare/v4.1.0...v4.1.1 | ||||
| 
 | ||||
| 
 | ||||
| ## v4.1.0 (2020-04-1) | ||||
| 
 | ||||
| - middleware.LogEntry: Write method on interface now passes the response header | ||||
|   and an extra interface type useful for custom logger implementations. | ||||
| - middleware.WrapResponseWriter: minor fix | ||||
| - middleware.Recoverer: a bit prettier | ||||
| - History of changes: see https://github.com/go-chi/chi/compare/v4.0.4...v4.1.0 | ||||
| 
 | ||||
| 
 | ||||
| ## v4.0.4 (2020-03-24) | ||||
| 
 | ||||
| - middleware.Recoverer: new pretty stack trace printing (https://github.com/go-chi/chi/pull/496) | ||||
| - a few minor improvements and fixes | ||||
| - History of changes: see https://github.com/go-chi/chi/compare/v4.0.3...v4.0.4 | ||||
| 
 | ||||
| 
 | ||||
| ## v4.0.3 (2020-01-09) | ||||
| 
 | ||||
| - core: fix regexp routing to include default value when param is not matched | ||||
| - middleware: rewrite of middleware.Compress | ||||
| - middleware: suppress http.ErrAbortHandler in middleware.Recoverer | ||||
| - History of changes: see https://github.com/go-chi/chi/compare/v4.0.2...v4.0.3 | ||||
| 
 | ||||
| 
 | ||||
| ## v4.0.2 (2019-02-26) | ||||
| 
 | ||||
| - Minor fixes | ||||
| - History of changes: see https://github.com/go-chi/chi/compare/v4.0.1...v4.0.2 | ||||
| 
 | ||||
| 
 | ||||
| ## v4.0.1 (2019-01-21) | ||||
| 
 | ||||
| - Fixes issue with compress middleware: #382 #385 | ||||
| - History of changes: see https://github.com/go-chi/chi/compare/v4.0.0...v4.0.1 | ||||
| 
 | ||||
| 
 | ||||
| ## v4.0.0 (2019-01-10) | ||||
| 
 | ||||
| - chi v4 requires Go 1.10.3+ (or Go 1.9.7+) - we have deprecated support for Go 1.7 and 1.8 | ||||
|  | ||||
							
								
								
									
										37
									
								
								vendor/github.com/go-chi/chi/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/go-chi/chi/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -28,7 +28,7 @@ included some useful/optional subpackages: [middleware](/middleware), [render](h | ||||
| * **Fast** - yes, see [benchmarks](#benchmarks) | ||||
| * **100% compatible with net/http** - use any http or middleware pkg in the ecosystem that is also compatible with `net/http` | ||||
| * **Designed for modular/composable APIs** - middlewares, inline middlewares, route groups and subrouter mounting | ||||
| * **Context control** - built on new `context` package, providing value chaining, cancelations and timeouts | ||||
| * **Context control** - built on new `context` package, providing value chaining, cancellations and timeouts | ||||
| * **Robust** - in production at Pressly, CloudFlare, Heroku, 99Designs, and many others (see [discussion](https://github.com/go-chi/chi/issues/91)) | ||||
| * **Doc generation** - `docgen` auto-generates routing documentation from your source to JSON or Markdown | ||||
| * **No external dependencies** - plain ol' Go stdlib + net/http | ||||
| @ -46,11 +46,14 @@ package main | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 
 | ||||
| 	"github.com/go-chi/chi" | ||||
| 	"github.com/go-chi/chi/middleware" | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	r := chi.NewRouter() | ||||
| 	r.Use(middleware.Logger) | ||||
| 	r.Get("/", func(w http.ResponseWriter, r *http.Request) { | ||||
| 		w.Write([]byte("welcome")) | ||||
| 	}) | ||||
| @ -179,7 +182,7 @@ type Router interface { | ||||
| 	http.Handler | ||||
| 	Routes | ||||
| 
 | ||||
| 	// Use appends one of more middlewares onto the Router stack. | ||||
| 	// Use appends one or more middlewares onto the Router stack. | ||||
| 	Use(middlewares ...func(http.Handler) http.Handler) | ||||
| 
 | ||||
| 	// With adds inline middlewares for an endpoint handler. | ||||
| @ -315,6 +318,7 @@ with `net/http` can be used with chi's mux. | ||||
| | chi/middleware Handler | description                                                                    | | ||||
| |:----------------------|:--------------------------------------------------------------------------------- | ||||
| | AllowContentType      | Explicit whitelist of accepted request Content-Types                            | | ||||
| | BasicAuth             | Basic HTTP authentication                                                       | | ||||
| | Compress              | Gzip compression for clients that accept compressed responses                   | | ||||
| | GetHead               | Automatically route undefined HEAD requests to GET handlers                     | | ||||
| | Heartbeat             | Monitoring endpoint to check the servers pulse                                  | | ||||
| @ -333,7 +337,7 @@ with `net/http` can be used with chi's mux. | ||||
| | WithValue             | Short-hand middleware to set a key/value on the request context                 | | ||||
| ----------------------------------------------------------------------------------------------------------- | ||||
| 
 | ||||
| ### Auxiliary middlewares & packages | ||||
| ### Extra middlewares & packages | ||||
| 
 | ||||
| Please see https://github.com/go-chi for additional packages. | ||||
| 
 | ||||
| @ -344,9 +348,11 @@ Please see https://github.com/go-chi for additional packages. | ||||
| | [docgen](https://github.com/go-chi/docgen)         | Print chi.Router routes at runtime                          | | ||||
| | [jwtauth](https://github.com/go-chi/jwtauth)       | JWT authentication                                          | | ||||
| | [hostrouter](https://github.com/go-chi/hostrouter) | Domain/host based request routing                           | | ||||
| | [httpcoala](https://github.com/go-chi/httpcoala)   | HTTP request coalescer                                      | | ||||
| | [chi-authz](https://github.com/casbin/chi-authz)   | Request ACL via https://github.com/hsluoyz/casbin           | | ||||
| | [phi](https://github.com/fate-lovely/phi)          | Port chi to [fasthttp](https://github.com/valyala/fasthttp) | | ||||
| | [httplog](https://github.com/go-chi/httplog)       | Small but powerful structured HTTP request logging          | | ||||
| | [httprate](https://github.com/go-chi/httprate)     | HTTP request rate limiter                                   | | ||||
| | [httptracer](https://github.com/go-chi/httptracer) | HTTP request performance tracing library                    | | ||||
| | [httpvcr](https://github.com/go-chi/httpvcr)       | Write deterministic tests for external sources              | | ||||
| | [stampede](https://github.com/go-chi/stampede)     | HTTP request coalescer                                      | | ||||
| -------------------------------------------------------------------------------------------------------------------- | ||||
| 
 | ||||
| please [submit a PR](./CONTRIBUTING.md) if you'd like to include a link to a chi-compatible middleware | ||||
| @ -412,18 +418,15 @@ We'll be more than happy to see [your contributions](./CONTRIBUTING.md)! | ||||
| ## Beyond REST | ||||
| 
 | ||||
| chi is just a http router that lets you decompose request handling into many smaller layers. | ||||
| Many companies including Pressly.com (of course) use chi to write REST services for their public | ||||
| APIs. But, REST is just a convention for managing state via HTTP, and there's a lot of other pieces | ||||
| required to write a complete client-server system or network of microservices. | ||||
| Many companies use chi to write REST services for their public APIs. But, REST is just a convention | ||||
| for managing state via HTTP, and there's a lot of other pieces required to write a complete client-server | ||||
| system or network of microservices. | ||||
| 
 | ||||
| Looking ahead beyond REST, I also recommend some newer works in the field coming from | ||||
| [gRPC](https://github.com/grpc/grpc-go), [NATS](https://nats.io), [go-kit](https://github.com/go-kit/kit) | ||||
| and even [graphql](https://github.com/graphql-go/graphql). They're all pretty cool with their | ||||
| own unique approaches and benefits. Specifically, I'd look at gRPC since it makes client-server | ||||
| communication feel like a single program on a single computer, no need to hand-write a client library | ||||
| and the request/response payloads are typed contracts. NATS is pretty amazing too as a super | ||||
| fast and lightweight pub-sub transport that can speak protobufs, with nice service discovery - | ||||
| an excellent combination with gRPC. | ||||
| Looking beyond REST, I also recommend some newer works in the field: | ||||
| * [webrpc](https://github.com/webrpc/webrpc) - Web-focused RPC client+server framework with code-gen | ||||
| * [gRPC](https://github.com/grpc/grpc-go) - Google's RPC framework via protobufs | ||||
| * [graphql](https://github.com/99designs/gqlgen) - Declarative query language | ||||
| * [NATS](https://nats.io) - lightweight pub-sub | ||||
| 
 | ||||
| 
 | ||||
| ## License | ||||
|  | ||||
							
								
								
									
										4
									
								
								vendor/github.com/go-chi/chi/chi.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/go-chi/chi/chi.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,7 +1,7 @@ | ||||
| // | ||||
| // Package chi is a small, idiomatic and composable router for building HTTP services. | ||||
| // | ||||
| // chi requires Go 1.7 or newer. | ||||
| // chi requires Go 1.10 or newer. | ||||
| // | ||||
| // Example: | ||||
| //  package main | ||||
| @ -68,7 +68,7 @@ type Router interface { | ||||
| 	http.Handler | ||||
| 	Routes | ||||
| 
 | ||||
| 	// Use appends one of more middlewares onto the Router stack. | ||||
| 	// Use appends one or more middlewares onto the Router stack. | ||||
| 	Use(middlewares ...func(http.Handler) http.Handler) | ||||
| 
 | ||||
| 	// With adds inline middlewares for an endpoint handler. | ||||
|  | ||||
							
								
								
									
										103
									
								
								vendor/github.com/go-chi/chi/context.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										103
									
								
								vendor/github.com/go-chi/chi/context.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -7,6 +7,54 @@ import ( | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // URLParam returns the url parameter from a http.Request object. | ||||
| func URLParam(r *http.Request, key string) string { | ||||
| 	if rctx := RouteContext(r.Context()); rctx != nil { | ||||
| 		return rctx.URLParam(key) | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
| 
 | ||||
| // URLParamFromCtx returns the url parameter from a http.Request Context. | ||||
| func URLParamFromCtx(ctx context.Context, key string) string { | ||||
| 	if rctx := RouteContext(ctx); rctx != nil { | ||||
| 		return rctx.URLParam(key) | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
| 
 | ||||
| // RouteContext returns chi's routing Context object from a | ||||
| // http.Request Context. | ||||
| func RouteContext(ctx context.Context) *Context { | ||||
| 	val, _ := ctx.Value(RouteCtxKey).(*Context) | ||||
| 	return val | ||||
| } | ||||
| 
 | ||||
| // ServerBaseContext wraps an http.Handler to set the request context to the | ||||
| // `baseCtx`. | ||||
| func ServerBaseContext(baseCtx context.Context, h http.Handler) http.Handler { | ||||
| 	fn := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 		ctx := r.Context() | ||||
| 		baseCtx := baseCtx | ||||
| 
 | ||||
| 		// Copy over default net/http server context keys | ||||
| 		if v, ok := ctx.Value(http.ServerContextKey).(*http.Server); ok { | ||||
| 			baseCtx = context.WithValue(baseCtx, http.ServerContextKey, v) | ||||
| 		} | ||||
| 		if v, ok := ctx.Value(http.LocalAddrContextKey).(net.Addr); ok { | ||||
| 			baseCtx = context.WithValue(baseCtx, http.LocalAddrContextKey, v) | ||||
| 		} | ||||
| 
 | ||||
| 		h.ServeHTTP(w, r.WithContext(baseCtx)) | ||||
| 	}) | ||||
| 	return fn | ||||
| } | ||||
| 
 | ||||
| // NewRouteContext returns a new routing Context object. | ||||
| func NewRouteContext() *Context { | ||||
| 	return &Context{} | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	// RouteCtxKey is the context.Context key to store the request context. | ||||
| 	RouteCtxKey = &contextKey{"RouteContext"} | ||||
| @ -46,11 +94,6 @@ type Context struct { | ||||
| 	methodNotAllowed bool | ||||
| } | ||||
| 
 | ||||
| // NewRouteContext returns a new routing Context object. | ||||
| func NewRouteContext() *Context { | ||||
| 	return &Context{} | ||||
| } | ||||
| 
 | ||||
| // Reset a routing context to its initial state. | ||||
| func (x *Context) Reset() { | ||||
| 	x.Routes = nil | ||||
| @ -93,29 +136,17 @@ func (x *Context) URLParam(key string) string { | ||||
| //   } | ||||
| func (x *Context) RoutePattern() string { | ||||
| 	routePattern := strings.Join(x.RoutePatterns, "") | ||||
| 	return strings.Replace(routePattern, "/*/", "/", -1) | ||||
| 	return replaceWildcards(routePattern) | ||||
| } | ||||
| 
 | ||||
| // RouteContext returns chi's routing Context object from a | ||||
| // http.Request Context. | ||||
| func RouteContext(ctx context.Context) *Context { | ||||
| 	return ctx.Value(RouteCtxKey).(*Context) | ||||
| } | ||||
| 
 | ||||
| // URLParam returns the url parameter from a http.Request object. | ||||
| func URLParam(r *http.Request, key string) string { | ||||
| 	if rctx := RouteContext(r.Context()); rctx != nil { | ||||
| 		return rctx.URLParam(key) | ||||
| // replaceWildcards takes a route pattern and recursively replaces all | ||||
| // occurrences of "/*/" to "/". | ||||
| func replaceWildcards(p string) string { | ||||
| 	if strings.Contains(p, "/*/") { | ||||
| 		return replaceWildcards(strings.Replace(p, "/*/", "/", -1)) | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
| 
 | ||||
| // URLParamFromCtx returns the url parameter from a http.Request Context. | ||||
| func URLParamFromCtx(ctx context.Context, key string) string { | ||||
| 	if rctx := RouteContext(ctx); rctx != nil { | ||||
| 		return rctx.URLParam(key) | ||||
| 	} | ||||
| 	return "" | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // RouteParams is a structure to track URL routing parameters efficiently. | ||||
| @ -125,28 +156,8 @@ type RouteParams struct { | ||||
| 
 | ||||
| // Add will append a URL parameter to the end of the route param | ||||
| func (s *RouteParams) Add(key, value string) { | ||||
| 	(*s).Keys = append((*s).Keys, key) | ||||
| 	(*s).Values = append((*s).Values, value) | ||||
| } | ||||
| 
 | ||||
| // ServerBaseContext wraps an http.Handler to set the request context to the | ||||
| // `baseCtx`. | ||||
| func ServerBaseContext(baseCtx context.Context, h http.Handler) http.Handler { | ||||
| 	fn := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 		ctx := r.Context() | ||||
| 		baseCtx := baseCtx | ||||
| 
 | ||||
| 		// Copy over default net/http server context keys | ||||
| 		if v, ok := ctx.Value(http.ServerContextKey).(*http.Server); ok { | ||||
| 			baseCtx = context.WithValue(baseCtx, http.ServerContextKey, v) | ||||
| 		} | ||||
| 		if v, ok := ctx.Value(http.LocalAddrContextKey).(net.Addr); ok { | ||||
| 			baseCtx = context.WithValue(baseCtx, http.LocalAddrContextKey, v) | ||||
| 		} | ||||
| 
 | ||||
| 		h.ServeHTTP(w, r.WithContext(baseCtx)) | ||||
| 	}) | ||||
| 	return fn | ||||
| 	s.Keys = append(s.Keys, key) | ||||
| 	s.Values = append(s.Values, value) | ||||
| } | ||||
| 
 | ||||
| // contextKey is a value for use with context.WithValue. It's used as | ||||
|  | ||||
							
								
								
									
										32
									
								
								vendor/github.com/go-chi/chi/middleware/basic_auth.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								vendor/github.com/go-chi/chi/middleware/basic_auth.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| ) | ||||
| 
 | ||||
| // BasicAuth implements a simple middleware handler for adding basic http auth to a route. | ||||
| func BasicAuth(realm string, creds map[string]string) func(next http.Handler) http.Handler { | ||||
| 	return func(next http.Handler) http.Handler { | ||||
| 		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 			user, pass, ok := r.BasicAuth() | ||||
| 			if !ok { | ||||
| 				basicAuthFailed(w, realm) | ||||
| 				return | ||||
| 			} | ||||
| 
 | ||||
| 			credPass, credUserOk := creds[user] | ||||
| 			if !credUserOk || pass != credPass { | ||||
| 				basicAuthFailed(w, realm) | ||||
| 				return | ||||
| 			} | ||||
| 
 | ||||
| 			next.ServeHTTP(w, r) | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func basicAuthFailed(w http.ResponseWriter, realm string) { | ||||
| 	w.Header().Add("WWW-Authenticate", fmt.Sprintf(`Basic realm="%s"`, realm)) | ||||
| 	w.WriteHeader(http.StatusUnauthorized) | ||||
| } | ||||
							
								
								
									
										399
									
								
								vendor/github.com/go-chi/chi/middleware/compress.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										399
									
								
								vendor/github.com/go-chi/chi/middleware/compress.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,399 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"compress/flate" | ||||
| 	"compress/gzip" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| ) | ||||
| 
 | ||||
| var defaultCompressibleContentTypes = []string{ | ||||
| 	"text/html", | ||||
| 	"text/css", | ||||
| 	"text/plain", | ||||
| 	"text/javascript", | ||||
| 	"application/javascript", | ||||
| 	"application/x-javascript", | ||||
| 	"application/json", | ||||
| 	"application/atom+xml", | ||||
| 	"application/rss+xml", | ||||
| 	"image/svg+xml", | ||||
| } | ||||
| 
 | ||||
| // Compress is a middleware that compresses response | ||||
| // body of a given content types to a data format based | ||||
| // on Accept-Encoding request header. It uses a given | ||||
| // compression level. | ||||
| // | ||||
| // NOTE: make sure to set the Content-Type header on your response | ||||
| // otherwise this middleware will not compress the response body. For ex, in | ||||
| // your handler you should set w.Header().Set("Content-Type", http.DetectContentType(yourBody)) | ||||
| // or set it manually. | ||||
| // | ||||
| // Passing a compression level of 5 is sensible value | ||||
| func Compress(level int, types ...string) func(next http.Handler) http.Handler { | ||||
| 	compressor := NewCompressor(level, types...) | ||||
| 	return compressor.Handler | ||||
| } | ||||
| 
 | ||||
| // Compressor represents a set of encoding configurations. | ||||
| type Compressor struct { | ||||
| 	level int // The compression level. | ||||
| 	// The mapping of encoder names to encoder functions. | ||||
| 	encoders map[string]EncoderFunc | ||||
| 	// The mapping of pooled encoders to pools. | ||||
| 	pooledEncoders map[string]*sync.Pool | ||||
| 	// The set of content types allowed to be compressed. | ||||
| 	allowedTypes     map[string]struct{} | ||||
| 	allowedWildcards map[string]struct{} | ||||
| 	// The list of encoders in order of decreasing precedence. | ||||
| 	encodingPrecedence []string | ||||
| } | ||||
| 
 | ||||
| // NewCompressor creates a new Compressor that will handle encoding responses. | ||||
| // | ||||
| // The level should be one of the ones defined in the flate package. | ||||
| // The types are the content types that are allowed to be compressed. | ||||
| func NewCompressor(level int, types ...string) *Compressor { | ||||
| 	// If types are provided, set those as the allowed types. If none are | ||||
| 	// provided, use the default list. | ||||
| 	allowedTypes := make(map[string]struct{}) | ||||
| 	allowedWildcards := make(map[string]struct{}) | ||||
| 	if len(types) > 0 { | ||||
| 		for _, t := range types { | ||||
| 			if strings.Contains(strings.TrimSuffix(t, "/*"), "*") { | ||||
| 				panic(fmt.Sprintf("middleware/compress: Unsupported content-type wildcard pattern '%s'. Only '/*' supported", t)) | ||||
| 			} | ||||
| 			if strings.HasSuffix(t, "/*") { | ||||
| 				allowedWildcards[strings.TrimSuffix(t, "/*")] = struct{}{} | ||||
| 			} else { | ||||
| 				allowedTypes[t] = struct{}{} | ||||
| 			} | ||||
| 		} | ||||
| 	} else { | ||||
| 		for _, t := range defaultCompressibleContentTypes { | ||||
| 			allowedTypes[t] = struct{}{} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	c := &Compressor{ | ||||
| 		level:            level, | ||||
| 		encoders:         make(map[string]EncoderFunc), | ||||
| 		pooledEncoders:   make(map[string]*sync.Pool), | ||||
| 		allowedTypes:     allowedTypes, | ||||
| 		allowedWildcards: allowedWildcards, | ||||
| 	} | ||||
| 
 | ||||
| 	// Set the default encoders.  The precedence order uses the reverse | ||||
| 	// ordering that the encoders were added. This means adding new encoders | ||||
| 	// will move them to the front of the order. | ||||
| 	// | ||||
| 	// TODO: | ||||
| 	// lzma: Opera. | ||||
| 	// sdch: Chrome, Android. Gzip output + dictionary header. | ||||
| 	// br:   Brotli, see https://github.com/go-chi/chi/pull/326 | ||||
| 
 | ||||
| 	// HTTP 1.1 "deflate" (RFC 2616) stands for DEFLATE data (RFC 1951) | ||||
| 	// wrapped with zlib (RFC 1950). The zlib wrapper uses Adler-32 | ||||
| 	// checksum compared to CRC-32 used in "gzip" and thus is faster. | ||||
| 	// | ||||
| 	// But.. some old browsers (MSIE, Safari 5.1) incorrectly expect | ||||
| 	// raw DEFLATE data only, without the mentioned zlib wrapper. | ||||
| 	// Because of this major confusion, most modern browsers try it | ||||
| 	// both ways, first looking for zlib headers. | ||||
| 	// Quote by Mark Adler: http://stackoverflow.com/a/9186091/385548 | ||||
| 	// | ||||
| 	// The list of browsers having problems is quite big, see: | ||||
| 	// http://zoompf.com/blog/2012/02/lose-the-wait-http-compression | ||||
| 	// https://web.archive.org/web/20120321182910/http://www.vervestudios.co/projects/compression-tests/results | ||||
| 	// | ||||
| 	// That's why we prefer gzip over deflate. It's just more reliable | ||||
| 	// and not significantly slower than gzip. | ||||
| 	c.SetEncoder("deflate", encoderDeflate) | ||||
| 
 | ||||
| 	// TODO: Exception for old MSIE browsers that can't handle non-HTML? | ||||
| 	// https://zoompf.com/blog/2012/02/lose-the-wait-http-compression | ||||
| 	c.SetEncoder("gzip", encoderGzip) | ||||
| 
 | ||||
| 	// NOTE: Not implemented, intentionally: | ||||
| 	// case "compress": // LZW. Deprecated. | ||||
| 	// case "bzip2":    // Too slow on-the-fly. | ||||
| 	// case "zopfli":   // Too slow on-the-fly. | ||||
| 	// case "xz":       // Too slow on-the-fly. | ||||
| 	return c | ||||
| } | ||||
| 
 | ||||
| // SetEncoder can be used to set the implementation of a compression algorithm. | ||||
| // | ||||
| // The encoding should be a standardised identifier. See: | ||||
| // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding | ||||
| // | ||||
| // For example, add the Brotli algortithm: | ||||
| // | ||||
| //  import brotli_enc "gopkg.in/kothar/brotli-go.v0/enc" | ||||
| // | ||||
| //  compressor := middleware.NewCompressor(5, "text/html") | ||||
| //  compressor.SetEncoder("br", func(w http.ResponseWriter, level int) io.Writer { | ||||
| //    params := brotli_enc.NewBrotliParams() | ||||
| //    params.SetQuality(level) | ||||
| //    return brotli_enc.NewBrotliWriter(params, w) | ||||
| //  }) | ||||
| func (c *Compressor) SetEncoder(encoding string, fn EncoderFunc) { | ||||
| 	encoding = strings.ToLower(encoding) | ||||
| 	if encoding == "" { | ||||
| 		panic("the encoding can not be empty") | ||||
| 	} | ||||
| 	if fn == nil { | ||||
| 		panic("attempted to set a nil encoder function") | ||||
| 	} | ||||
| 
 | ||||
| 	// If we are adding a new encoder that is already registered, we have to | ||||
| 	// clear that one out first. | ||||
| 	if _, ok := c.pooledEncoders[encoding]; ok { | ||||
| 		delete(c.pooledEncoders, encoding) | ||||
| 	} | ||||
| 	if _, ok := c.encoders[encoding]; ok { | ||||
| 		delete(c.encoders, encoding) | ||||
| 	} | ||||
| 
 | ||||
| 	// If the encoder supports Resetting (IoReseterWriter), then it can be pooled. | ||||
| 	encoder := fn(ioutil.Discard, c.level) | ||||
| 	if encoder != nil { | ||||
| 		if _, ok := encoder.(ioResetterWriter); ok { | ||||
| 			pool := &sync.Pool{ | ||||
| 				New: func() interface{} { | ||||
| 					return fn(ioutil.Discard, c.level) | ||||
| 				}, | ||||
| 			} | ||||
| 			c.pooledEncoders[encoding] = pool | ||||
| 		} | ||||
| 	} | ||||
| 	// If the encoder is not in the pooledEncoders, add it to the normal encoders. | ||||
| 	if _, ok := c.pooledEncoders[encoding]; !ok { | ||||
| 		c.encoders[encoding] = fn | ||||
| 	} | ||||
| 
 | ||||
| 	for i, v := range c.encodingPrecedence { | ||||
| 		if v == encoding { | ||||
| 			c.encodingPrecedence = append(c.encodingPrecedence[:i], c.encodingPrecedence[i+1:]...) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	c.encodingPrecedence = append([]string{encoding}, c.encodingPrecedence...) | ||||
| } | ||||
| 
 | ||||
| // Handler returns a new middleware that will compress the response based on the | ||||
| // current Compressor. | ||||
| func (c *Compressor) Handler(next http.Handler) http.Handler { | ||||
| 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 		encoder, encoding, cleanup := c.selectEncoder(r.Header, w) | ||||
| 
 | ||||
| 		cw := &compressResponseWriter{ | ||||
| 			ResponseWriter:   w, | ||||
| 			w:                w, | ||||
| 			contentTypes:     c.allowedTypes, | ||||
| 			contentWildcards: c.allowedWildcards, | ||||
| 			encoding:         encoding, | ||||
| 			compressable:     false, // determined in post-handler | ||||
| 		} | ||||
| 		if encoder != nil { | ||||
| 			cw.w = encoder | ||||
| 		} | ||||
| 		// Re-add the encoder to the pool if applicable. | ||||
| 		defer cleanup() | ||||
| 		defer cw.Close() | ||||
| 
 | ||||
| 		next.ServeHTTP(cw, r) | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| // selectEncoder returns the encoder, the name of the encoder, and a closer function. | ||||
| func (c *Compressor) selectEncoder(h http.Header, w io.Writer) (io.Writer, string, func()) { | ||||
| 	header := h.Get("Accept-Encoding") | ||||
| 
 | ||||
| 	// Parse the names of all accepted algorithms from the header. | ||||
| 	accepted := strings.Split(strings.ToLower(header), ",") | ||||
| 
 | ||||
| 	// Find supported encoder by accepted list by precedence | ||||
| 	for _, name := range c.encodingPrecedence { | ||||
| 		if matchAcceptEncoding(accepted, name) { | ||||
| 			if pool, ok := c.pooledEncoders[name]; ok { | ||||
| 				encoder := pool.Get().(ioResetterWriter) | ||||
| 				cleanup := func() { | ||||
| 					pool.Put(encoder) | ||||
| 				} | ||||
| 				encoder.Reset(w) | ||||
| 				return encoder, name, cleanup | ||||
| 
 | ||||
| 			} | ||||
| 			if fn, ok := c.encoders[name]; ok { | ||||
| 				return fn(w, c.level), name, func() {} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	// No encoder found to match the accepted encoding | ||||
| 	return nil, "", func() {} | ||||
| } | ||||
| 
 | ||||
| func matchAcceptEncoding(accepted []string, encoding string) bool { | ||||
| 	for _, v := range accepted { | ||||
| 		if strings.Contains(v, encoding) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // An EncoderFunc is a function that wraps the provided io.Writer with a | ||||
| // streaming compression algorithm and returns it. | ||||
| // | ||||
| // In case of failure, the function should return nil. | ||||
| type EncoderFunc func(w io.Writer, level int) io.Writer | ||||
| 
 | ||||
| // Interface for types that allow resetting io.Writers. | ||||
| type ioResetterWriter interface { | ||||
| 	io.Writer | ||||
| 	Reset(w io.Writer) | ||||
| } | ||||
| 
 | ||||
| type compressResponseWriter struct { | ||||
| 	http.ResponseWriter | ||||
| 
 | ||||
| 	// The streaming encoder writer to be used if there is one. Otherwise, | ||||
| 	// this is just the normal writer. | ||||
| 	w                io.Writer | ||||
| 	encoding         string | ||||
| 	contentTypes     map[string]struct{} | ||||
| 	contentWildcards map[string]struct{} | ||||
| 	wroteHeader      bool | ||||
| 	compressable     bool | ||||
| } | ||||
| 
 | ||||
| func (cw *compressResponseWriter) isCompressable() bool { | ||||
| 	// Parse the first part of the Content-Type response header. | ||||
| 	contentType := cw.Header().Get("Content-Type") | ||||
| 	if idx := strings.Index(contentType, ";"); idx >= 0 { | ||||
| 		contentType = contentType[0:idx] | ||||
| 	} | ||||
| 
 | ||||
| 	// Is the content type compressable? | ||||
| 	if _, ok := cw.contentTypes[contentType]; ok { | ||||
| 		return true | ||||
| 	} | ||||
| 	if idx := strings.Index(contentType, "/"); idx > 0 { | ||||
| 		contentType = contentType[0:idx] | ||||
| 		_, ok := cw.contentWildcards[contentType] | ||||
| 		return ok | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| func (cw *compressResponseWriter) WriteHeader(code int) { | ||||
| 	if cw.wroteHeader { | ||||
| 		cw.ResponseWriter.WriteHeader(code) // Allow multiple calls to propagate. | ||||
| 		return | ||||
| 	} | ||||
| 	cw.wroteHeader = true | ||||
| 	defer cw.ResponseWriter.WriteHeader(code) | ||||
| 
 | ||||
| 	// Already compressed data? | ||||
| 	if cw.Header().Get("Content-Encoding") != "" { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if !cw.isCompressable() { | ||||
| 		cw.compressable = false | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if cw.encoding != "" { | ||||
| 		cw.compressable = true | ||||
| 		cw.Header().Set("Content-Encoding", cw.encoding) | ||||
| 		cw.Header().Set("Vary", "Accept-Encoding") | ||||
| 
 | ||||
| 		// The content-length after compression is unknown | ||||
| 		cw.Header().Del("Content-Length") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (cw *compressResponseWriter) Write(p []byte) (int, error) { | ||||
| 	if !cw.wroteHeader { | ||||
| 		cw.WriteHeader(http.StatusOK) | ||||
| 	} | ||||
| 
 | ||||
| 	return cw.writer().Write(p) | ||||
| } | ||||
| 
 | ||||
| func (cw *compressResponseWriter) writer() io.Writer { | ||||
| 	if cw.compressable { | ||||
| 		return cw.w | ||||
| 	} else { | ||||
| 		return cw.ResponseWriter | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| type compressFlusher interface { | ||||
| 	Flush() error | ||||
| } | ||||
| 
 | ||||
| func (cw *compressResponseWriter) Flush() { | ||||
| 	if f, ok := cw.writer().(http.Flusher); ok { | ||||
| 		f.Flush() | ||||
| 	} | ||||
| 	// If the underlying writer has a compression flush signature, | ||||
| 	// call this Flush() method instead | ||||
| 	if f, ok := cw.writer().(compressFlusher); ok { | ||||
| 		f.Flush() | ||||
| 
 | ||||
| 		// Also flush the underlying response writer | ||||
| 		if f, ok := cw.ResponseWriter.(http.Flusher); ok { | ||||
| 			f.Flush() | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (cw *compressResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { | ||||
| 	if hj, ok := cw.writer().(http.Hijacker); ok { | ||||
| 		return hj.Hijack() | ||||
| 	} | ||||
| 	return nil, nil, errors.New("chi/middleware: http.Hijacker is unavailable on the writer") | ||||
| } | ||||
| 
 | ||||
| func (cw *compressResponseWriter) Push(target string, opts *http.PushOptions) error { | ||||
| 	if ps, ok := cw.writer().(http.Pusher); ok { | ||||
| 		return ps.Push(target, opts) | ||||
| 	} | ||||
| 	return errors.New("chi/middleware: http.Pusher is unavailable on the writer") | ||||
| } | ||||
| 
 | ||||
| func (cw *compressResponseWriter) Close() error { | ||||
| 	if c, ok := cw.writer().(io.WriteCloser); ok { | ||||
| 		return c.Close() | ||||
| 	} | ||||
| 	return errors.New("chi/middleware: io.WriteCloser is unavailable on the writer") | ||||
| } | ||||
| 
 | ||||
| func encoderGzip(w io.Writer, level int) io.Writer { | ||||
| 	gw, err := gzip.NewWriterLevel(w, level) | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return gw | ||||
| } | ||||
| 
 | ||||
| func encoderDeflate(w io.Writer, level int) io.Writer { | ||||
| 	dw, err := flate.NewWriter(w, level) | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return dw | ||||
| } | ||||
							
								
								
									
										51
									
								
								vendor/github.com/go-chi/chi/middleware/content_charset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								vendor/github.com/go-chi/chi/middleware/content_charset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // ContentCharset generates a handler that writes a 415 Unsupported Media Type response if none of the charsets match. | ||||
| // An empty charset will allow requests with no Content-Type header or no specified charset. | ||||
| func ContentCharset(charsets ...string) func(next http.Handler) http.Handler { | ||||
| 	for i, c := range charsets { | ||||
| 		charsets[i] = strings.ToLower(c) | ||||
| 	} | ||||
| 
 | ||||
| 	return func(next http.Handler) http.Handler { | ||||
| 		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 			if !contentEncoding(r.Header.Get("Content-Type"), charsets...) { | ||||
| 				w.WriteHeader(http.StatusUnsupportedMediaType) | ||||
| 				return | ||||
| 			} | ||||
| 
 | ||||
| 			next.ServeHTTP(w, r) | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Check the content encoding against a list of acceptable values. | ||||
| func contentEncoding(ce string, charsets ...string) bool { | ||||
| 	_, ce = split(strings.ToLower(ce), ";") | ||||
| 	_, ce = split(ce, "charset=") | ||||
| 	ce, _ = split(ce, ";") | ||||
| 	for _, c := range charsets { | ||||
| 		if ce == c { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // Split a string in two parts, cleaning any whitespace. | ||||
| func split(str, sep string) (string, string) { | ||||
| 	var a, b string | ||||
| 	var parts = strings.SplitN(str, sep, 2) | ||||
| 	a = strings.TrimSpace(parts[0]) | ||||
| 	if len(parts) == 2 { | ||||
| 		b = strings.TrimSpace(parts[1]) | ||||
| 	} | ||||
| 
 | ||||
| 	return a, b | ||||
| } | ||||
							
								
								
									
										34
									
								
								vendor/github.com/go-chi/chi/middleware/content_encoding.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/go-chi/chi/middleware/content_encoding.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // AllowContentEncoding enforces a whitelist of request Content-Encoding otherwise responds | ||||
| // with a 415 Unsupported Media Type status. | ||||
| func AllowContentEncoding(contentEncoding ...string) func(next http.Handler) http.Handler { | ||||
| 	allowedEncodings := make(map[string]struct{}, len(contentEncoding)) | ||||
| 	for _, encoding := range contentEncoding { | ||||
| 		allowedEncodings[strings.TrimSpace(strings.ToLower(encoding))] = struct{}{} | ||||
| 	} | ||||
| 	return func(next http.Handler) http.Handler { | ||||
| 		fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 			requestEncodings := r.Header["Content-Encoding"] | ||||
| 			// skip check for empty content body or no Content-Encoding | ||||
| 			if r.ContentLength == 0 { | ||||
| 				next.ServeHTTP(w, r) | ||||
| 				return | ||||
| 			} | ||||
| 			// All encodings in the request must be allowed | ||||
| 			for _, encoding := range requestEncodings { | ||||
| 				if _, ok := allowedEncodings[strings.TrimSpace(strings.ToLower(encoding))]; !ok { | ||||
| 					w.WriteHeader(http.StatusUnsupportedMediaType) | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
| 			next.ServeHTTP(w, r) | ||||
| 		} | ||||
| 		return http.HandlerFunc(fn) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										51
									
								
								vendor/github.com/go-chi/chi/middleware/content_type.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								vendor/github.com/go-chi/chi/middleware/content_type.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // SetHeader is a convenience handler to set a response header key/value | ||||
| func SetHeader(key, value string) func(next http.Handler) http.Handler { | ||||
| 	return func(next http.Handler) http.Handler { | ||||
| 		fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 			w.Header().Set(key, value) | ||||
| 			next.ServeHTTP(w, r) | ||||
| 		} | ||||
| 		return http.HandlerFunc(fn) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // AllowContentType enforces a whitelist of request Content-Types otherwise responds | ||||
| // with a 415 Unsupported Media Type status. | ||||
| func AllowContentType(contentTypes ...string) func(next http.Handler) http.Handler { | ||||
| 	cT := []string{} | ||||
| 	for _, t := range contentTypes { | ||||
| 		cT = append(cT, strings.ToLower(t)) | ||||
| 	} | ||||
| 
 | ||||
| 	return func(next http.Handler) http.Handler { | ||||
| 		fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 			if r.ContentLength == 0 { | ||||
| 				// skip check for empty content body | ||||
| 				next.ServeHTTP(w, r) | ||||
| 				return | ||||
| 			} | ||||
| 
 | ||||
| 			s := strings.ToLower(strings.TrimSpace(r.Header.Get("Content-Type"))) | ||||
| 			if i := strings.Index(s, ";"); i > -1 { | ||||
| 				s = s[0:i] | ||||
| 			} | ||||
| 
 | ||||
| 			for _, t := range cT { | ||||
| 				if t == s { | ||||
| 					next.ServeHTTP(w, r) | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			w.WriteHeader(http.StatusUnsupportedMediaType) | ||||
| 		} | ||||
| 		return http.HandlerFunc(fn) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										39
									
								
								vendor/github.com/go-chi/chi/middleware/get_head.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/go-chi/chi/middleware/get_head.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 
 | ||||
| 	"github.com/go-chi/chi" | ||||
| ) | ||||
| 
 | ||||
| // GetHead automatically route undefined HEAD requests to GET handlers. | ||||
| func GetHead(next http.Handler) http.Handler { | ||||
| 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 		if r.Method == "HEAD" { | ||||
| 			rctx := chi.RouteContext(r.Context()) | ||||
| 			routePath := rctx.RoutePath | ||||
| 			if routePath == "" { | ||||
| 				if r.URL.RawPath != "" { | ||||
| 					routePath = r.URL.RawPath | ||||
| 				} else { | ||||
| 					routePath = r.URL.Path | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			// Temporary routing context to look-ahead before routing the request | ||||
| 			tctx := chi.NewRouteContext() | ||||
| 
 | ||||
| 			// Attempt to find a HEAD handler for the routing path, if not found, traverse | ||||
| 			// the router as through its a GET route, but proceed with the request | ||||
| 			// with the HEAD method. | ||||
| 			if !rctx.Routes.Match(tctx, "HEAD", routePath) { | ||||
| 				rctx.RouteMethod = "GET" | ||||
| 				rctx.RoutePath = routePath | ||||
| 				next.ServeHTTP(w, r) | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		next.ServeHTTP(w, r) | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										26
									
								
								vendor/github.com/go-chi/chi/middleware/heartbeat.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/go-chi/chi/middleware/heartbeat.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // Heartbeat endpoint middleware useful to setting up a path like | ||||
| // `/ping` that load balancers or uptime testing external services | ||||
| // can make a request before hitting any routes. It's also convenient | ||||
| // to place this above ACL middlewares as well. | ||||
| func Heartbeat(endpoint string) func(http.Handler) http.Handler { | ||||
| 	f := func(h http.Handler) http.Handler { | ||||
| 		fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 			if r.Method == "GET" && strings.EqualFold(r.URL.Path, endpoint) { | ||||
| 				w.Header().Set("Content-Type", "text/plain") | ||||
| 				w.WriteHeader(http.StatusOK) | ||||
| 				w.Write([]byte(".")) | ||||
| 				return | ||||
| 			} | ||||
| 			h.ServeHTTP(w, r) | ||||
| 		} | ||||
| 		return http.HandlerFunc(fn) | ||||
| 	} | ||||
| 	return f | ||||
| } | ||||
							
								
								
									
										155
									
								
								vendor/github.com/go-chi/chi/middleware/logger.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								vendor/github.com/go-chi/chi/middleware/logger.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,155 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"context" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	// LogEntryCtxKey is the context.Context key to store the request log entry. | ||||
| 	LogEntryCtxKey = &contextKey{"LogEntry"} | ||||
| 
 | ||||
| 	// DefaultLogger is called by the Logger middleware handler to log each request. | ||||
| 	// Its made a package-level variable so that it can be reconfigured for custom | ||||
| 	// logging configurations. | ||||
| 	DefaultLogger = RequestLogger(&DefaultLogFormatter{Logger: log.New(os.Stdout, "", log.LstdFlags), NoColor: false}) | ||||
| ) | ||||
| 
 | ||||
| // Logger is a middleware that logs the start and end of each request, along | ||||
| // with some useful data about what was requested, what the response status was, | ||||
| // and how long it took to return. When standard output is a TTY, Logger will | ||||
| // print in color, otherwise it will print in black and white. Logger prints a | ||||
| // request ID if one is provided. | ||||
| // | ||||
| // Alternatively, look at https://github.com/goware/httplog for a more in-depth | ||||
| // http logger with structured logging support. | ||||
| func Logger(next http.Handler) http.Handler { | ||||
| 	return DefaultLogger(next) | ||||
| } | ||||
| 
 | ||||
| // RequestLogger returns a logger handler using a custom LogFormatter. | ||||
| func RequestLogger(f LogFormatter) func(next http.Handler) http.Handler { | ||||
| 	return func(next http.Handler) http.Handler { | ||||
| 		fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 			entry := f.NewLogEntry(r) | ||||
| 			ww := NewWrapResponseWriter(w, r.ProtoMajor) | ||||
| 
 | ||||
| 			t1 := time.Now() | ||||
| 			defer func() { | ||||
| 				entry.Write(ww.Status(), ww.BytesWritten(), ww.Header(), time.Since(t1), nil) | ||||
| 			}() | ||||
| 
 | ||||
| 			next.ServeHTTP(ww, WithLogEntry(r, entry)) | ||||
| 		} | ||||
| 		return http.HandlerFunc(fn) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // LogFormatter initiates the beginning of a new LogEntry per request. | ||||
| // See DefaultLogFormatter for an example implementation. | ||||
| type LogFormatter interface { | ||||
| 	NewLogEntry(r *http.Request) LogEntry | ||||
| } | ||||
| 
 | ||||
| // LogEntry records the final log when a request completes. | ||||
| // See defaultLogEntry for an example implementation. | ||||
| type LogEntry interface { | ||||
| 	Write(status, bytes int, header http.Header, elapsed time.Duration, extra interface{}) | ||||
| 	Panic(v interface{}, stack []byte) | ||||
| } | ||||
| 
 | ||||
| // GetLogEntry returns the in-context LogEntry for a request. | ||||
| func GetLogEntry(r *http.Request) LogEntry { | ||||
| 	entry, _ := r.Context().Value(LogEntryCtxKey).(LogEntry) | ||||
| 	return entry | ||||
| } | ||||
| 
 | ||||
| // WithLogEntry sets the in-context LogEntry for a request. | ||||
| func WithLogEntry(r *http.Request, entry LogEntry) *http.Request { | ||||
| 	r = r.WithContext(context.WithValue(r.Context(), LogEntryCtxKey, entry)) | ||||
| 	return r | ||||
| } | ||||
| 
 | ||||
| // LoggerInterface accepts printing to stdlib logger or compatible logger. | ||||
| type LoggerInterface interface { | ||||
| 	Print(v ...interface{}) | ||||
| } | ||||
| 
 | ||||
| // DefaultLogFormatter is a simple logger that implements a LogFormatter. | ||||
| type DefaultLogFormatter struct { | ||||
| 	Logger  LoggerInterface | ||||
| 	NoColor bool | ||||
| } | ||||
| 
 | ||||
| // NewLogEntry creates a new LogEntry for the request. | ||||
| func (l *DefaultLogFormatter) NewLogEntry(r *http.Request) LogEntry { | ||||
| 	useColor := !l.NoColor | ||||
| 	entry := &defaultLogEntry{ | ||||
| 		DefaultLogFormatter: l, | ||||
| 		request:             r, | ||||
| 		buf:                 &bytes.Buffer{}, | ||||
| 		useColor:            useColor, | ||||
| 	} | ||||
| 
 | ||||
| 	reqID := GetReqID(r.Context()) | ||||
| 	if reqID != "" { | ||||
| 		cW(entry.buf, useColor, nYellow, "[%s] ", reqID) | ||||
| 	} | ||||
| 	cW(entry.buf, useColor, nCyan, "\"") | ||||
| 	cW(entry.buf, useColor, bMagenta, "%s ", r.Method) | ||||
| 
 | ||||
| 	scheme := "http" | ||||
| 	if r.TLS != nil { | ||||
| 		scheme = "https" | ||||
| 	} | ||||
| 	cW(entry.buf, useColor, nCyan, "%s://%s%s %s\" ", scheme, r.Host, r.RequestURI, r.Proto) | ||||
| 
 | ||||
| 	entry.buf.WriteString("from ") | ||||
| 	entry.buf.WriteString(r.RemoteAddr) | ||||
| 	entry.buf.WriteString(" - ") | ||||
| 
 | ||||
| 	return entry | ||||
| } | ||||
| 
 | ||||
| type defaultLogEntry struct { | ||||
| 	*DefaultLogFormatter | ||||
| 	request  *http.Request | ||||
| 	buf      *bytes.Buffer | ||||
| 	useColor bool | ||||
| } | ||||
| 
 | ||||
| func (l *defaultLogEntry) Write(status, bytes int, header http.Header, elapsed time.Duration, extra interface{}) { | ||||
| 	switch { | ||||
| 	case status < 200: | ||||
| 		cW(l.buf, l.useColor, bBlue, "%03d", status) | ||||
| 	case status < 300: | ||||
| 		cW(l.buf, l.useColor, bGreen, "%03d", status) | ||||
| 	case status < 400: | ||||
| 		cW(l.buf, l.useColor, bCyan, "%03d", status) | ||||
| 	case status < 500: | ||||
| 		cW(l.buf, l.useColor, bYellow, "%03d", status) | ||||
| 	default: | ||||
| 		cW(l.buf, l.useColor, bRed, "%03d", status) | ||||
| 	} | ||||
| 
 | ||||
| 	cW(l.buf, l.useColor, bBlue, " %dB", bytes) | ||||
| 
 | ||||
| 	l.buf.WriteString(" in ") | ||||
| 	if elapsed < 500*time.Millisecond { | ||||
| 		cW(l.buf, l.useColor, nGreen, "%s", elapsed) | ||||
| 	} else if elapsed < 5*time.Second { | ||||
| 		cW(l.buf, l.useColor, nYellow, "%s", elapsed) | ||||
| 	} else { | ||||
| 		cW(l.buf, l.useColor, nRed, "%s", elapsed) | ||||
| 	} | ||||
| 
 | ||||
| 	l.Logger.Print(l.buf.String()) | ||||
| } | ||||
| 
 | ||||
| func (l *defaultLogEntry) Panic(v interface{}, stack []byte) { | ||||
| 	PrintPrettyStack(v) | ||||
| } | ||||
							
								
								
									
										23
									
								
								vendor/github.com/go-chi/chi/middleware/middleware.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/go-chi/chi/middleware/middleware.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import "net/http" | ||||
| 
 | ||||
| // New will create a new middleware handler from a http.Handler. | ||||
| func New(h http.Handler) func(next http.Handler) http.Handler { | ||||
| 	return func(next http.Handler) http.Handler { | ||||
| 		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 			h.ServeHTTP(w, r) | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // contextKey is a value for use with context.WithValue. It's used as | ||||
| // a pointer so it fits in an interface{} without allocation. This technique | ||||
| // for defining context keys was copied from Go 1.7's new use of context in net/http. | ||||
| type contextKey struct { | ||||
| 	name string | ||||
| } | ||||
| 
 | ||||
| func (k *contextKey) String() string { | ||||
| 	return "chi/middleware context value " + k.name | ||||
| } | ||||
							
								
								
									
										58
									
								
								vendor/github.com/go-chi/chi/middleware/nocache.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								vendor/github.com/go-chi/chi/middleware/nocache.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | ||||
| package middleware | ||||
| 
 | ||||
| // Ported from Goji's middleware, source: | ||||
| // https://github.com/zenazn/goji/tree/master/web/middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // Unix epoch time | ||||
| var epoch = time.Unix(0, 0).Format(time.RFC1123) | ||||
| 
 | ||||
| // Taken from https://github.com/mytrile/nocache | ||||
| var noCacheHeaders = map[string]string{ | ||||
| 	"Expires":         epoch, | ||||
| 	"Cache-Control":   "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", | ||||
| 	"Pragma":          "no-cache", | ||||
| 	"X-Accel-Expires": "0", | ||||
| } | ||||
| 
 | ||||
| var etagHeaders = []string{ | ||||
| 	"ETag", | ||||
| 	"If-Modified-Since", | ||||
| 	"If-Match", | ||||
| 	"If-None-Match", | ||||
| 	"If-Range", | ||||
| 	"If-Unmodified-Since", | ||||
| } | ||||
| 
 | ||||
| // NoCache is a simple piece of middleware that sets a number of HTTP headers to prevent | ||||
| // a router (or subrouter) from being cached by an upstream proxy and/or client. | ||||
| // | ||||
| // As per http://wiki.nginx.org/HttpProxyModule - NoCache sets: | ||||
| //      Expires: Thu, 01 Jan 1970 00:00:00 UTC | ||||
| //      Cache-Control: no-cache, private, max-age=0 | ||||
| //      X-Accel-Expires: 0 | ||||
| //      Pragma: no-cache (for HTTP/1.0 proxies/clients) | ||||
| func NoCache(h http.Handler) http.Handler { | ||||
| 	fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 
 | ||||
| 		// Delete any ETag headers that may have been set | ||||
| 		for _, v := range etagHeaders { | ||||
| 			if r.Header.Get(v) != "" { | ||||
| 				r.Header.Del(v) | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// Set our NoCache headers | ||||
| 		for k, v := range noCacheHeaders { | ||||
| 			w.Header().Set(k, v) | ||||
| 		} | ||||
| 
 | ||||
| 		h.ServeHTTP(w, r) | ||||
| 	} | ||||
| 
 | ||||
| 	return http.HandlerFunc(fn) | ||||
| } | ||||
							
								
								
									
										55
									
								
								vendor/github.com/go-chi/chi/middleware/profiler.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								vendor/github.com/go-chi/chi/middleware/profiler.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"expvar" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"net/http/pprof" | ||||
| 
 | ||||
| 	"github.com/go-chi/chi" | ||||
| ) | ||||
| 
 | ||||
| // Profiler is a convenient subrouter used for mounting net/http/pprof. ie. | ||||
| // | ||||
| //  func MyService() http.Handler { | ||||
| //    r := chi.NewRouter() | ||||
| //    // ..middlewares | ||||
| //    r.Mount("/debug", middleware.Profiler()) | ||||
| //    // ..routes | ||||
| //    return r | ||||
| //  } | ||||
| func Profiler() http.Handler { | ||||
| 	r := chi.NewRouter() | ||||
| 	r.Use(NoCache) | ||||
| 
 | ||||
| 	r.Get("/", func(w http.ResponseWriter, r *http.Request) { | ||||
| 		http.Redirect(w, r, r.RequestURI+"/pprof/", 301) | ||||
| 	}) | ||||
| 	r.HandleFunc("/pprof", func(w http.ResponseWriter, r *http.Request) { | ||||
| 		http.Redirect(w, r, r.RequestURI+"/", 301) | ||||
| 	}) | ||||
| 
 | ||||
| 	r.HandleFunc("/pprof/*", pprof.Index) | ||||
| 	r.HandleFunc("/pprof/cmdline", pprof.Cmdline) | ||||
| 	r.HandleFunc("/pprof/profile", pprof.Profile) | ||||
| 	r.HandleFunc("/pprof/symbol", pprof.Symbol) | ||||
| 	r.HandleFunc("/pprof/trace", pprof.Trace) | ||||
| 	r.HandleFunc("/vars", expVars) | ||||
| 
 | ||||
| 	return r | ||||
| } | ||||
| 
 | ||||
| // Replicated from expvar.go as not public. | ||||
| func expVars(w http.ResponseWriter, r *http.Request) { | ||||
| 	first := true | ||||
| 	w.Header().Set("Content-Type", "application/json") | ||||
| 	fmt.Fprintf(w, "{\n") | ||||
| 	expvar.Do(func(kv expvar.KeyValue) { | ||||
| 		if !first { | ||||
| 			fmt.Fprintf(w, ",\n") | ||||
| 		} | ||||
| 		first = false | ||||
| 		fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value) | ||||
| 	}) | ||||
| 	fmt.Fprintf(w, "\n}\n") | ||||
| } | ||||
							
								
								
									
										54
									
								
								vendor/github.com/go-chi/chi/middleware/realip.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								vendor/github.com/go-chi/chi/middleware/realip.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| package middleware | ||||
| 
 | ||||
| // Ported from Goji's middleware, source: | ||||
| // https://github.com/zenazn/goji/tree/master/web/middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| var xForwardedFor = http.CanonicalHeaderKey("X-Forwarded-For") | ||||
| var xRealIP = http.CanonicalHeaderKey("X-Real-IP") | ||||
| 
 | ||||
| // RealIP is a middleware that sets a http.Request's RemoteAddr to the results | ||||
| // of parsing either the X-Forwarded-For header or the X-Real-IP header (in that | ||||
| // order). | ||||
| // | ||||
| // This middleware should be inserted fairly early in the middleware stack to | ||||
| // ensure that subsequent layers (e.g., request loggers) which examine the | ||||
| // RemoteAddr will see the intended value. | ||||
| // | ||||
| // You should only use this middleware if you can trust the headers passed to | ||||
| // you (in particular, the two headers this middleware uses), for example | ||||
| // because you have placed a reverse proxy like HAProxy or nginx in front of | ||||
| // chi. If your reverse proxies are configured to pass along arbitrary header | ||||
| // values from the client, or if you use this middleware without a reverse | ||||
| // proxy, malicious clients will be able to make you very sad (or, depending on | ||||
| // how you're using RemoteAddr, vulnerable to an attack of some sort). | ||||
| func RealIP(h http.Handler) http.Handler { | ||||
| 	fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 		if rip := realIP(r); rip != "" { | ||||
| 			r.RemoteAddr = rip | ||||
| 		} | ||||
| 		h.ServeHTTP(w, r) | ||||
| 	} | ||||
| 
 | ||||
| 	return http.HandlerFunc(fn) | ||||
| } | ||||
| 
 | ||||
| func realIP(r *http.Request) string { | ||||
| 	var ip string | ||||
| 
 | ||||
| 	if xrip := r.Header.Get(xRealIP); xrip != "" { | ||||
| 		ip = xrip | ||||
| 	} else if xff := r.Header.Get(xForwardedFor); xff != "" { | ||||
| 		i := strings.Index(xff, ", ") | ||||
| 		if i == -1 { | ||||
| 			i = len(xff) | ||||
| 		} | ||||
| 		ip = xff[:i] | ||||
| 	} | ||||
| 
 | ||||
| 	return ip | ||||
| } | ||||
							
								
								
									
										192
									
								
								vendor/github.com/go-chi/chi/middleware/recoverer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								vendor/github.com/go-chi/chi/middleware/recoverer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,192 @@ | ||||
| package middleware | ||||
| 
 | ||||
| // The original work was derived from Goji's middleware, source: | ||||
| // https://github.com/zenazn/goji/tree/master/web/middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"runtime/debug" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // Recoverer is a middleware that recovers from panics, logs the panic (and a | ||||
| // backtrace), and returns a HTTP 500 (Internal Server Error) status if | ||||
| // possible. Recoverer prints a request ID if one is provided. | ||||
| // | ||||
| // Alternatively, look at https://github.com/pressly/lg middleware pkgs. | ||||
| func Recoverer(next http.Handler) http.Handler { | ||||
| 	fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 		defer func() { | ||||
| 			if rvr := recover(); rvr != nil && rvr != http.ErrAbortHandler { | ||||
| 
 | ||||
| 				logEntry := GetLogEntry(r) | ||||
| 				if logEntry != nil { | ||||
| 					logEntry.Panic(rvr, debug.Stack()) | ||||
| 				} else { | ||||
| 					PrintPrettyStack(rvr) | ||||
| 				} | ||||
| 
 | ||||
| 				w.WriteHeader(http.StatusInternalServerError) | ||||
| 			} | ||||
| 		}() | ||||
| 
 | ||||
| 		next.ServeHTTP(w, r) | ||||
| 	} | ||||
| 
 | ||||
| 	return http.HandlerFunc(fn) | ||||
| } | ||||
| 
 | ||||
| func PrintPrettyStack(rvr interface{}) { | ||||
| 	debugStack := debug.Stack() | ||||
| 	s := prettyStack{} | ||||
| 	out, err := s.parse(debugStack, rvr) | ||||
| 	if err == nil { | ||||
| 		os.Stderr.Write(out) | ||||
| 	} else { | ||||
| 		// print stdlib output as a fallback | ||||
| 		os.Stderr.Write(debugStack) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| type prettyStack struct { | ||||
| } | ||||
| 
 | ||||
| func (s prettyStack) parse(debugStack []byte, rvr interface{}) ([]byte, error) { | ||||
| 	var err error | ||||
| 	useColor := true | ||||
| 	buf := &bytes.Buffer{} | ||||
| 
 | ||||
| 	cW(buf, false, bRed, "\n") | ||||
| 	cW(buf, useColor, bCyan, " panic: ") | ||||
| 	cW(buf, useColor, bBlue, "%v", rvr) | ||||
| 	cW(buf, false, bWhite, "\n \n") | ||||
| 
 | ||||
| 	// process debug stack info | ||||
| 	stack := strings.Split(string(debugStack), "\n") | ||||
| 	lines := []string{} | ||||
| 
 | ||||
| 	// locate panic line, as we may have nested panics | ||||
| 	for i := len(stack) - 1; i > 0; i-- { | ||||
| 		lines = append(lines, stack[i]) | ||||
| 		if strings.HasPrefix(stack[i], "panic(0x") { | ||||
| 			lines = lines[0 : len(lines)-2] // remove boilerplate | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// reverse | ||||
| 	for i := len(lines)/2 - 1; i >= 0; i-- { | ||||
| 		opp := len(lines) - 1 - i | ||||
| 		lines[i], lines[opp] = lines[opp], lines[i] | ||||
| 	} | ||||
| 
 | ||||
| 	// decorate | ||||
| 	for i, line := range lines { | ||||
| 		lines[i], err = s.decorateLine(line, useColor, i) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for _, l := range lines { | ||||
| 		fmt.Fprintf(buf, "%s", l) | ||||
| 	} | ||||
| 	return buf.Bytes(), nil | ||||
| } | ||||
| 
 | ||||
| func (s prettyStack) decorateLine(line string, useColor bool, num int) (string, error) { | ||||
| 	line = strings.TrimSpace(line) | ||||
| 	if strings.HasPrefix(line, "\t") || strings.Contains(line, ".go:") { | ||||
| 		return s.decorateSourceLine(line, useColor, num) | ||||
| 	} else if strings.HasSuffix(line, ")") { | ||||
| 		return s.decorateFuncCallLine(line, useColor, num) | ||||
| 	} else { | ||||
| 		if strings.HasPrefix(line, "\t") { | ||||
| 			return strings.Replace(line, "\t", "      ", 1), nil | ||||
| 		} else { | ||||
| 			return fmt.Sprintf("    %s\n", line), nil | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (s prettyStack) decorateFuncCallLine(line string, useColor bool, num int) (string, error) { | ||||
| 	idx := strings.LastIndex(line, "(") | ||||
| 	if idx < 0 { | ||||
| 		return "", errors.New("not a func call line") | ||||
| 	} | ||||
| 
 | ||||
| 	buf := &bytes.Buffer{} | ||||
| 	pkg := line[0:idx] | ||||
| 	// addr := line[idx:] | ||||
| 	method := "" | ||||
| 
 | ||||
| 	idx = strings.LastIndex(pkg, string(os.PathSeparator)) | ||||
| 	if idx < 0 { | ||||
| 		idx = strings.Index(pkg, ".") | ||||
| 		method = pkg[idx:] | ||||
| 		pkg = pkg[0:idx] | ||||
| 	} else { | ||||
| 		method = pkg[idx+1:] | ||||
| 		pkg = pkg[0 : idx+1] | ||||
| 		idx = strings.Index(method, ".") | ||||
| 		pkg += method[0:idx] | ||||
| 		method = method[idx:] | ||||
| 	} | ||||
| 	pkgColor := nYellow | ||||
| 	methodColor := bGreen | ||||
| 
 | ||||
| 	if num == 0 { | ||||
| 		cW(buf, useColor, bRed, " -> ") | ||||
| 		pkgColor = bMagenta | ||||
| 		methodColor = bRed | ||||
| 	} else { | ||||
| 		cW(buf, useColor, bWhite, "    ") | ||||
| 	} | ||||
| 	cW(buf, useColor, pkgColor, "%s", pkg) | ||||
| 	cW(buf, useColor, methodColor, "%s\n", method) | ||||
| 	// cW(buf, useColor, nBlack, "%s", addr) | ||||
| 	return buf.String(), nil | ||||
| } | ||||
| 
 | ||||
| func (s prettyStack) decorateSourceLine(line string, useColor bool, num int) (string, error) { | ||||
| 	idx := strings.LastIndex(line, ".go:") | ||||
| 	if idx < 0 { | ||||
| 		return "", errors.New("not a source line") | ||||
| 	} | ||||
| 
 | ||||
| 	buf := &bytes.Buffer{} | ||||
| 	path := line[0 : idx+3] | ||||
| 	lineno := line[idx+3:] | ||||
| 
 | ||||
| 	idx = strings.LastIndex(path, string(os.PathSeparator)) | ||||
| 	dir := path[0 : idx+1] | ||||
| 	file := path[idx+1:] | ||||
| 
 | ||||
| 	idx = strings.Index(lineno, " ") | ||||
| 	if idx > 0 { | ||||
| 		lineno = lineno[0:idx] | ||||
| 	} | ||||
| 	fileColor := bCyan | ||||
| 	lineColor := bGreen | ||||
| 
 | ||||
| 	if num == 1 { | ||||
| 		cW(buf, useColor, bRed, " ->   ") | ||||
| 		fileColor = bRed | ||||
| 		lineColor = bMagenta | ||||
| 	} else { | ||||
| 		cW(buf, false, bWhite, "      ") | ||||
| 	} | ||||
| 	cW(buf, useColor, bWhite, "%s", dir) | ||||
| 	cW(buf, useColor, fileColor, "%s", file) | ||||
| 	cW(buf, useColor, lineColor, "%s", lineno) | ||||
| 	if num == 1 { | ||||
| 		cW(buf, false, bWhite, "\n") | ||||
| 	} | ||||
| 	cW(buf, false, bWhite, "\n") | ||||
| 
 | ||||
| 	return buf.String(), nil | ||||
| } | ||||
							
								
								
									
										96
									
								
								vendor/github.com/go-chi/chi/middleware/request_id.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								vendor/github.com/go-chi/chi/middleware/request_id.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,96 @@ | ||||
| package middleware | ||||
| 
 | ||||
| // Ported from Goji's middleware, source: | ||||
| // https://github.com/zenazn/goji/tree/master/web/middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"crypto/rand" | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| 	"sync/atomic" | ||||
| ) | ||||
| 
 | ||||
| // Key to use when setting the request ID. | ||||
| type ctxKeyRequestID int | ||||
| 
 | ||||
| // RequestIDKey is the key that holds the unique request ID in a request context. | ||||
| const RequestIDKey ctxKeyRequestID = 0 | ||||
| 
 | ||||
| // RequestIDHeader is the name of the HTTP Header which contains the request id. | ||||
| // Exported so that it can be changed by developers | ||||
| var RequestIDHeader = "X-Request-Id" | ||||
| 
 | ||||
| var prefix string | ||||
| var reqid uint64 | ||||
| 
 | ||||
| // A quick note on the statistics here: we're trying to calculate the chance that | ||||
| // two randomly generated base62 prefixes will collide. We use the formula from | ||||
| // http://en.wikipedia.org/wiki/Birthday_problem | ||||
| // | ||||
| // P[m, n] \approx 1 - e^{-m^2/2n} | ||||
| // | ||||
| // We ballpark an upper bound for $m$ by imagining (for whatever reason) a server | ||||
| // that restarts every second over 10 years, for $m = 86400 * 365 * 10 = 315360000$ | ||||
| // | ||||
| // For a $k$ character base-62 identifier, we have $n(k) = 62^k$ | ||||
| // | ||||
| // Plugging this in, we find $P[m, n(10)] \approx 5.75%$, which is good enough for | ||||
| // our purposes, and is surely more than anyone would ever need in practice -- a | ||||
| // process that is rebooted a handful of times a day for a hundred years has less | ||||
| // than a millionth of a percent chance of generating two colliding IDs. | ||||
| 
 | ||||
| func init() { | ||||
| 	hostname, err := os.Hostname() | ||||
| 	if hostname == "" || err != nil { | ||||
| 		hostname = "localhost" | ||||
| 	} | ||||
| 	var buf [12]byte | ||||
| 	var b64 string | ||||
| 	for len(b64) < 10 { | ||||
| 		rand.Read(buf[:]) | ||||
| 		b64 = base64.StdEncoding.EncodeToString(buf[:]) | ||||
| 		b64 = strings.NewReplacer("+", "", "/", "").Replace(b64) | ||||
| 	} | ||||
| 
 | ||||
| 	prefix = fmt.Sprintf("%s/%s", hostname, b64[0:10]) | ||||
| } | ||||
| 
 | ||||
| // RequestID is a middleware that injects a request ID into the context of each | ||||
| // request. A request ID is a string of the form "host.example.com/random-0001", | ||||
| // where "random" is a base62 random string that uniquely identifies this go | ||||
| // process, and where the last number is an atomically incremented request | ||||
| // counter. | ||||
| func RequestID(next http.Handler) http.Handler { | ||||
| 	fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 		ctx := r.Context() | ||||
| 		requestID := r.Header.Get(RequestIDHeader) | ||||
| 		if requestID == "" { | ||||
| 			myid := atomic.AddUint64(&reqid, 1) | ||||
| 			requestID = fmt.Sprintf("%s-%06d", prefix, myid) | ||||
| 		} | ||||
| 		ctx = context.WithValue(ctx, RequestIDKey, requestID) | ||||
| 		next.ServeHTTP(w, r.WithContext(ctx)) | ||||
| 	} | ||||
| 	return http.HandlerFunc(fn) | ||||
| } | ||||
| 
 | ||||
| // GetReqID returns a request ID from the given context if one is present. | ||||
| // Returns the empty string if a request ID cannot be found. | ||||
| func GetReqID(ctx context.Context) string { | ||||
| 	if ctx == nil { | ||||
| 		return "" | ||||
| 	} | ||||
| 	if reqID, ok := ctx.Value(RequestIDKey).(string); ok { | ||||
| 		return reqID | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
| 
 | ||||
| // NextRequestID generates the next request ID in the sequence. | ||||
| func NextRequestID() uint64 { | ||||
| 	return atomic.AddUint64(&reqid, 1) | ||||
| } | ||||
							
								
								
									
										160
									
								
								vendor/github.com/go-chi/chi/middleware/route_headers.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								vendor/github.com/go-chi/chi/middleware/route_headers.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,160 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // RouteHeaders is a neat little header-based router that allows you to direct | ||||
| // the flow of a request through a middleware stack based on a request header. | ||||
| // | ||||
| // For example, lets say you'd like to setup multiple routers depending on the | ||||
| // request Host header, you could then do something as so: | ||||
| // | ||||
| // r := chi.NewRouter() | ||||
| // rSubdomain := chi.NewRouter() | ||||
| // | ||||
| // r.Use(middleware.RouteHeaders(). | ||||
| //   Route("Host", "example.com", middleware.New(r)). | ||||
| //   Route("Host", "*.example.com", middleware.New(rSubdomain)). | ||||
| //   Handler) | ||||
| // | ||||
| // r.Get("/", h) | ||||
| // rSubdomain.Get("/", h2) | ||||
| // | ||||
| // | ||||
| // Another example, imagine you want to setup multiple CORS handlers, where for | ||||
| // your origin servers you allow authorized requests, but for third-party public | ||||
| // requests, authorization is disabled. | ||||
| // | ||||
| // r := chi.NewRouter() | ||||
| // | ||||
| // r.Use(middleware.RouteHeaders(). | ||||
| //   Route("Origin", "https://app.skyweaver.net", cors.Handler(cors.Options{ | ||||
| // 	   AllowedOrigins:   []string{"https://api.skyweaver.net"}, | ||||
| // 	   AllowedMethods:   []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, | ||||
| // 	   AllowedHeaders:   []string{"Accept", "Authorization", "Content-Type"}, | ||||
| // 	   AllowCredentials: true, // <----------<<< allow credentials | ||||
| //   })). | ||||
| //   Route("Origin", "*", cors.Handler(cors.Options{ | ||||
| // 	   AllowedOrigins:   []string{"*"}, | ||||
| // 	   AllowedMethods:   []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, | ||||
| // 	   AllowedHeaders:   []string{"Accept", "Content-Type"}, | ||||
| // 	   AllowCredentials: false, // <----------<<< do not allow credentials | ||||
| //   })). | ||||
| //   Handler) | ||||
| // | ||||
| func RouteHeaders() HeaderRouter { | ||||
| 	return HeaderRouter{} | ||||
| } | ||||
| 
 | ||||
| type HeaderRouter map[string][]HeaderRoute | ||||
| 
 | ||||
| func (hr HeaderRouter) Route(header string, match string, middlewareHandler func(next http.Handler) http.Handler) HeaderRouter { | ||||
| 	header = strings.ToLower(header) | ||||
| 	k := hr[header] | ||||
| 	if k == nil { | ||||
| 		hr[header] = []HeaderRoute{} | ||||
| 	} | ||||
| 	hr[header] = append(hr[header], HeaderRoute{MatchOne: NewPattern(match), Middleware: middlewareHandler}) | ||||
| 	return hr | ||||
| } | ||||
| 
 | ||||
| func (hr HeaderRouter) RouteAny(header string, match []string, middlewareHandler func(next http.Handler) http.Handler) HeaderRouter { | ||||
| 	header = strings.ToLower(header) | ||||
| 	k := hr[header] | ||||
| 	if k == nil { | ||||
| 		hr[header] = []HeaderRoute{} | ||||
| 	} | ||||
| 	patterns := []Pattern{} | ||||
| 	for _, m := range match { | ||||
| 		patterns = append(patterns, NewPattern(m)) | ||||
| 	} | ||||
| 	hr[header] = append(hr[header], HeaderRoute{MatchAny: patterns, Middleware: middlewareHandler}) | ||||
| 	return hr | ||||
| } | ||||
| 
 | ||||
| func (hr HeaderRouter) RouteDefault(handler func(next http.Handler) http.Handler) HeaderRouter { | ||||
| 	hr["*"] = []HeaderRoute{{Middleware: handler}} | ||||
| 	return hr | ||||
| } | ||||
| 
 | ||||
| func (hr HeaderRouter) Handler(next http.Handler) http.Handler { | ||||
| 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 		if len(hr) == 0 { | ||||
| 			// skip if no routes set | ||||
| 			next.ServeHTTP(w, r) | ||||
| 		} | ||||
| 
 | ||||
| 		// find first matching header route, and continue | ||||
| 		for header, matchers := range hr { | ||||
| 			headerValue := r.Header.Get(header) | ||||
| 			if headerValue == "" { | ||||
| 				continue | ||||
| 			} | ||||
| 			headerValue = strings.ToLower(headerValue) | ||||
| 			for _, matcher := range matchers { | ||||
| 				if matcher.IsMatch(headerValue) { | ||||
| 					matcher.Middleware(next).ServeHTTP(w, r) | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// if no match, check for "*" default route | ||||
| 		matcher, ok := hr["*"] | ||||
| 		if !ok || matcher[0].Middleware == nil { | ||||
| 			next.ServeHTTP(w, r) | ||||
| 			return | ||||
| 		} | ||||
| 		matcher[0].Middleware(next).ServeHTTP(w, r) | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| type HeaderRoute struct { | ||||
| 	MatchAny   []Pattern | ||||
| 	MatchOne   Pattern | ||||
| 	Middleware func(next http.Handler) http.Handler | ||||
| } | ||||
| 
 | ||||
| func (r HeaderRoute) IsMatch(value string) bool { | ||||
| 	if len(r.MatchAny) > 0 { | ||||
| 		for _, m := range r.MatchAny { | ||||
| 			if m.Match(value) { | ||||
| 				return true | ||||
| 			} | ||||
| 		} | ||||
| 	} else if r.MatchOne.Match(value) { | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| type Pattern struct { | ||||
| 	prefix   string | ||||
| 	suffix   string | ||||
| 	wildcard bool | ||||
| } | ||||
| 
 | ||||
| func NewPattern(value string) Pattern { | ||||
| 	p := Pattern{} | ||||
| 	if i := strings.IndexByte(value, '*'); i >= 0 { | ||||
| 		p.wildcard = true | ||||
| 		p.prefix = value[0:i] | ||||
| 		p.suffix = value[i+1:] | ||||
| 	} else { | ||||
| 		p.prefix = value | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| func (p Pattern) Match(v string) bool { | ||||
| 	if !p.wildcard { | ||||
| 		if p.prefix == v { | ||||
| 			return true | ||||
| 		} else { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 	return len(v) >= len(p.prefix+p.suffix) && strings.HasPrefix(v, p.prefix) && strings.HasSuffix(v, p.suffix) | ||||
| } | ||||
							
								
								
									
										56
									
								
								vendor/github.com/go-chi/chi/middleware/strip.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								vendor/github.com/go-chi/chi/middleware/strip.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 
 | ||||
| 	"github.com/go-chi/chi" | ||||
| ) | ||||
| 
 | ||||
| // StripSlashes is a middleware that will match request paths with a trailing | ||||
| // slash, strip it from the path and continue routing through the mux, if a route | ||||
| // matches, then it will serve the handler. | ||||
| func StripSlashes(next http.Handler) http.Handler { | ||||
| 	fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 		var path string | ||||
| 		rctx := chi.RouteContext(r.Context()) | ||||
| 		if rctx.RoutePath != "" { | ||||
| 			path = rctx.RoutePath | ||||
| 		} else { | ||||
| 			path = r.URL.Path | ||||
| 		} | ||||
| 		if len(path) > 1 && path[len(path)-1] == '/' { | ||||
| 			rctx.RoutePath = path[:len(path)-1] | ||||
| 		} | ||||
| 		next.ServeHTTP(w, r) | ||||
| 	} | ||||
| 	return http.HandlerFunc(fn) | ||||
| } | ||||
| 
 | ||||
| // RedirectSlashes is a middleware that will match request paths with a trailing | ||||
| // slash and redirect to the same path, less the trailing slash. | ||||
| // | ||||
| // NOTE: RedirectSlashes middleware is *incompatible* with http.FileServer, | ||||
| // see https://github.com/go-chi/chi/issues/343 | ||||
| func RedirectSlashes(next http.Handler) http.Handler { | ||||
| 	fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 		var path string | ||||
| 		rctx := chi.RouteContext(r.Context()) | ||||
| 		if rctx.RoutePath != "" { | ||||
| 			path = rctx.RoutePath | ||||
| 		} else { | ||||
| 			path = r.URL.Path | ||||
| 		} | ||||
| 		if len(path) > 1 && path[len(path)-1] == '/' { | ||||
| 			if r.URL.RawQuery != "" { | ||||
| 				path = fmt.Sprintf("%s?%s", path[:len(path)-1], r.URL.RawQuery) | ||||
| 			} else { | ||||
| 				path = path[:len(path)-1] | ||||
| 			} | ||||
| 			http.Redirect(w, r, path, 301) | ||||
| 			return | ||||
| 		} | ||||
| 		next.ServeHTTP(w, r) | ||||
| 	} | ||||
| 	return http.HandlerFunc(fn) | ||||
| } | ||||
							
								
								
									
										63
									
								
								vendor/github.com/go-chi/chi/middleware/terminal.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/go-chi/chi/middleware/terminal.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | ||||
| package middleware | ||||
| 
 | ||||
| // Ported from Goji's middleware, source: | ||||
| // https://github.com/zenazn/goji/tree/master/web/middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	// Normal colors | ||||
| 	nBlack   = []byte{'\033', '[', '3', '0', 'm'} | ||||
| 	nRed     = []byte{'\033', '[', '3', '1', 'm'} | ||||
| 	nGreen   = []byte{'\033', '[', '3', '2', 'm'} | ||||
| 	nYellow  = []byte{'\033', '[', '3', '3', 'm'} | ||||
| 	nBlue    = []byte{'\033', '[', '3', '4', 'm'} | ||||
| 	nMagenta = []byte{'\033', '[', '3', '5', 'm'} | ||||
| 	nCyan    = []byte{'\033', '[', '3', '6', 'm'} | ||||
| 	nWhite   = []byte{'\033', '[', '3', '7', 'm'} | ||||
| 	// Bright colors | ||||
| 	bBlack   = []byte{'\033', '[', '3', '0', ';', '1', 'm'} | ||||
| 	bRed     = []byte{'\033', '[', '3', '1', ';', '1', 'm'} | ||||
| 	bGreen   = []byte{'\033', '[', '3', '2', ';', '1', 'm'} | ||||
| 	bYellow  = []byte{'\033', '[', '3', '3', ';', '1', 'm'} | ||||
| 	bBlue    = []byte{'\033', '[', '3', '4', ';', '1', 'm'} | ||||
| 	bMagenta = []byte{'\033', '[', '3', '5', ';', '1', 'm'} | ||||
| 	bCyan    = []byte{'\033', '[', '3', '6', ';', '1', 'm'} | ||||
| 	bWhite   = []byte{'\033', '[', '3', '7', ';', '1', 'm'} | ||||
| 
 | ||||
| 	reset = []byte{'\033', '[', '0', 'm'} | ||||
| ) | ||||
| 
 | ||||
| var IsTTY bool | ||||
| 
 | ||||
| func init() { | ||||
| 	// This is sort of cheating: if stdout is a character device, we assume | ||||
| 	// that means it's a TTY. Unfortunately, there are many non-TTY | ||||
| 	// character devices, but fortunately stdout is rarely set to any of | ||||
| 	// them. | ||||
| 	// | ||||
| 	// We could solve this properly by pulling in a dependency on | ||||
| 	// code.google.com/p/go.crypto/ssh/terminal, for instance, but as a | ||||
| 	// heuristic for whether to print in color or in black-and-white, I'd | ||||
| 	// really rather not. | ||||
| 	fi, err := os.Stdout.Stat() | ||||
| 	if err == nil { | ||||
| 		m := os.ModeDevice | os.ModeCharDevice | ||||
| 		IsTTY = fi.Mode()&m == m | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // colorWrite | ||||
| func cW(w io.Writer, useColor bool, color []byte, s string, args ...interface{}) { | ||||
| 	if IsTTY && useColor { | ||||
| 		w.Write(color) | ||||
| 	} | ||||
| 	fmt.Fprintf(w, s, args...) | ||||
| 	if IsTTY && useColor { | ||||
| 		w.Write(reset) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										132
									
								
								vendor/github.com/go-chi/chi/middleware/throttle.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								vendor/github.com/go-chi/chi/middleware/throttle.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,132 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"strconv" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	errCapacityExceeded = "Server capacity exceeded." | ||||
| 	errTimedOut         = "Timed out while waiting for a pending request to complete." | ||||
| 	errContextCanceled  = "Context was canceled." | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	defaultBacklogTimeout = time.Second * 60 | ||||
| ) | ||||
| 
 | ||||
| // ThrottleOpts represents a set of throttling options. | ||||
| type ThrottleOpts struct { | ||||
| 	Limit          int | ||||
| 	BacklogLimit   int | ||||
| 	BacklogTimeout time.Duration | ||||
| 	RetryAfterFn   func(ctxDone bool) time.Duration | ||||
| } | ||||
| 
 | ||||
| // Throttle is a middleware that limits number of currently processed requests | ||||
| // at a time across all users. Note: Throttle is not a rate-limiter per user, | ||||
| // instead it just puts a ceiling on the number of currentl in-flight requests | ||||
| // being processed from the point from where the Throttle middleware is mounted. | ||||
| func Throttle(limit int) func(http.Handler) http.Handler { | ||||
| 	return ThrottleWithOpts(ThrottleOpts{Limit: limit, BacklogTimeout: defaultBacklogTimeout}) | ||||
| } | ||||
| 
 | ||||
| // ThrottleBacklog is a middleware that limits number of currently processed | ||||
| // requests at a time and provides a backlog for holding a finite number of | ||||
| // pending requests. | ||||
| func ThrottleBacklog(limit int, backlogLimit int, backlogTimeout time.Duration) func(http.Handler) http.Handler { | ||||
| 	return ThrottleWithOpts(ThrottleOpts{Limit: limit, BacklogLimit: backlogLimit, BacklogTimeout: backlogTimeout}) | ||||
| } | ||||
| 
 | ||||
| // ThrottleWithOpts is a middleware that limits number of currently processed requests using passed ThrottleOpts. | ||||
| func ThrottleWithOpts(opts ThrottleOpts) func(http.Handler) http.Handler { | ||||
| 	if opts.Limit < 1 { | ||||
| 		panic("chi/middleware: Throttle expects limit > 0") | ||||
| 	} | ||||
| 
 | ||||
| 	if opts.BacklogLimit < 0 { | ||||
| 		panic("chi/middleware: Throttle expects backlogLimit to be positive") | ||||
| 	} | ||||
| 
 | ||||
| 	t := throttler{ | ||||
| 		tokens:         make(chan token, opts.Limit), | ||||
| 		backlogTokens:  make(chan token, opts.Limit+opts.BacklogLimit), | ||||
| 		backlogTimeout: opts.BacklogTimeout, | ||||
| 		retryAfterFn:   opts.RetryAfterFn, | ||||
| 	} | ||||
| 
 | ||||
| 	// Filling tokens. | ||||
| 	for i := 0; i < opts.Limit+opts.BacklogLimit; i++ { | ||||
| 		if i < opts.Limit { | ||||
| 			t.tokens <- token{} | ||||
| 		} | ||||
| 		t.backlogTokens <- token{} | ||||
| 	} | ||||
| 
 | ||||
| 	return func(next http.Handler) http.Handler { | ||||
| 		fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 			ctx := r.Context() | ||||
| 
 | ||||
| 			select { | ||||
| 
 | ||||
| 			case <-ctx.Done(): | ||||
| 				t.setRetryAfterHeaderIfNeeded(w, true) | ||||
| 				http.Error(w, errContextCanceled, http.StatusServiceUnavailable) | ||||
| 				return | ||||
| 
 | ||||
| 			case btok := <-t.backlogTokens: | ||||
| 				timer := time.NewTimer(t.backlogTimeout) | ||||
| 
 | ||||
| 				defer func() { | ||||
| 					t.backlogTokens <- btok | ||||
| 				}() | ||||
| 
 | ||||
| 				select { | ||||
| 				case <-timer.C: | ||||
| 					t.setRetryAfterHeaderIfNeeded(w, false) | ||||
| 					http.Error(w, errTimedOut, http.StatusServiceUnavailable) | ||||
| 					return | ||||
| 				case <-ctx.Done(): | ||||
| 					timer.Stop() | ||||
| 					t.setRetryAfterHeaderIfNeeded(w, true) | ||||
| 					http.Error(w, errContextCanceled, http.StatusServiceUnavailable) | ||||
| 					return | ||||
| 				case tok := <-t.tokens: | ||||
| 					defer func() { | ||||
| 						timer.Stop() | ||||
| 						t.tokens <- tok | ||||
| 					}() | ||||
| 					next.ServeHTTP(w, r) | ||||
| 				} | ||||
| 				return | ||||
| 
 | ||||
| 			default: | ||||
| 				t.setRetryAfterHeaderIfNeeded(w, false) | ||||
| 				http.Error(w, errCapacityExceeded, http.StatusServiceUnavailable) | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		return http.HandlerFunc(fn) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // token represents a request that is being processed. | ||||
| type token struct{} | ||||
| 
 | ||||
| // throttler limits number of currently processed requests at a time. | ||||
| type throttler struct { | ||||
| 	tokens         chan token | ||||
| 	backlogTokens  chan token | ||||
| 	backlogTimeout time.Duration | ||||
| 	retryAfterFn   func(ctxDone bool) time.Duration | ||||
| } | ||||
| 
 | ||||
| // setRetryAfterHeaderIfNeeded sets Retry-After HTTP header if corresponding retryAfterFn option of throttler is initialized. | ||||
| func (t throttler) setRetryAfterHeaderIfNeeded(w http.ResponseWriter, ctxDone bool) { | ||||
| 	if t.retryAfterFn == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	w.Header().Set("Retry-After", strconv.Itoa(int(t.retryAfterFn(ctxDone).Seconds()))) | ||||
| } | ||||
							
								
								
									
										49
									
								
								vendor/github.com/go-chi/chi/middleware/timeout.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/github.com/go-chi/chi/middleware/timeout.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"net/http" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // Timeout is a middleware that cancels ctx after a given timeout and return | ||||
| // a 504 Gateway Timeout error to the client. | ||||
| // | ||||
| // It's required that you select the ctx.Done() channel to check for the signal | ||||
| // if the context has reached its deadline and return, otherwise the timeout | ||||
| // signal will be just ignored. | ||||
| // | ||||
| // ie. a route/handler may look like: | ||||
| // | ||||
| //  r.Get("/long", func(w http.ResponseWriter, r *http.Request) { | ||||
| // 	 ctx := r.Context() | ||||
| // 	 processTime := time.Duration(rand.Intn(4)+1) * time.Second | ||||
| // | ||||
| // 	 select { | ||||
| // 	 case <-ctx.Done(): | ||||
| // 	 	return | ||||
| // | ||||
| // 	 case <-time.After(processTime): | ||||
| // 	 	 // The above channel simulates some hard work. | ||||
| // 	 } | ||||
| // | ||||
| // 	 w.Write([]byte("done")) | ||||
| //  }) | ||||
| // | ||||
| func Timeout(timeout time.Duration) func(next http.Handler) http.Handler { | ||||
| 	return func(next http.Handler) http.Handler { | ||||
| 		fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 			ctx, cancel := context.WithTimeout(r.Context(), timeout) | ||||
| 			defer func() { | ||||
| 				cancel() | ||||
| 				if ctx.Err() == context.DeadlineExceeded { | ||||
| 					w.WriteHeader(http.StatusGatewayTimeout) | ||||
| 				} | ||||
| 			}() | ||||
| 
 | ||||
| 			r = r.WithContext(ctx) | ||||
| 			next.ServeHTTP(w, r) | ||||
| 		} | ||||
| 		return http.HandlerFunc(fn) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										72
									
								
								vendor/github.com/go-chi/chi/middleware/url_format.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								vendor/github.com/go-chi/chi/middleware/url_format.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,72 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/go-chi/chi" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	// URLFormatCtxKey is the context.Context key to store the URL format data | ||||
| 	// for a request. | ||||
| 	URLFormatCtxKey = &contextKey{"URLFormat"} | ||||
| ) | ||||
| 
 | ||||
| // URLFormat is a middleware that parses the url extension from a request path and stores it | ||||
| // on the context as a string under the key `middleware.URLFormatCtxKey`. The middleware will | ||||
| // trim the suffix from the routing path and continue routing. | ||||
| // | ||||
| // Routers should not include a url parameter for the suffix when using this middleware. | ||||
| // | ||||
| // Sample usage.. for url paths: `/articles/1`, `/articles/1.json` and `/articles/1.xml` | ||||
| // | ||||
| //  func routes() http.Handler { | ||||
| //    r := chi.NewRouter() | ||||
| //    r.Use(middleware.URLFormat) | ||||
| // | ||||
| //    r.Get("/articles/{id}", ListArticles) | ||||
| // | ||||
| //    return r | ||||
| //  } | ||||
| // | ||||
| //  func ListArticles(w http.ResponseWriter, r *http.Request) { | ||||
| // 	  urlFormat, _ := r.Context().Value(middleware.URLFormatCtxKey).(string) | ||||
| // | ||||
| // 	  switch urlFormat { | ||||
| // 	  case "json": | ||||
| // 	  	render.JSON(w, r, articles) | ||||
| // 	  case "xml:" | ||||
| // 	  	render.XML(w, r, articles) | ||||
| // 	  default: | ||||
| // 	  	render.JSON(w, r, articles) | ||||
| // 	  } | ||||
| // } | ||||
| // | ||||
| func URLFormat(next http.Handler) http.Handler { | ||||
| 	fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 		ctx := r.Context() | ||||
| 
 | ||||
| 		var format string | ||||
| 		path := r.URL.Path | ||||
| 
 | ||||
| 		if strings.Index(path, ".") > 0 { | ||||
| 			base := strings.LastIndex(path, "/") | ||||
| 			idx := strings.Index(path[base:], ".") | ||||
| 
 | ||||
| 			if idx > 0 { | ||||
| 				idx += base | ||||
| 				format = path[idx+1:] | ||||
| 
 | ||||
| 				rctx := chi.RouteContext(r.Context()) | ||||
| 				rctx.RoutePath = path[:idx] | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		r = r.WithContext(context.WithValue(ctx, URLFormatCtxKey, format)) | ||||
| 
 | ||||
| 		next.ServeHTTP(w, r) | ||||
| 	} | ||||
| 	return http.HandlerFunc(fn) | ||||
| } | ||||
							
								
								
									
										17
									
								
								vendor/github.com/go-chi/chi/middleware/value.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/go-chi/chi/middleware/value.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| package middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"net/http" | ||||
| ) | ||||
| 
 | ||||
| // WithValue is a middleware that sets a given key/value in a context chain. | ||||
| func WithValue(key interface{}, val interface{}) func(next http.Handler) http.Handler { | ||||
| 	return func(next http.Handler) http.Handler { | ||||
| 		fn := func(w http.ResponseWriter, r *http.Request) { | ||||
| 			r = r.WithContext(context.WithValue(r.Context(), key, val)) | ||||
| 			next.ServeHTTP(w, r) | ||||
| 		} | ||||
| 		return http.HandlerFunc(fn) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										180
									
								
								vendor/github.com/go-chi/chi/middleware/wrap_writer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								vendor/github.com/go-chi/chi/middleware/wrap_writer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,180 @@ | ||||
| package middleware | ||||
| 
 | ||||
| // The original work was derived from Goji's middleware, source: | ||||
| // https://github.com/zenazn/goji/tree/master/web/middleware | ||||
| 
 | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"io" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| ) | ||||
| 
 | ||||
| // NewWrapResponseWriter wraps an http.ResponseWriter, returning a proxy that allows you to | ||||
| // hook into various parts of the response process. | ||||
| func NewWrapResponseWriter(w http.ResponseWriter, protoMajor int) WrapResponseWriter { | ||||
| 	_, fl := w.(http.Flusher) | ||||
| 
 | ||||
| 	bw := basicWriter{ResponseWriter: w} | ||||
| 
 | ||||
| 	if protoMajor == 2 { | ||||
| 		_, ps := w.(http.Pusher) | ||||
| 		if fl && ps { | ||||
| 			return &http2FancyWriter{bw} | ||||
| 		} | ||||
| 	} else { | ||||
| 		_, hj := w.(http.Hijacker) | ||||
| 		_, rf := w.(io.ReaderFrom) | ||||
| 		if fl && hj && rf { | ||||
| 			return &httpFancyWriter{bw} | ||||
| 		} | ||||
| 	} | ||||
| 	if fl { | ||||
| 		return &flushWriter{bw} | ||||
| 	} | ||||
| 
 | ||||
| 	return &bw | ||||
| } | ||||
| 
 | ||||
| // WrapResponseWriter is a proxy around an http.ResponseWriter that allows you to hook | ||||
| // into various parts of the response process. | ||||
| type WrapResponseWriter interface { | ||||
| 	http.ResponseWriter | ||||
| 	// Status returns the HTTP status of the request, or 0 if one has not | ||||
| 	// yet been sent. | ||||
| 	Status() int | ||||
| 	// BytesWritten returns the total number of bytes sent to the client. | ||||
| 	BytesWritten() int | ||||
| 	// Tee causes the response body to be written to the given io.Writer in | ||||
| 	// addition to proxying the writes through. Only one io.Writer can be | ||||
| 	// tee'd to at once: setting a second one will overwrite the first. | ||||
| 	// Writes will be sent to the proxy before being written to this | ||||
| 	// io.Writer. It is illegal for the tee'd writer to be modified | ||||
| 	// concurrently with writes. | ||||
| 	Tee(io.Writer) | ||||
| 	// Unwrap returns the original proxied target. | ||||
| 	Unwrap() http.ResponseWriter | ||||
| } | ||||
| 
 | ||||
| // basicWriter wraps a http.ResponseWriter that implements the minimal | ||||
| // http.ResponseWriter interface. | ||||
| type basicWriter struct { | ||||
| 	http.ResponseWriter | ||||
| 	wroteHeader bool | ||||
| 	code        int | ||||
| 	bytes       int | ||||
| 	tee         io.Writer | ||||
| } | ||||
| 
 | ||||
| func (b *basicWriter) WriteHeader(code int) { | ||||
| 	if !b.wroteHeader { | ||||
| 		b.code = code | ||||
| 		b.wroteHeader = true | ||||
| 		b.ResponseWriter.WriteHeader(code) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (b *basicWriter) Write(buf []byte) (int, error) { | ||||
| 	b.maybeWriteHeader() | ||||
| 	n, err := b.ResponseWriter.Write(buf) | ||||
| 	if b.tee != nil { | ||||
| 		_, err2 := b.tee.Write(buf[:n]) | ||||
| 		// Prefer errors generated by the proxied writer. | ||||
| 		if err == nil { | ||||
| 			err = err2 | ||||
| 		} | ||||
| 	} | ||||
| 	b.bytes += n | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| func (b *basicWriter) maybeWriteHeader() { | ||||
| 	if !b.wroteHeader { | ||||
| 		b.WriteHeader(http.StatusOK) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (b *basicWriter) Status() int { | ||||
| 	return b.code | ||||
| } | ||||
| 
 | ||||
| func (b *basicWriter) BytesWritten() int { | ||||
| 	return b.bytes | ||||
| } | ||||
| 
 | ||||
| func (b *basicWriter) Tee(w io.Writer) { | ||||
| 	b.tee = w | ||||
| } | ||||
| 
 | ||||
| func (b *basicWriter) Unwrap() http.ResponseWriter { | ||||
| 	return b.ResponseWriter | ||||
| } | ||||
| 
 | ||||
| type flushWriter struct { | ||||
| 	basicWriter | ||||
| } | ||||
| 
 | ||||
| func (f *flushWriter) Flush() { | ||||
| 	f.wroteHeader = true | ||||
| 	fl := f.basicWriter.ResponseWriter.(http.Flusher) | ||||
| 	fl.Flush() | ||||
| } | ||||
| 
 | ||||
| var _ http.Flusher = &flushWriter{} | ||||
| 
 | ||||
| // httpFancyWriter is a HTTP writer that additionally satisfies | ||||
| // http.Flusher, http.Hijacker, and io.ReaderFrom. It exists for the common case | ||||
| // of wrapping the http.ResponseWriter that package http gives you, in order to | ||||
| // make the proxied object support the full method set of the proxied object. | ||||
| type httpFancyWriter struct { | ||||
| 	basicWriter | ||||
| } | ||||
| 
 | ||||
| func (f *httpFancyWriter) Flush() { | ||||
| 	f.wroteHeader = true | ||||
| 	fl := f.basicWriter.ResponseWriter.(http.Flusher) | ||||
| 	fl.Flush() | ||||
| } | ||||
| 
 | ||||
| func (f *httpFancyWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { | ||||
| 	hj := f.basicWriter.ResponseWriter.(http.Hijacker) | ||||
| 	return hj.Hijack() | ||||
| } | ||||
| 
 | ||||
| func (f *http2FancyWriter) Push(target string, opts *http.PushOptions) error { | ||||
| 	return f.basicWriter.ResponseWriter.(http.Pusher).Push(target, opts) | ||||
| } | ||||
| 
 | ||||
| func (f *httpFancyWriter) ReadFrom(r io.Reader) (int64, error) { | ||||
| 	if f.basicWriter.tee != nil { | ||||
| 		n, err := io.Copy(&f.basicWriter, r) | ||||
| 		f.basicWriter.bytes += int(n) | ||||
| 		return n, err | ||||
| 	} | ||||
| 	rf := f.basicWriter.ResponseWriter.(io.ReaderFrom) | ||||
| 	f.basicWriter.maybeWriteHeader() | ||||
| 	n, err := rf.ReadFrom(r) | ||||
| 	f.basicWriter.bytes += int(n) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| var _ http.Flusher = &httpFancyWriter{} | ||||
| var _ http.Hijacker = &httpFancyWriter{} | ||||
| var _ http.Pusher = &http2FancyWriter{} | ||||
| var _ io.ReaderFrom = &httpFancyWriter{} | ||||
| 
 | ||||
| // http2FancyWriter is a HTTP2 writer that additionally satisfies | ||||
| // http.Flusher, and io.ReaderFrom. It exists for the common case | ||||
| // of wrapping the http.ResponseWriter that package http gives you, in order to | ||||
| // make the proxied object support the full method set of the proxied object. | ||||
| type http2FancyWriter struct { | ||||
| 	basicWriter | ||||
| } | ||||
| 
 | ||||
| func (f *http2FancyWriter) Flush() { | ||||
| 	f.wroteHeader = true | ||||
| 	fl := f.basicWriter.ResponseWriter.(http.Flusher) | ||||
| 	fl.Flush() | ||||
| } | ||||
| 
 | ||||
| var _ http.Flusher = &http2FancyWriter{} | ||||
							
								
								
									
										16
									
								
								vendor/github.com/go-chi/chi/mux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/go-chi/chi/mux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -78,7 +78,11 @@ func (mx *Mux) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||
| 	rctx = mx.pool.Get().(*Context) | ||||
| 	rctx.Reset() | ||||
| 	rctx.Routes = mx | ||||
| 
 | ||||
| 	// NOTE: r.WithContext() causes 2 allocations and context.WithValue() causes 1 allocation | ||||
| 	r = r.WithContext(context.WithValue(r.Context(), RouteCtxKey, rctx)) | ||||
| 
 | ||||
| 	// Serve the request and once its done, put the request context back in the sync pool | ||||
| 	mx.handler.ServeHTTP(w, r) | ||||
| 	mx.pool.Put(rctx) | ||||
| } | ||||
| @ -220,7 +224,7 @@ func (mx *Mux) MethodNotAllowed(handlerFn http.HandlerFunc) { | ||||
| 
 | ||||
| // With adds inline middlewares for an endpoint handler. | ||||
| func (mx *Mux) With(middlewares ...func(http.Handler) http.Handler) Router { | ||||
| 	// Similarly as in handle(), we must build the mux handler once further | ||||
| 	// Similarly as in handle(), we must build the mux handler once additional | ||||
| 	// middleware registration isn't allowed for this stack, like now. | ||||
| 	if !mx.inline && mx.handler == nil { | ||||
| 		mx.buildRouteHandler() | ||||
| @ -234,7 +238,10 @@ func (mx *Mux) With(middlewares ...func(http.Handler) http.Handler) Router { | ||||
| 	} | ||||
| 	mws = append(mws, middlewares...) | ||||
| 
 | ||||
| 	im := &Mux{pool: mx.pool, inline: true, parent: mx, tree: mx.tree, middlewares: mws} | ||||
| 	im := &Mux{ | ||||
| 		pool: mx.pool, inline: true, parent: mx, tree: mx.tree, middlewares: mws, | ||||
| 		notFoundHandler: mx.notFoundHandler, methodNotAllowedHandler: mx.methodNotAllowedHandler, | ||||
| 	} | ||||
| 
 | ||||
| 	return im | ||||
| } | ||||
| @ -285,7 +292,6 @@ func (mx *Mux) Mount(pattern string, handler http.Handler) { | ||||
| 		subr.MethodNotAllowed(mx.methodNotAllowedHandler) | ||||
| 	} | ||||
| 
 | ||||
| 	// Wrap the sub-router in a handlerFunc to scope the request path for routing. | ||||
| 	mountHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 		rctx := RouteContext(r.Context()) | ||||
| 		rctx.RoutePath = mx.nextRoutePath(rctx) | ||||
| @ -376,7 +382,7 @@ func (mx *Mux) handle(method methodTyp, pattern string, handler http.Handler) *n | ||||
| 		panic(fmt.Sprintf("chi: routing pattern must begin with '/' in '%s'", pattern)) | ||||
| 	} | ||||
| 
 | ||||
| 	// Build the final routing handler for this Mux. | ||||
| 	// Build the computed routing handler for this routing pattern. | ||||
| 	if !mx.inline && mx.handler == nil { | ||||
| 		mx.buildRouteHandler() | ||||
| 	} | ||||
| @ -436,7 +442,7 @@ func (mx *Mux) nextRoutePath(rctx *Context) string { | ||||
| 	routePath := "/" | ||||
| 	nx := len(rctx.routeParams.Keys) - 1 // index of last param in list | ||||
| 	if nx >= 0 && rctx.routeParams.Keys[nx] == "*" && len(rctx.routeParams.Values) > nx { | ||||
| 		routePath += rctx.routeParams.Values[nx] | ||||
| 		routePath = "/" + rctx.routeParams.Values[nx] | ||||
| 	} | ||||
| 	return routePath | ||||
| } | ||||
|  | ||||
							
								
								
									
										51
									
								
								vendor/github.com/go-chi/chi/tree.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								vendor/github.com/go-chi/chi/tree.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -331,7 +331,7 @@ func (n *node) getEdge(ntyp nodeTyp, label, tail byte, prefix string) *node { | ||||
| func (n *node) setEndpoint(method methodTyp, handler http.Handler, pattern string) { | ||||
| 	// Set the handler for the method type on the node | ||||
| 	if n.endpoints == nil { | ||||
| 		n.endpoints = make(endpoints, 0) | ||||
| 		n.endpoints = make(endpoints) | ||||
| 	} | ||||
| 
 | ||||
| 	paramKeys := patParamKeys(pattern) | ||||
| @ -433,7 +433,7 @@ func (n *node) findRoute(rctx *Context, method methodTyp, path string) *node { | ||||
| 				} | ||||
| 
 | ||||
| 				if ntyp == ntRegexp && xn.rex != nil { | ||||
| 					if xn.rex.Match([]byte(xsearch[:p])) == false { | ||||
| 					if !xn.rex.Match([]byte(xsearch[:p])) { | ||||
| 						continue | ||||
| 					} | ||||
| 				} else if strings.IndexByte(xsearch[:p], '/') != -1 { | ||||
| @ -441,11 +441,37 @@ func (n *node) findRoute(rctx *Context, method methodTyp, path string) *node { | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				prevlen := len(rctx.routeParams.Values) | ||||
| 				rctx.routeParams.Values = append(rctx.routeParams.Values, xsearch[:p]) | ||||
| 				xsearch = xsearch[p:] | ||||
| 				break | ||||
| 
 | ||||
| 				if len(xsearch) == 0 { | ||||
| 					if xn.isLeaf() { | ||||
| 						h := xn.endpoints[method] | ||||
| 						if h != nil && h.handler != nil { | ||||
| 							rctx.routeParams.Keys = append(rctx.routeParams.Keys, h.paramKeys...) | ||||
| 							return xn | ||||
| 						} | ||||
| 
 | ||||
| 						// flag that the routing context found a route, but not a corresponding | ||||
| 						// supported method | ||||
| 						rctx.methodNotAllowed = true | ||||
| 					} | ||||
| 				} | ||||
| 
 | ||||
| 				// recursively find the next node on this branch | ||||
| 				fin := xn.findRoute(rctx, method, xsearch) | ||||
| 				if fin != nil { | ||||
| 					return fin | ||||
| 				} | ||||
| 
 | ||||
| 				// not found on this branch, reset vars | ||||
| 				rctx.routeParams.Values = rctx.routeParams.Values[:prevlen] | ||||
| 				xsearch = search | ||||
| 			} | ||||
| 
 | ||||
| 			rctx.routeParams.Values = append(rctx.routeParams.Values, "") | ||||
| 
 | ||||
| 		default: | ||||
| 			// catch-all nodes | ||||
| 			rctx.routeParams.Values = append(rctx.routeParams.Values, search) | ||||
| @ -460,7 +486,7 @@ func (n *node) findRoute(rctx *Context, method methodTyp, path string) *node { | ||||
| 		// did we find it yet? | ||||
| 		if len(xsearch) == 0 { | ||||
| 			if xn.isLeaf() { | ||||
| 				h, _ := xn.endpoints[method] | ||||
| 				h := xn.endpoints[method] | ||||
| 				if h != nil && h.handler != nil { | ||||
| 					rctx.routeParams.Keys = append(rctx.routeParams.Keys, h.paramKeys...) | ||||
| 					return xn | ||||
| @ -518,15 +544,6 @@ func (n *node) findEdge(ntyp nodeTyp, label byte) *node { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (n *node) isEmpty() bool { | ||||
| 	for _, nds := range n.children { | ||||
| 		if len(nds) > 0 { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
| func (n *node) isLeaf() bool { | ||||
| 	return n.endpoints != nil | ||||
| } | ||||
| @ -582,7 +599,7 @@ func (n *node) routes() []Route { | ||||
| 		} | ||||
| 
 | ||||
| 		// Group methodHandlers by unique patterns | ||||
| 		pats := make(map[string]endpoints, 0) | ||||
| 		pats := make(map[string]endpoints) | ||||
| 
 | ||||
| 		for mt, h := range eps { | ||||
| 			if h.pattern == "" { | ||||
| @ -597,7 +614,7 @@ func (n *node) routes() []Route { | ||||
| 		} | ||||
| 
 | ||||
| 		for p, mh := range pats { | ||||
| 			hs := make(map[string]http.Handler, 0) | ||||
| 			hs := make(map[string]http.Handler) | ||||
| 			if mh[mALL] != nil && mh[mALL].handler != nil { | ||||
| 				hs["*"] = mh[mALL].handler | ||||
| 			} | ||||
| @ -698,7 +715,7 @@ func patNextSegment(pattern string) (nodeTyp, string, string, byte, int, int) { | ||||
| 				rexpat = "^" + rexpat | ||||
| 			} | ||||
| 			if rexpat[len(rexpat)-1] != '$' { | ||||
| 				rexpat = rexpat + "$" | ||||
| 				rexpat += "$" | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| @ -795,6 +812,7 @@ func (ns nodes) findEdge(label byte) *node { | ||||
| } | ||||
| 
 | ||||
| // Route describes the details of a routing handler. | ||||
| // Handlers map key is an HTTP method | ||||
| type Route struct { | ||||
| 	Pattern   string | ||||
| 	Handlers  map[string]http.Handler | ||||
| @ -829,6 +847,7 @@ func walk(r Routes, walkFn WalkFunc, parentRoute string, parentMw ...func(http.H | ||||
| 			} | ||||
| 
 | ||||
| 			fullRoute := parentRoute + route.Pattern | ||||
| 			fullRoute = strings.Replace(fullRoute, "/*/", "/", -1) | ||||
| 
 | ||||
| 			if chain, ok := handler.(*ChainHandler); ok { | ||||
| 				if err := walkFn(method, fullRoute, chain.Endpoint, append(mws, chain.Middlewares...)...); err != nil { | ||||
|  | ||||
							
								
								
									
										45
									
								
								vendor/github.com/sethvargo/go-password/password/generate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								vendor/github.com/sethvargo/go-password/password/generate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -13,10 +13,22 @@ package password | ||||
| import ( | ||||
| 	"crypto/rand" | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"math/big" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // Built-time checks that the generators implement the interface. | ||||
| var _ PasswordGenerator = (*Generator)(nil) | ||||
| 
 | ||||
| // PasswordGenerator is an interface that implements the Generate function. This | ||||
| // is useful for testing where you can pass this interface instead of a real | ||||
| // password generator to mock responses for predicability. | ||||
| type PasswordGenerator interface { | ||||
| 	Generate(int, int, int, bool, bool) (string, error) | ||||
| 	MustGenerate(int, int, int, bool, bool) string | ||||
| } | ||||
| 
 | ||||
| const ( | ||||
| 	// LowerLetters is the list of lowercase letters. | ||||
| 	LowerLetters = "abcdefghijklmnopqrstuvwxyz" | ||||
| @ -56,6 +68,7 @@ type Generator struct { | ||||
| 	upperLetters string | ||||
| 	digits       string | ||||
| 	symbols      string | ||||
| 	reader       io.Reader | ||||
| } | ||||
| 
 | ||||
| // GeneratorInput is used as input to the NewGenerator function. | ||||
| @ -64,6 +77,7 @@ type GeneratorInput struct { | ||||
| 	UpperLetters string | ||||
| 	Digits       string | ||||
| 	Symbols      string | ||||
| 	Reader       io.Reader // rand.Reader by default | ||||
| } | ||||
| 
 | ||||
| // NewGenerator creates a new Generator from the specified configuration. If no | ||||
| @ -79,6 +93,7 @@ func NewGenerator(i *GeneratorInput) (*Generator, error) { | ||||
| 		upperLetters: i.UpperLetters, | ||||
| 		digits:       i.Digits, | ||||
| 		symbols:      i.Symbols, | ||||
| 		reader:       i.Reader, | ||||
| 	} | ||||
| 
 | ||||
| 	if g.lowerLetters == "" { | ||||
| @ -97,6 +112,10 @@ func NewGenerator(i *GeneratorInput) (*Generator, error) { | ||||
| 		g.symbols = Symbols | ||||
| 	} | ||||
| 
 | ||||
| 	if g.reader == nil { | ||||
| 		g.reader = rand.Reader | ||||
| 	} | ||||
| 
 | ||||
| 	return g, nil | ||||
| } | ||||
| 
 | ||||
| @ -135,7 +154,7 @@ func (g *Generator) Generate(length, numDigits, numSymbols int, noUpper, allowRe | ||||
| 
 | ||||
| 	// Characters | ||||
| 	for i := 0; i < chars; i++ { | ||||
| 		ch, err := randomElement(letters) | ||||
| 		ch, err := randomElement(g.reader, letters) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| @ -145,7 +164,7 @@ func (g *Generator) Generate(length, numDigits, numSymbols int, noUpper, allowRe | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		result, err = randomInsert(result, ch) | ||||
| 		result, err = randomInsert(g.reader, result, ch) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| @ -153,7 +172,7 @@ func (g *Generator) Generate(length, numDigits, numSymbols int, noUpper, allowRe | ||||
| 
 | ||||
| 	// Digits | ||||
| 	for i := 0; i < numDigits; i++ { | ||||
| 		d, err := randomElement(g.digits) | ||||
| 		d, err := randomElement(g.reader, g.digits) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| @ -163,7 +182,7 @@ func (g *Generator) Generate(length, numDigits, numSymbols int, noUpper, allowRe | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		result, err = randomInsert(result, d) | ||||
| 		result, err = randomInsert(g.reader, result, d) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| @ -171,7 +190,7 @@ func (g *Generator) Generate(length, numDigits, numSymbols int, noUpper, allowRe | ||||
| 
 | ||||
| 	// Symbols | ||||
| 	for i := 0; i < numSymbols; i++ { | ||||
| 		sym, err := randomElement(g.symbols) | ||||
| 		sym, err := randomElement(g.reader, g.symbols) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| @ -181,7 +200,7 @@ func (g *Generator) Generate(length, numDigits, numSymbols int, noUpper, allowRe | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		result, err = randomInsert(result, sym) | ||||
| 		result, err = randomInsert(g.reader, result, sym) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| @ -199,7 +218,7 @@ func (g *Generator) MustGenerate(length, numDigits, numSymbols int, noUpper, all | ||||
| 	return res | ||||
| } | ||||
| 
 | ||||
| // See Generator.Generate for usage. | ||||
| // Generate is the package shortcut for Generator.Generate. | ||||
| func Generate(length, numDigits, numSymbols int, noUpper, allowRepeat bool) (string, error) { | ||||
| 	gen, err := NewGenerator(nil) | ||||
| 	if err != nil { | ||||
| @ -209,7 +228,7 @@ func Generate(length, numDigits, numSymbols int, noUpper, allowRepeat bool) (str | ||||
| 	return gen.Generate(length, numDigits, numSymbols, noUpper, allowRepeat) | ||||
| } | ||||
| 
 | ||||
| // See Generator.MustGenerate for usage. | ||||
| // MustGenerate is the package shortcut for Generator.MustGenerate. | ||||
| func MustGenerate(length, numDigits, numSymbols int, noUpper, allowRepeat bool) string { | ||||
| 	res, err := Generate(length, numDigits, numSymbols, noUpper, allowRepeat) | ||||
| 	if err != nil { | ||||
| @ -219,22 +238,22 @@ func MustGenerate(length, numDigits, numSymbols int, noUpper, allowRepeat bool) | ||||
| } | ||||
| 
 | ||||
| // randomInsert randomly inserts the given value into the given string. | ||||
| func randomInsert(s, val string) (string, error) { | ||||
| func randomInsert(reader io.Reader, s, val string) (string, error) { | ||||
| 	if s == "" { | ||||
| 		return val, nil | ||||
| 	} | ||||
| 
 | ||||
| 	n, err := rand.Int(rand.Reader, big.NewInt(int64(len(s)+1))) | ||||
| 	n, err := rand.Int(reader, big.NewInt(int64(len(s)+1))) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	i := n.Int64() | ||||
| 	return s[0:i] + val + s[i:len(s)], nil | ||||
| 	return s[0:i] + val + s[i:], nil | ||||
| } | ||||
| 
 | ||||
| // randomElement extracts a random element from the given string. | ||||
| func randomElement(s string) (string, error) { | ||||
| 	n, err := rand.Int(rand.Reader, big.NewInt(int64(len(s)))) | ||||
| func randomElement(reader io.Reader, s string) (string, error) { | ||||
| 	n, err := rand.Int(reader, big.NewInt(int64(len(s)))) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										39
									
								
								vendor/github.com/sethvargo/go-password/password/mock.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/sethvargo/go-password/password/mock.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| package password | ||||
| 
 | ||||
| // Built-time checks that the generators implement the interface. | ||||
| var _ PasswordGenerator = (*mockGenerator)(nil) | ||||
| 
 | ||||
| type mockGenerator struct { | ||||
| 	result string | ||||
| 	err    error | ||||
| } | ||||
| 
 | ||||
| // NewMockGenerator creates a new generator that satisfies the PasswordGenerator | ||||
| // interface. If an error is provided, the error is returned. If a result if | ||||
| // provided, the result is always returned, regardless of what parameters are | ||||
| // passed into the Generate or MustGenerate methods. | ||||
| // | ||||
| // This function is most useful for tests where you want to have predicable | ||||
| // results for a transitive resource that depends on go-password. | ||||
| func NewMockGenerator(result string, err error) *mockGenerator { | ||||
| 	return &mockGenerator{ | ||||
| 		result: result, | ||||
| 		err:    err, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Generate returns the mocked result or error. | ||||
| func (g *mockGenerator) Generate(int, int, int, bool, bool) (string, error) { | ||||
| 	if g.err != nil { | ||||
| 		return "", g.err | ||||
| 	} | ||||
| 	return g.result, nil | ||||
| } | ||||
| 
 | ||||
| // MustGenerate returns the mocked result or panics if an error was given. | ||||
| func (g *mockGenerator) MustGenerate(int, int, int, bool, bool) string { | ||||
| 	if g.err != nil { | ||||
| 		panic(g.err) | ||||
| 	} | ||||
| 	return g.result | ||||
| } | ||||
							
								
								
									
										86
									
								
								vendor/golang.org/x/crypto/ssh/terminal/terminal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										86
									
								
								vendor/golang.org/x/crypto/ssh/terminal/terminal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -7,6 +7,8 @@ package terminal | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"io" | ||||
| 	"runtime" | ||||
| 	"strconv" | ||||
| 	"sync" | ||||
| 	"unicode/utf8" | ||||
| ) | ||||
| @ -111,6 +113,7 @@ func NewTerminal(c io.ReadWriter, prompt string) *Terminal { | ||||
| } | ||||
| 
 | ||||
| const ( | ||||
| 	keyCtrlC     = 3 | ||||
| 	keyCtrlD     = 4 | ||||
| 	keyCtrlU     = 21 | ||||
| 	keyEnter     = '\r' | ||||
| @ -149,8 +152,12 @@ func bytesToKey(b []byte, pasteActive bool) (rune, []byte) { | ||||
| 		switch b[0] { | ||||
| 		case 1: // ^A | ||||
| 			return keyHome, b[1:] | ||||
| 		case 2: // ^B | ||||
| 			return keyLeft, b[1:] | ||||
| 		case 5: // ^E | ||||
| 			return keyEnd, b[1:] | ||||
| 		case 6: // ^F | ||||
| 			return keyRight, b[1:] | ||||
| 		case 8: // ^H | ||||
| 			return keyBackspace, b[1:] | ||||
| 		case 11: // ^K | ||||
| @ -271,34 +278,44 @@ func (t *Terminal) moveCursorToPos(pos int) { | ||||
| } | ||||
| 
 | ||||
| func (t *Terminal) move(up, down, left, right int) { | ||||
| 	movement := make([]rune, 3*(up+down+left+right)) | ||||
| 	m := movement | ||||
| 	for i := 0; i < up; i++ { | ||||
| 		m[0] = keyEscape | ||||
| 		m[1] = '[' | ||||
| 		m[2] = 'A' | ||||
| 		m = m[3:] | ||||
| 	} | ||||
| 	for i := 0; i < down; i++ { | ||||
| 		m[0] = keyEscape | ||||
| 		m[1] = '[' | ||||
| 		m[2] = 'B' | ||||
| 		m = m[3:] | ||||
| 	} | ||||
| 	for i := 0; i < left; i++ { | ||||
| 		m[0] = keyEscape | ||||
| 		m[1] = '[' | ||||
| 		m[2] = 'D' | ||||
| 		m = m[3:] | ||||
| 	} | ||||
| 	for i := 0; i < right; i++ { | ||||
| 		m[0] = keyEscape | ||||
| 		m[1] = '[' | ||||
| 		m[2] = 'C' | ||||
| 		m = m[3:] | ||||
| 	m := []rune{} | ||||
| 
 | ||||
| 	// 1 unit up can be expressed as ^[[A or ^[A | ||||
| 	// 5 units up can be expressed as ^[[5A | ||||
| 
 | ||||
| 	if up == 1 { | ||||
| 		m = append(m, keyEscape, '[', 'A') | ||||
| 	} else if up > 1 { | ||||
| 		m = append(m, keyEscape, '[') | ||||
| 		m = append(m, []rune(strconv.Itoa(up))...) | ||||
| 		m = append(m, 'A') | ||||
| 	} | ||||
| 
 | ||||
| 	t.queue(movement) | ||||
| 	if down == 1 { | ||||
| 		m = append(m, keyEscape, '[', 'B') | ||||
| 	} else if down > 1 { | ||||
| 		m = append(m, keyEscape, '[') | ||||
| 		m = append(m, []rune(strconv.Itoa(down))...) | ||||
| 		m = append(m, 'B') | ||||
| 	} | ||||
| 
 | ||||
| 	if right == 1 { | ||||
| 		m = append(m, keyEscape, '[', 'C') | ||||
| 	} else if right > 1 { | ||||
| 		m = append(m, keyEscape, '[') | ||||
| 		m = append(m, []rune(strconv.Itoa(right))...) | ||||
| 		m = append(m, 'C') | ||||
| 	} | ||||
| 
 | ||||
| 	if left == 1 { | ||||
| 		m = append(m, keyEscape, '[', 'D') | ||||
| 	} else if left > 1 { | ||||
| 		m = append(m, keyEscape, '[') | ||||
| 		m = append(m, []rune(strconv.Itoa(left))...) | ||||
| 		m = append(m, 'D') | ||||
| 	} | ||||
| 
 | ||||
| 	t.queue(m) | ||||
| } | ||||
| 
 | ||||
| func (t *Terminal) clearLineToRight() { | ||||
| @ -726,6 +743,9 @@ func (t *Terminal) readLine() (line string, err error) { | ||||
| 						return "", io.EOF | ||||
| 					} | ||||
| 				} | ||||
| 				if key == keyCtrlC { | ||||
| 					return "", io.EOF | ||||
| 				} | ||||
| 				if key == keyPasteStart { | ||||
| 					t.pasteActive = true | ||||
| 					if len(t.line) == 0 { | ||||
| @ -928,6 +948,8 @@ func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { | ||||
| // readPasswordLine reads from reader until it finds \n or io.EOF. | ||||
| // The slice returned does not include the \n. | ||||
| // readPasswordLine also ignores any \r it finds. | ||||
| // Windows uses \r as end of line. So, on Windows, readPasswordLine | ||||
| // reads until it finds \r and ignores any \n it finds during processing. | ||||
| func readPasswordLine(reader io.Reader) ([]byte, error) { | ||||
| 	var buf [1]byte | ||||
| 	var ret []byte | ||||
| @ -936,10 +958,20 @@ func readPasswordLine(reader io.Reader) ([]byte, error) { | ||||
| 		n, err := reader.Read(buf[:]) | ||||
| 		if n > 0 { | ||||
| 			switch buf[0] { | ||||
| 			case '\b': | ||||
| 				if len(ret) > 0 { | ||||
| 					ret = ret[:len(ret)-1] | ||||
| 				} | ||||
| 			case '\n': | ||||
| 				if runtime.GOOS != "windows" { | ||||
| 					return ret, nil | ||||
| 				} | ||||
| 				// otherwise ignore \n | ||||
| 			case '\r': | ||||
| 				// remove \r from passwords on Windows | ||||
| 				if runtime.GOOS == "windows" { | ||||
| 					return ret, nil | ||||
| 				} | ||||
| 				// otherwise ignore \r | ||||
| 			default: | ||||
| 				ret = append(ret, buf[0]) | ||||
| 			} | ||||
|  | ||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -85,8 +85,8 @@ func ReadPassword(fd int) ([]byte, error) { | ||||
| 	} | ||||
| 	old := st | ||||
| 
 | ||||
| 	st &^= (windows.ENABLE_ECHO_INPUT) | ||||
| 	st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) | ||||
| 	st &^= (windows.ENABLE_ECHO_INPUT | windows.ENABLE_LINE_INPUT) | ||||
| 	st |= (windows.ENABLE_PROCESSED_OUTPUT | windows.ENABLE_PROCESSED_INPUT) | ||||
| 	if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/net/webdav/internal/xml/xml.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/net/webdav/internal/xml/xml.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -945,7 +945,7 @@ func (d *Decoder) ungetc(b byte) { | ||||
| 	d.offset-- | ||||
| } | ||||
| 
 | ||||
| var entity = map[string]int{ | ||||
| var entity = map[string]rune{ | ||||
| 	"lt":   '<', | ||||
| 	"gt":   '>', | ||||
| 	"amp":  '&', | ||||
| @ -1040,7 +1040,7 @@ Input: | ||||
| 					d.buf.WriteByte(';') | ||||
| 					n, err := strconv.ParseUint(s, base, 64) | ||||
| 					if err == nil && n <= unicode.MaxRune { | ||||
| 						text = string(n) | ||||
| 						text = string(rune(n)) | ||||
| 						haveText = true | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/net/webdav/webdav.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/net/webdav/webdav.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -323,7 +323,7 @@ func (h *Handler) handleCopyMove(w http.ResponseWriter, r *http.Request) (status | ||||
| 	if err != nil { | ||||
| 		return http.StatusBadRequest, errInvalidDestination | ||||
| 	} | ||||
| 	if u.Host != r.Host { | ||||
| 	if u.Host != "" && u.Host != r.Host { | ||||
| 		return http.StatusBadGateway, errInvalidDestination | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										30
									
								
								vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| // 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 | ||||
| } | ||||
							
								
								
									
										15
									
								
								vendor/golang.org/x/sys/unix/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/golang.org/x/sys/unix/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -89,7 +89,7 @@ constants. | ||||
| 
 | ||||
| Adding new syscall numbers is mostly done by running the build on a sufficiently | ||||
| new installation of the target OS (or updating the source checkouts for the | ||||
| new build system). However, depending on the OS, you make need to update the | ||||
| new build system). However, depending on the OS, you may need to update the | ||||
| parsing in mksysnum. | ||||
| 
 | ||||
| ### mksyscall.go | ||||
| @ -149,10 +149,21 @@ To add a constant, add the header that includes it to the appropriate variable. | ||||
| Then, edit the regex (if necessary) to match the desired constant. Avoid making | ||||
| the regex too broad to avoid matching unintended constants. | ||||
| 
 | ||||
| ### mkmerge.go | ||||
| 
 | ||||
| This program is used to extract duplicate const, func, and type declarations | ||||
| from the generated architecture-specific files listed below, and merge these | ||||
| into a common file for each OS. | ||||
| 
 | ||||
| The merge is performed in the following steps: | ||||
| 1. Construct the set of common code that is idential in all architecture-specific files. | ||||
| 2. Write this common code to the merged file. | ||||
| 3. Remove the common code from all architecture-specific files. | ||||
| 
 | ||||
| 
 | ||||
| ## Generated files | ||||
| 
 | ||||
| ### `zerror_${GOOS}_${GOARCH}.go` | ||||
| ### `zerrors_${GOOS}_${GOARCH}.go` | ||||
| 
 | ||||
| A file containing all of the system's generated error numbers, error strings, | ||||
| signal numbers, and constants. Generated by `mkerrors.sh` (see above). | ||||
|  | ||||
							
								
								
									
										42
									
								
								vendor/golang.org/x/sys/unix/affinity_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/golang.org/x/sys/unix/affinity_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -7,6 +7,7 @@ | ||||
| package unix | ||||
| 
 | ||||
| import ( | ||||
| 	"math/bits" | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| @ -79,46 +80,7 @@ func (s *CPUSet) IsSet(cpu int) bool { | ||||
| func (s *CPUSet) Count() int { | ||||
| 	c := 0 | ||||
| 	for _, b := range s { | ||||
| 		c += onesCount64(uint64(b)) | ||||
| 		c += bits.OnesCount64(uint64(b)) | ||||
| 	} | ||||
| 	return c | ||||
| } | ||||
| 
 | ||||
| // onesCount64 is a copy of Go 1.9's math/bits.OnesCount64. | ||||
| // Once this package can require Go 1.9, we can delete this | ||||
| // and update the caller to use bits.OnesCount64. | ||||
| func onesCount64(x uint64) int { | ||||
| 	const m0 = 0x5555555555555555 // 01010101 ... | ||||
| 	const m1 = 0x3333333333333333 // 00110011 ... | ||||
| 	const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ... | ||||
| 	const m3 = 0x00ff00ff00ff00ff // etc. | ||||
| 	const m4 = 0x0000ffff0000ffff | ||||
| 
 | ||||
| 	// Implementation: Parallel summing of adjacent bits. | ||||
| 	// See "Hacker's Delight", Chap. 5: Counting Bits. | ||||
| 	// The following pattern shows the general approach: | ||||
| 	// | ||||
| 	//   x = x>>1&(m0&m) + x&(m0&m) | ||||
| 	//   x = x>>2&(m1&m) + x&(m1&m) | ||||
| 	//   x = x>>4&(m2&m) + x&(m2&m) | ||||
| 	//   x = x>>8&(m3&m) + x&(m3&m) | ||||
| 	//   x = x>>16&(m4&m) + x&(m4&m) | ||||
| 	//   x = x>>32&(m5&m) + x&(m5&m) | ||||
| 	//   return int(x) | ||||
| 	// | ||||
| 	// Masking (& operations) can be left away when there's no | ||||
| 	// danger that a field's sum will carry over into the next | ||||
| 	// field: Since the result cannot be > 64, 8 bits is enough | ||||
| 	// and we can ignore the masks for the shifts by 8 and up. | ||||
| 	// Per "Hacker's Delight", the first line can be simplified | ||||
| 	// more, but it saves at best one instruction, so we leave | ||||
| 	// it alone for clarity. | ||||
| 	const m = 1<<64 - 1 | ||||
| 	x = x>>1&(m0&m) + x&(m0&m) | ||||
| 	x = x>>2&(m1&m) + x&(m1&m) | ||||
| 	x = (x>>4 + x) & (m2 & m) | ||||
| 	x += x >> 8 | ||||
| 	x += x >> 16 | ||||
| 	x += x >> 32 | ||||
| 	return int(x) & (1<<7 - 1) | ||||
| } | ||||
|  | ||||
							
								
								
									
										47
									
								
								vendor/golang.org/x/sys/unix/asm_linux_riscv64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								vendor/golang.org/x/sys/unix/asm_linux_riscv64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build riscv64,!gccgo | ||||
| 
 | ||||
| #include "textflag.h" | ||||
| 
 | ||||
| // | ||||
| // System calls for linux/riscv64. | ||||
| // | ||||
| // Where available, just jump to package syscall's implementation of | ||||
| // these functions. | ||||
| 
 | ||||
| TEXT ·Syscall(SB),NOSPLIT,$0-56 | ||||
| 	JMP	syscall·Syscall(SB) | ||||
| 
 | ||||
| TEXT ·Syscall6(SB),NOSPLIT,$0-80 | ||||
| 	JMP	syscall·Syscall6(SB) | ||||
| 
 | ||||
| TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 | ||||
| 	CALL	runtime·entersyscall(SB) | ||||
| 	MOV	a1+8(FP), A0 | ||||
| 	MOV	a2+16(FP), A1 | ||||
| 	MOV	a3+24(FP), A2 | ||||
| 	MOV	trap+0(FP), A7	// syscall entry | ||||
| 	ECALL | ||||
| 	MOV	A0, r1+32(FP)	// r1 | ||||
| 	MOV	A1, r2+40(FP)	// r2 | ||||
| 	CALL	runtime·exitsyscall(SB) | ||||
| 	RET | ||||
| 
 | ||||
| TEXT ·RawSyscall(SB),NOSPLIT,$0-56 | ||||
| 	JMP	syscall·RawSyscall(SB) | ||||
| 
 | ||||
| TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 | ||||
| 	JMP	syscall·RawSyscall6(SB) | ||||
| 
 | ||||
| TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 | ||||
| 	MOV	a1+8(FP), A0 | ||||
| 	MOV	a2+16(FP), A1 | ||||
| 	MOV	a3+24(FP), A2 | ||||
| 	MOV	trap+0(FP), A7	// syscall entry | ||||
| 	ECALL | ||||
| 	MOV	A0, r1+32(FP) | ||||
| 	MOV	A1, r2+40(FP) | ||||
| 	RET | ||||
							
								
								
									
										29
									
								
								vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build !gccgo | ||||
| 
 | ||||
| #include "textflag.h" | ||||
| 
 | ||||
| // | ||||
| // System call support for arm64, OpenBSD | ||||
| // | ||||
| 
 | ||||
| // Just jump to package syscall's implementation for all these functions. | ||||
| // The runtime may know about them. | ||||
| 
 | ||||
| TEXT	·Syscall(SB),NOSPLIT,$0-56 | ||||
| 	JMP	syscall·Syscall(SB) | ||||
| 
 | ||||
| TEXT	·Syscall6(SB),NOSPLIT,$0-80 | ||||
| 	JMP	syscall·Syscall6(SB) | ||||
| 
 | ||||
| TEXT	·Syscall9(SB),NOSPLIT,$0-104 | ||||
| 	JMP	syscall·Syscall9(SB) | ||||
| 
 | ||||
| TEXT	·RawSyscall(SB),NOSPLIT,$0-56 | ||||
| 	JMP	syscall·RawSyscall(SB) | ||||
| 
 | ||||
| TEXT	·RawSyscall6(SB),NOSPLIT,$0-80 | ||||
| 	JMP	syscall·RawSyscall6(SB) | ||||
							
								
								
									
										29
									
								
								vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build !gccgo | ||||
| 
 | ||||
| #include "textflag.h" | ||||
| 
 | ||||
| // | ||||
| // System call support for mips64, OpenBSD | ||||
| // | ||||
| 
 | ||||
| // Just jump to package syscall's implementation for all these functions. | ||||
| // The runtime may know about them. | ||||
| 
 | ||||
| TEXT	·Syscall(SB),NOSPLIT,$0-56 | ||||
| 	JMP	syscall·Syscall(SB) | ||||
| 
 | ||||
| TEXT	·Syscall6(SB),NOSPLIT,$0-80 | ||||
| 	JMP	syscall·Syscall6(SB) | ||||
| 
 | ||||
| TEXT	·Syscall9(SB),NOSPLIT,$0-104 | ||||
| 	JMP	syscall·Syscall9(SB) | ||||
| 
 | ||||
| TEXT	·RawSyscall(SB),NOSPLIT,$0-56 | ||||
| 	JMP	syscall·RawSyscall(SB) | ||||
| 
 | ||||
| TEXT	·RawSyscall6(SB),NOSPLIT,$0-80 | ||||
| 	JMP	syscall·RawSyscall6(SB) | ||||
							
								
								
									
										1
									
								
								vendor/golang.org/x/sys/unix/bluetooth_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/golang.org/x/sys/unix/bluetooth_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -23,6 +23,7 @@ const ( | ||||
| 	HCI_CHANNEL_USER    = 1 | ||||
| 	HCI_CHANNEL_MONITOR = 2 | ||||
| 	HCI_CHANNEL_CONTROL = 3 | ||||
| 	HCI_CHANNEL_LOGGING = 4 | ||||
| ) | ||||
| 
 | ||||
| // Socketoption Level | ||||
|  | ||||
							
								
								
									
										91
									
								
								vendor/golang.org/x/sys/unix/dirent.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										91
									
								
								vendor/golang.org/x/sys/unix/dirent.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,16 +2,101 @@ | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris | ||||
| // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import "syscall" | ||||
| import "unsafe" | ||||
| 
 | ||||
| // readInt returns the size-bytes unsigned integer in native byte order at offset off. | ||||
| func readInt(b []byte, off, size uintptr) (u uint64, ok bool) { | ||||
| 	if len(b) < int(off+size) { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	if isBigEndian { | ||||
| 		return readIntBE(b[off:], size), true | ||||
| 	} | ||||
| 	return readIntLE(b[off:], size), true | ||||
| } | ||||
| 
 | ||||
| func readIntBE(b []byte, size uintptr) uint64 { | ||||
| 	switch size { | ||||
| 	case 1: | ||||
| 		return uint64(b[0]) | ||||
| 	case 2: | ||||
| 		_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 | ||||
| 		return uint64(b[1]) | uint64(b[0])<<8 | ||||
| 	case 4: | ||||
| 		_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 | ||||
| 		return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24 | ||||
| 	case 8: | ||||
| 		_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 | ||||
| 		return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | | ||||
| 			uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 | ||||
| 	default: | ||||
| 		panic("syscall: readInt with unsupported size") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func readIntLE(b []byte, size uintptr) uint64 { | ||||
| 	switch size { | ||||
| 	case 1: | ||||
| 		return uint64(b[0]) | ||||
| 	case 2: | ||||
| 		_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 | ||||
| 		return uint64(b[0]) | uint64(b[1])<<8 | ||||
| 	case 4: | ||||
| 		_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 | ||||
| 		return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | ||||
| 	case 8: | ||||
| 		_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 | ||||
| 		return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | | ||||
| 			uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 | ||||
| 	default: | ||||
| 		panic("syscall: readInt with unsupported size") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // ParseDirent parses up to max directory entries in buf, | ||||
| // appending the names to names. It returns the number of | ||||
| // bytes consumed from buf, the number of entries added | ||||
| // to names, and the new names slice. | ||||
| func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { | ||||
| 	return syscall.ParseDirent(buf, max, names) | ||||
| 	origlen := len(buf) | ||||
| 	count = 0 | ||||
| 	for max != 0 && len(buf) > 0 { | ||||
| 		reclen, ok := direntReclen(buf) | ||||
| 		if !ok || reclen > uint64(len(buf)) { | ||||
| 			return origlen, count, names | ||||
| 		} | ||||
| 		rec := buf[:reclen] | ||||
| 		buf = buf[reclen:] | ||||
| 		ino, ok := direntIno(rec) | ||||
| 		if !ok { | ||||
| 			break | ||||
| 		} | ||||
| 		if ino == 0 { // File absent in directory. | ||||
| 			continue | ||||
| 		} | ||||
| 		const namoff = uint64(unsafe.Offsetof(Dirent{}.Name)) | ||||
| 		namlen, ok := direntNamlen(rec) | ||||
| 		if !ok || namoff+namlen > uint64(len(rec)) { | ||||
| 			break | ||||
| 		} | ||||
| 		name := rec[namoff : namoff+namlen] | ||||
| 		for i, c := range name { | ||||
| 			if c == 0 { | ||||
| 				name = name[:i] | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		// Check for useless names before allocating a string. | ||||
| 		if string(name) == "." || string(name) == ".." { | ||||
| 			continue | ||||
| 		} | ||||
| 		max-- | ||||
| 		count++ | ||||
| 		names = append(names, string(name)) | ||||
| 	} | ||||
| 	return origlen - len(buf), count, names | ||||
| } | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/sys/unix/endian_little.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/sys/unix/endian_little.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,7 +2,7 @@ | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| // | ||||
| // +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le | ||||
| // +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le riscv64 | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										6
									
								
								vendor/golang.org/x/sys/unix/errors_freebsd_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/golang.org/x/sys/unix/errors_freebsd_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -8,6 +8,7 @@ | ||||
| package unix | ||||
| 
 | ||||
| const ( | ||||
| 	DLT_HHDLC                         = 0x79 | ||||
| 	IFF_SMART                         = 0x20 | ||||
| 	IFT_1822                          = 0x2 | ||||
| 	IFT_A12MPPSWITCH                  = 0x82 | ||||
| @ -210,13 +211,18 @@ const ( | ||||
| 	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 | ||||
|  | ||||
							
								
								
									
										6
									
								
								vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -8,6 +8,7 @@ | ||||
| package unix | ||||
| 
 | ||||
| const ( | ||||
| 	DLT_HHDLC                         = 0x79 | ||||
| 	IFF_SMART                         = 0x20 | ||||
| 	IFT_1822                          = 0x2 | ||||
| 	IFT_A12MPPSWITCH                  = 0x82 | ||||
| @ -210,13 +211,18 @@ const ( | ||||
| 	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 | ||||
|  | ||||
							
								
								
									
										17
									
								
								vendor/golang.org/x/sys/unix/errors_freebsd_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								vendor/golang.org/x/sys/unix/errors_freebsd_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| // 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 | ||||
| ) | ||||
							
								
								
									
										12
									
								
								vendor/golang.org/x/sys/unix/fcntl.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/golang.org/x/sys/unix/fcntl.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -9,12 +9,11 @@ package unix | ||||
| import "unsafe" | ||||
| 
 | ||||
| // fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux | ||||
| // systems by flock_linux_32bit.go to be SYS_FCNTL64. | ||||
| // systems by fcntl_linux_32bit.go to be SYS_FCNTL64. | ||||
| var fcntl64Syscall uintptr = SYS_FCNTL | ||||
| 
 | ||||
| // FcntlInt performs a fcntl syscall on fd with the provided command and argument. | ||||
| func FcntlInt(fd uintptr, cmd, arg int) (int, error) { | ||||
| 	valptr, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(arg)) | ||||
| func fcntl(fd int, cmd, arg int) (int, error) { | ||||
| 	valptr, _, errno := Syscall(fcntl64Syscall, uintptr(fd), uintptr(cmd), uintptr(arg)) | ||||
| 	var err error | ||||
| 	if errno != 0 { | ||||
| 		err = errno | ||||
| @ -22,6 +21,11 @@ func FcntlInt(fd uintptr, cmd, arg int) (int, error) { | ||||
| 	return int(valptr), err | ||||
| } | ||||
| 
 | ||||
| // FcntlInt performs a fcntl syscall on fd with the provided command and argument. | ||||
| func FcntlInt(fd uintptr, cmd, arg int) (int, error) { | ||||
| 	return fcntl(int(fd), cmd, arg) | ||||
| } | ||||
| 
 | ||||
| // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. | ||||
| func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { | ||||
| 	_, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk))) | ||||
|  | ||||
							
								
								
									
										6
									
								
								vendor/golang.org/x/sys/unix/fcntl_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/golang.org/x/sys/unix/fcntl_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -16,3 +16,9 @@ func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { | ||||
| 	_, err := fcntl(int(fd), cmd, int(uintptr(unsafe.Pointer(lk)))) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // FcntlFstore performs a fcntl syscall for the F_PREALLOCATE command. | ||||
| func FcntlFstore(fd uintptr, cmd int, fstore *Fstore_t) error { | ||||
| 	_, err := fcntl(int(fd), cmd, int(uintptr(unsafe.Pointer(fstore)))) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
							
								
								
									
										29
									
								
								vendor/golang.org/x/sys/unix/fdset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/golang.org/x/sys/unix/fdset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| // Set adds fd to the set fds. | ||||
| func (fds *FdSet) Set(fd int) { | ||||
| 	fds.Bits[fd/NFDBITS] |= (1 << (uintptr(fd) % NFDBITS)) | ||||
| } | ||||
| 
 | ||||
| // Clear removes fd from the set fds. | ||||
| func (fds *FdSet) Clear(fd int) { | ||||
| 	fds.Bits[fd/NFDBITS] &^= (1 << (uintptr(fd) % NFDBITS)) | ||||
| } | ||||
| 
 | ||||
| // IsSet returns whether fd is in the set fds. | ||||
| func (fds *FdSet) IsSet(fd int) bool { | ||||
| 	return fds.Bits[fd/NFDBITS]&(1<<(uintptr(fd)%NFDBITS)) != 0 | ||||
| } | ||||
| 
 | ||||
| // Zero clears the set fds. | ||||
| func (fds *FdSet) Zero() { | ||||
| 	for i := range fds.Bits { | ||||
| 		fds.Bits[i] = 0 | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/sys/unix/gccgo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/sys/unix/gccgo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -12,10 +12,8 @@ import "syscall" | ||||
| // We can't use the gc-syntax .s files for gccgo. On the plus side | ||||
| // much of the functionality can be written directly in Go. | ||||
| 
 | ||||
| //extern gccgoRealSyscallNoError | ||||
| func realSyscallNoError(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r uintptr) | ||||
| 
 | ||||
| //extern gccgoRealSyscall | ||||
| func realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r, errno uintptr) | ||||
| 
 | ||||
| func SyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) { | ||||
|  | ||||
							
								
								
									
										6
									
								
								vendor/golang.org/x/sys/unix/gccgo_c.c
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/golang.org/x/sys/unix/gccgo_c.c
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -21,6 +21,9 @@ struct ret { | ||||
| 	uintptr_t err; | ||||
| }; | ||||
| 
 | ||||
| struct ret gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) | ||||
|   __asm__(GOSYM_PREFIX GOPKGPATH ".realSyscall"); | ||||
| 
 | ||||
| struct ret | ||||
| gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) | ||||
| { | ||||
| @ -32,6 +35,9 @@ gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintp | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| uintptr_t gccgoRealSyscallNoError(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) | ||||
|   __asm__(GOSYM_PREFIX GOPKGPATH ".realSyscallNoError"); | ||||
| 
 | ||||
| uintptr_t | ||||
| gccgoRealSyscallNoError(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) | ||||
| { | ||||
|  | ||||
							
								
								
									
										50
									
								
								vendor/golang.org/x/sys/unix/ioctl.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								vendor/golang.org/x/sys/unix/ioctl.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -6,7 +6,28 @@ | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import "runtime" | ||||
| import ( | ||||
| 	"runtime" | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| // ioctl itself should not be exposed directly, but additional get/set | ||||
| // functions for specific types are permissible. | ||||
| 
 | ||||
| // IoctlSetInt performs an ioctl operation which sets an integer value | ||||
| // on fd, using the specified request number. | ||||
| func IoctlSetInt(fd int, req uint, value int) error { | ||||
| 	return ioctl(fd, req, uintptr(value)) | ||||
| } | ||||
| 
 | ||||
| // IoctlSetPointerInt performs an ioctl operation which sets an | ||||
| // integer value on fd, using the specified request number. The ioctl | ||||
| // argument is called with a pointer to the integer value, rather than | ||||
| // passing the integer value directly. | ||||
| func IoctlSetPointerInt(fd int, req uint, value int) error { | ||||
| 	v := int32(value) | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(&v))) | ||||
| } | ||||
| 
 | ||||
| // IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. | ||||
| // | ||||
| @ -14,7 +35,7 @@ import "runtime" | ||||
| func IoctlSetWinsize(fd int, req uint, value *Winsize) error { | ||||
| 	// TODO: if we get the chance, remove the req parameter and | ||||
| 	// hardcode TIOCSWINSZ. | ||||
| 	err := ioctlSetWinsize(fd, req, value) | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| 	runtime.KeepAlive(value) | ||||
| 	return err | ||||
| } | ||||
| @ -24,7 +45,30 @@ func IoctlSetWinsize(fd int, req uint, value *Winsize) error { | ||||
| // The req value will usually be TCSETA or TIOCSETA. | ||||
| func IoctlSetTermios(fd int, req uint, value *Termios) error { | ||||
| 	// TODO: if we get the chance, remove the req parameter. | ||||
| 	err := ioctlSetTermios(fd, req, value) | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| 	runtime.KeepAlive(value) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // IoctlGetInt performs an ioctl operation which gets an integer value | ||||
| // from fd, using the specified request number. | ||||
| // | ||||
| // A few ioctl requests use the return value as an output parameter; | ||||
| // for those, IoctlRetInt should be used instead of this function. | ||||
| func IoctlGetInt(fd int, req uint) (int, error) { | ||||
| 	var value int | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { | ||||
| 	var value Winsize | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetTermios(fd int, req uint) (*Termios, error) { | ||||
| 	var value Termios | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
|  | ||||
							
								
								
									
										65
									
								
								vendor/golang.org/x/sys/unix/mkall.sh
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								vendor/golang.org/x/sys/unix/mkall.sh
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -50,7 +50,7 @@ if [[ "$GOOS" = "linux" ]]; then | ||||
| 	# Use the Docker-based build system | ||||
| 	# Files generated through docker (use $cmd so you can Ctl-C the build or run) | ||||
| 	$cmd docker build --tag generate:$GOOS $GOOS | ||||
| 	$cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS | ||||
| 	$cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")" && /bin/pwd):/build generate:$GOOS | ||||
| 	exit | ||||
| fi | ||||
| 
 | ||||
| @ -73,26 +73,22 @@ aix_ppc64) | ||||
| darwin_386) | ||||
| 	mkerrors="$mkerrors -m32" | ||||
| 	mksyscall="go run mksyscall.go -l32" | ||||
| 	mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs" | ||||
| 	mkasm="go run mkasm_darwin.go" | ||||
| 	;; | ||||
| darwin_amd64) | ||||
| 	mkerrors="$mkerrors -m64" | ||||
| 	mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs" | ||||
| 	mkasm="go run mkasm_darwin.go" | ||||
| 	;; | ||||
| darwin_arm) | ||||
| 	mkerrors="$mkerrors" | ||||
| 	mksyscall="go run mksyscall.go -l32" | ||||
| 	mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs" | ||||
| 	mkasm="go run mkasm_darwin.go" | ||||
| 	;; | ||||
| darwin_arm64) | ||||
| 	mkerrors="$mkerrors -m64" | ||||
| 	mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs" | ||||
| 	mkasm="go run mkasm_darwin.go" | ||||
| 	;; | ||||
| @ -105,26 +101,26 @@ dragonfly_amd64) | ||||
| freebsd_386) | ||||
| 	mkerrors="$mkerrors -m32" | ||||
| 	mksyscall="go run mksyscall.go -l32" | ||||
| 	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" | ||||
| 	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs" | ||||
| 	;; | ||||
| freebsd_amd64) | ||||
| 	mkerrors="$mkerrors -m64" | ||||
| 	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" | ||||
| 	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs" | ||||
| 	;; | ||||
| freebsd_arm) | ||||
| 	mkerrors="$mkerrors" | ||||
| 	mksyscall="go run mksyscall.go -l32 -arm" | ||||
| 	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" | ||||
| 	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" | ||||
| 	# 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" | ||||
| 	;; | ||||
| freebsd_arm64) | ||||
| 	mkerrors="$mkerrors -m64" | ||||
| 	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs" | ||||
| 	mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" | ||||
| 	;; | ||||
| netbsd_386) | ||||
| 	mkerrors="$mkerrors -m32" | ||||
| @ -146,24 +142,48 @@ netbsd_arm) | ||||
| 	# API consistent across platforms. | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" | ||||
| 	;; | ||||
| netbsd_arm64) | ||||
| 	mkerrors="$mkerrors -m64" | ||||
| 	mksyscall="go run mksyscall.go -netbsd" | ||||
| 	mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'" | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs" | ||||
| 	;; | ||||
| openbsd_386) | ||||
| 	mkerrors="$mkerrors -m32" | ||||
| 	mksyscall="go run mksyscall.go -l32 -openbsd" | ||||
| 	mksysctl="./mksysctl_openbsd.pl" | ||||
| 	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" | ||||
| 	;; | ||||
| openbsd_amd64) | ||||
| 	mkerrors="$mkerrors -m64" | ||||
| 	mksyscall="go run mksyscall.go -openbsd" | ||||
| 	mksysctl="./mksysctl_openbsd.pl" | ||||
| 	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" | ||||
| 	;; | ||||
| openbsd_arm) | ||||
| 	mkerrors="$mkerrors" | ||||
| 	mksyscall="go run mksyscall.go -l32 -openbsd -arm" | ||||
| 	mksysctl="./mksysctl_openbsd.pl" | ||||
| 	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 | ||||
| 	# API consistent across platforms. | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" | ||||
| 	;; | ||||
| openbsd_arm64) | ||||
| 	mkerrors="$mkerrors -m64" | ||||
| 	mksyscall="go run mksyscall.go -openbsd" | ||||
| 	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 | ||||
| 	# API consistent across platforms. | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" | ||||
| 	;; | ||||
| openbsd_mips64) | ||||
| 	mkerrors="$mkerrors -m64" | ||||
| 	mksyscall="go run mksyscall.go -openbsd" | ||||
| 	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 | ||||
| 	# API consistent across platforms. | ||||
| @ -175,6 +195,12 @@ solaris_amd64) | ||||
| 	mksysnum= | ||||
| 	mktypes="GOARCH=$GOARCH go tool cgo -godefs" | ||||
| 	;; | ||||
| illumos_amd64) | ||||
|         mksyscall="go run mksyscall_solaris.go" | ||||
| 	mkerrors= | ||||
| 	mksysnum= | ||||
| 	mktypes= | ||||
| 	;; | ||||
| *) | ||||
| 	echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 | ||||
| 	exit 1 | ||||
| @ -196,10 +222,15 @@ esac | ||||
| 				# 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 " ; | ||||
| 			elif [ "$GOOS" == "darwin" ]; then | ||||
| 			        # pre-1.12, direct syscalls | ||||
| 			        echo "$mksyscall -tags $GOOS,$GOARCH,!go1.12 $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.1_11.go"; | ||||
| 			        # 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 | ||||
| 			        # illumos code generation requires a --illumos switch | ||||
| 			        echo "$mksyscall -illumos -tags illumos,$GOARCH syscall_illumos.go |gofmt > zsyscall_illumos_$GOARCH.go"; | ||||
| 			        # illumos implies solaris, so solaris code generation is also required | ||||
| 				echo "$mksyscall -tags solaris,$GOARCH syscall_solaris.go syscall_solaris_$GOARCH.go |gofmt >zsyscall_solaris_$GOARCH.go"; | ||||
| 			else | ||||
| 				echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; | ||||
| 			fi | ||||
| @ -207,8 +238,6 @@ esac | ||||
| 	esac | ||||
| 	if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; 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"; | ||||
| 	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 | ||||
| 	fi | ||||
| ) | $run | ||||
|  | ||||
							
								
								
									
										95
									
								
								vendor/golang.org/x/sys/unix/mkerrors.sh
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										95
									
								
								vendor/golang.org/x/sys/unix/mkerrors.sh
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -44,6 +44,7 @@ includes_AIX=' | ||||
| #include <sys/stropts.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/poll.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/termio.h> | ||||
| #include <termios.h> | ||||
| #include <fcntl.h> | ||||
| @ -57,9 +58,11 @@ includes_Darwin=' | ||||
| #define _DARWIN_USE_64_BIT_INODE | ||||
| #include <stdint.h> | ||||
| #include <sys/attr.h> | ||||
| #include <sys/clonefile.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/event.h> | ||||
| #include <sys/ptrace.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/sockio.h> | ||||
| #include <sys/sysctl.h> | ||||
| @ -80,6 +83,7 @@ includes_Darwin=' | ||||
| includes_DragonFly=' | ||||
| #include <sys/types.h> | ||||
| #include <sys/event.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/sockio.h> | ||||
| #include <sys/stat.h> | ||||
| @ -102,7 +106,10 @@ includes_FreeBSD=' | ||||
| #include <sys/capsicum.h> | ||||
| #include <sys/param.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/disk.h> | ||||
| #include <sys/event.h> | ||||
| #include <sys/sched.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/sockio.h> | ||||
| #include <sys/stat.h> | ||||
| @ -179,48 +186,65 @@ struct ltchars { | ||||
| #include <sys/stat.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/signalfd.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/timerfd.h> | ||||
| #include <sys/uio.h> | ||||
| #include <sys/xattr.h> | ||||
| #include <linux/bpf.h> | ||||
| #include <linux/can.h> | ||||
| #include <linux/can/error.h> | ||||
| #include <linux/can/raw.h> | ||||
| #include <linux/capability.h> | ||||
| #include <linux/cryptouser.h> | ||||
| #include <linux/devlink.h> | ||||
| #include <linux/dm-ioctl.h> | ||||
| #include <linux/errqueue.h> | ||||
| #include <linux/falloc.h> | ||||
| #include <linux/fanotify.h> | ||||
| #include <linux/filter.h> | ||||
| #include <linux/fs.h> | ||||
| #include <linux/fscrypt.h> | ||||
| #include <linux/fsverity.h> | ||||
| #include <linux/genetlink.h> | ||||
| #include <linux/hdreg.h> | ||||
| #include <linux/icmpv6.h> | ||||
| #include <linux/if.h> | ||||
| #include <linux/if_addr.h> | ||||
| #include <linux/if_alg.h> | ||||
| #include <linux/if_arp.h> | ||||
| #include <linux/if_ether.h> | ||||
| #include <linux/if_ppp.h> | ||||
| #include <linux/if_tun.h> | ||||
| #include <linux/if_packet.h> | ||||
| #include <linux/if_addr.h> | ||||
| #include <linux/falloc.h> | ||||
| #include <linux/filter.h> | ||||
| #include <linux/fs.h> | ||||
| #include <linux/if_xdp.h> | ||||
| #include <linux/kexec.h> | ||||
| #include <linux/keyctl.h> | ||||
| #include <linux/loop.h> | ||||
| #include <linux/magic.h> | ||||
| #include <linux/memfd.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/netfilter/nfnetlink.h> | ||||
| #include <linux/netlink.h> | ||||
| #include <linux/net_namespace.h> | ||||
| #include <linux/nsfs.h> | ||||
| #include <linux/perf_event.h> | ||||
| #include <linux/ptrace.h> | ||||
| #include <linux/random.h> | ||||
| #include <linux/reboot.h> | ||||
| #include <linux/rtc.h> | ||||
| #include <linux/rtnetlink.h> | ||||
| #include <linux/ptrace.h> | ||||
| #include <linux/sched.h> | ||||
| #include <linux/seccomp.h> | ||||
| #include <linux/sockios.h> | ||||
| #include <linux/wait.h> | ||||
| #include <linux/icmpv6.h> | ||||
| #include <linux/serial.h> | ||||
| #include <linux/can.h> | ||||
| #include <linux/vm_sockets.h> | ||||
| #include <linux/sockios.h> | ||||
| #include <linux/taskstats.h> | ||||
| #include <linux/genetlink.h> | ||||
| #include <linux/tipc.h> | ||||
| #include <linux/vm_sockets.h> | ||||
| #include <linux/wait.h> | ||||
| #include <linux/watchdog.h> | ||||
| #include <linux/hdreg.h> | ||||
| #include <linux/rtc.h> | ||||
| #include <linux/if_xdp.h> | ||||
| 
 | ||||
| #include <mtd/ubi-user.h> | ||||
| #include <net/route.h> | ||||
| 
 | ||||
| @ -259,6 +283,16 @@ struct ltchars { | ||||
| #define FS_KEY_DESC_PREFIX              "fscrypt:" | ||||
| #define FS_KEY_DESC_PREFIX_SIZE         8 | ||||
| #define FS_MAX_KEY_SIZE                 64 | ||||
| 
 | ||||
| // The code generator produces -0x1 for (~0), but an unsigned value is necessary | ||||
| // for the tipc_subscr timeout __u32 field. | ||||
| #undef TIPC_WAIT_FOREVER | ||||
| #define TIPC_WAIT_FOREVER 0xffffffff | ||||
| 
 | ||||
| // Copied from linux/l2tp.h | ||||
| // Including linux/l2tp.h here causes conflicts between linux/in.h | ||||
| // and netinet/in.h included via net/route.h above. | ||||
| #define IPPROTO_L2TP		115 | ||||
| ' | ||||
| 
 | ||||
| includes_NetBSD=' | ||||
| @ -268,6 +302,8 @@ includes_NetBSD=' | ||||
| #include <sys/extattr.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/mount.h> | ||||
| #include <sys/sched.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/sockio.h> | ||||
| #include <sys/sysctl.h> | ||||
| @ -294,6 +330,8 @@ includes_OpenBSD=' | ||||
| #include <sys/event.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/mount.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/sched.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/sockio.h> | ||||
| #include <sys/stat.h> | ||||
| @ -330,6 +368,7 @@ includes_OpenBSD=' | ||||
| includes_SunOS=' | ||||
| #include <limits.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/sockio.h> | ||||
| #include <sys/stat.h> | ||||
| @ -422,6 +461,7 @@ ccflags="$@" | ||||
| 		$2 == "XCASE" || | ||||
| 		$2 == "ALTWERASE" || | ||||
| 		$2 == "NOKERNINFO" || | ||||
| 		$2 == "NFDBITS" || | ||||
| 		$2 ~ /^PAR/ || | ||||
| 		$2 ~ /^SIG[^_]/ || | ||||
| 		$2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || | ||||
| @ -431,7 +471,9 @@ ccflags="$@" | ||||
| 		$2 ~ /^TC[IO](ON|OFF)$/ || | ||||
| 		$2 ~ /^IN_/ || | ||||
| 		$2 ~ /^LOCK_(SH|EX|NB|UN)$/ || | ||||
| 		$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || | ||||
| 		$2 ~ /^LO_(KEY|NAME)_SIZE$/ || | ||||
| 		$2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || | ||||
| 		$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|MCAST|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || | ||||
| 		$2 ~ /^TP_STATUS_/ || | ||||
| 		$2 ~ /^FALLOC_/ || | ||||
| 		$2 == "ICMPV6_FILTER" || | ||||
| @ -444,13 +486,15 @@ ccflags="$@" | ||||
| 		$2 ~ /^SYSCTL_VERS/ || | ||||
| 		$2 !~ "MNT_BITS" && | ||||
| 		$2 ~ /^(MS|MNT|UMOUNT)_/ || | ||||
| 		$2 ~ /^NS_GET_/ || | ||||
| 		$2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || | ||||
| 		$2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT)_/ || | ||||
| 		$2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT|TFD)_/ || | ||||
| 		$2 ~ /^KEXEC_/ || | ||||
| 		$2 ~ /^LINUX_REBOOT_CMD_/ || | ||||
| 		$2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || | ||||
| 		$2 ~ /^MODULE_INIT_/ || | ||||
| 		$2 !~ "NLA_TYPE_MASK" && | ||||
| 		$2 !~ /^RTC_VL_(ACCURACY|BACKUP|DATA)/ && | ||||
| 		$2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ || | ||||
| 		$2 ~ /^SIOC/ || | ||||
| 		$2 ~ /^TIOC/ || | ||||
| @ -458,19 +502,27 @@ ccflags="$@" | ||||
| 		$2 ~ /^TCSET/ || | ||||
| 		$2 ~ /^TC(FLSH|SBRKP?|XONC)$/ || | ||||
| 		$2 !~ "RTF_BITS" && | ||||
| 		$2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || | ||||
| 		$2 ~ /^(IFF|IFT|NET_RT|RTM(GRP)?|RTF|RTV|RTA|RTAX)_/ || | ||||
| 		$2 ~ /^BIOC/ || | ||||
| 		$2 ~ /^DIOC/ || | ||||
| 		$2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || | ||||
| 		$2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || | ||||
| 		$2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || | ||||
| 		$2 ~ /^CLONE_[A-Z_]+/ || | ||||
| 		$2 !~ /^(BPF_TIMEVAL)$/ && | ||||
| 		$2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ && | ||||
| 		$2 ~ /^(BPF|DLT)_/ || | ||||
| 		$2 ~ /^(CLOCK|TIMER)_/ || | ||||
| 		$2 ~ /^CAN_/ || | ||||
| 		$2 ~ /^CAP_/ || | ||||
| 		$2 ~ /^CP_/ || | ||||
| 		$2 ~ /^CPUSTATES$/ || | ||||
| 		$2 ~ /^ALG_/ || | ||||
| 		$2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || | ||||
| 		$2 ~ /^FI(CLONE|DEDUPERANGE)/ || | ||||
| 		$2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE)/ || | ||||
| 		$2 ~ /^FS_IOC_.*(ENCRYPTION|VERITY|[GS]ETFLAGS)/ || | ||||
| 		$2 ~ /^FS_VERITY_/ || | ||||
| 		$2 ~ /^FSCRYPT_/ || | ||||
| 		$2 ~ /^DM_/ || | ||||
| 		$2 ~ /^GRND_/ || | ||||
| 		$2 ~ /^RND/ || | ||||
| 		$2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || | ||||
| @ -497,10 +549,15 @@ ccflags="$@" | ||||
| 		$2 ~ /^WDIOC_/ || | ||||
| 		$2 ~ /^NFN/ || | ||||
| 		$2 ~ /^XDP_/ || | ||||
| 		$2 ~ /^RWF_/ || | ||||
| 		$2 ~ /^(HDIO|WIN|SMART)_/ || | ||||
| 		$2 ~ /^CRYPTO_/ || | ||||
| 		$2 ~ /^TIPC_/ || | ||||
| 		$2 ~ /^DEVLINK_/ || | ||||
| 		$2 !~ "WMESGLEN" && | ||||
| 		$2 ~ /^W[A-Z0-9]+$/ || | ||||
| 		$2 ~/^PPPIOC/ || | ||||
| 		$2 ~ /^FAN_|FANOTIFY_/ || | ||||
| 		$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} | ||||
| 		$2 ~ /^__WCOREFLAG$/ {next} | ||||
| 		$2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} | ||||
|  | ||||
							
								
								
									
										265
									
								
								vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										265
									
								
								vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,265 +0,0 @@ | ||||
| #!/usr/bin/env perl | ||||
| 
 | ||||
| # Copyright 2011 The Go Authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style | ||||
| # license that can be found in the LICENSE file. | ||||
| 
 | ||||
| # | ||||
| # 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. | ||||
| # | ||||
| 
 | ||||
| use strict; | ||||
| 
 | ||||
| if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { | ||||
| 	print STDERR "GOARCH or GOOS not defined in environment\n"; | ||||
| 	exit 1; | ||||
| } | ||||
| 
 | ||||
| my $debug = 0; | ||||
| my %ctls = (); | ||||
| 
 | ||||
| my @headers = qw ( | ||||
| 	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/pim_var.h | ||||
| 	netinet/tcp_var.h | ||||
| 	netinet/udp_var.h | ||||
| 	netinet6/in6.h | ||||
| 	netinet6/ip6_divert.h | ||||
| 	netinet6/pim6_var.h | ||||
| 	netinet/icmp6.h | ||||
| 	netmpls/mpls.h | ||||
| ); | ||||
| 
 | ||||
| my @ctls = qw ( | ||||
| 	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.pim | ||||
| 	net.inet.tcp | ||||
| 	net.inet.udp | ||||
| 	net.inet6 | ||||
| 	net.inet6.divert | ||||
| 	net.inet6.ip6 | ||||
| 	net.inet6.icmp6 | ||||
| 	net.inet6.pim6 | ||||
| 	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" | ||||
| my %ctl_map = ( | ||||
| 	"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 | ||||
| my %node_map = ( | ||||
| 	"net.inet.ip.ifq" => "net.ifq", | ||||
| 	"net.inet.pfsync" => "net.pfsync", | ||||
| 	"net.mpls.ifq" => "net.ifq" | ||||
| ); | ||||
| 
 | ||||
| my $ctlname; | ||||
| my %mib = (); | ||||
| my %sysctl = (); | ||||
| my $node; | ||||
| 
 | ||||
| sub debug() { | ||||
| 	print STDERR "$_[0]\n" if $debug; | ||||
| } | ||||
| 
 | ||||
| # Walk the MIB and build a sysctl name to OID mapping. | ||||
| sub build_sysctl() { | ||||
| 	my ($node, $name, $oid) = @_; | ||||
| 	my %node = %{$node}; | ||||
| 	my @oid = @{$oid}; | ||||
| 
 | ||||
| 	foreach my $key (sort keys %node) { | ||||
| 		my @node = @{$node{$key}}; | ||||
| 		my $nodename = $name.($name ne '' ? '.' : '').$key; | ||||
| 		my @nodeoid = (@oid, $node[0]); | ||||
| 		if ($node[1] eq 'CTLTYPE_NODE') { | ||||
| 			if (exists $node_map{$nodename}) { | ||||
| 				$node = \%mib; | ||||
| 				$ctlname = $node_map{$nodename}; | ||||
| 				foreach my $part (split /\./, $ctlname) { | ||||
| 					$node = \%{@{$$node{$part}}[2]}; | ||||
| 				} | ||||
| 			} else { | ||||
| 				$node = $node[2]; | ||||
| 			} | ||||
| 			&build_sysctl($node, $nodename, \@nodeoid); | ||||
| 		} elsif ($node[1] ne '') { | ||||
| 			$sysctl{$nodename} = \@nodeoid; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| foreach my $ctl (@ctls) { | ||||
| 	$ctls{$ctl} = $ctl; | ||||
| } | ||||
| 
 | ||||
| # Build MIB | ||||
| foreach my $header (@headers) { | ||||
| 	&debug("Processing $header..."); | ||||
| 	open HEADER, "/usr/include/$header" || | ||||
| 	    print STDERR "Failed to open $header\n"; | ||||
| 	while (<HEADER>) { | ||||
| 		if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ || | ||||
| 		    $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ || | ||||
| 		    $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) { | ||||
| 			if ($1 eq 'CTL_NAMES') { | ||||
| 				# Top level. | ||||
| 				$node = \%mib; | ||||
| 			} else { | ||||
| 				# Node. | ||||
| 				my $nodename = lc($2); | ||||
| 				if ($header =~ /^netinet\//) { | ||||
| 					$ctlname = "net.inet.$nodename"; | ||||
| 				} elsif ($header =~ /^netinet6\//) { | ||||
| 					$ctlname = "net.inet6.$nodename"; | ||||
| 				} elsif ($header =~ /^net\//) { | ||||
| 					$ctlname = "net.$nodename"; | ||||
| 				} else { | ||||
| 					$ctlname = "$nodename"; | ||||
| 					$ctlname =~ s/^(fs|net|kern)_/$1\./; | ||||
| 				} | ||||
| 				if (exists $ctl_map{$ctlname}) { | ||||
| 					$ctlname = $ctl_map{$ctlname}; | ||||
| 				} | ||||
| 				if (not exists $ctls{$ctlname}) { | ||||
| 					&debug("Ignoring $ctlname..."); | ||||
| 					next; | ||||
| 				} | ||||
| 
 | ||||
| 				# Walk down from the top of the MIB. | ||||
| 				$node = \%mib; | ||||
| 				foreach my $part (split /\./, $ctlname) { | ||||
| 					if (not exists $$node{$part}) { | ||||
| 						&debug("Missing node $part"); | ||||
| 						$$node{$part} = [ 0, '', {} ]; | ||||
| 					} | ||||
| 					$node = \%{@{$$node{$part}}[2]}; | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			# Populate current node with entries. | ||||
| 			my $i = -1; | ||||
| 			while (defined($_) && $_ !~ /^}/) { | ||||
| 				$_ = <HEADER>; | ||||
| 				$i++ if $_ =~ /{.*}/; | ||||
| 				next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/; | ||||
| 				$$node{$1} = [ $i, $2, {} ]; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	close HEADER; | ||||
| } | ||||
| 
 | ||||
| &build_sysctl(\%mib, "", []); | ||||
| 
 | ||||
| print <<EOF; | ||||
| // mksysctl_openbsd.pl | ||||
| // Code generated by the command above; DO NOT EDIT. | ||||
| 
 | ||||
| // +build $ENV{'GOARCH'},$ENV{'GOOS'} | ||||
| 
 | ||||
| package unix; | ||||
| 
 | ||||
| type mibentry struct { | ||||
| 	ctlname string | ||||
| 	ctloid []_C_int | ||||
| } | ||||
| 
 | ||||
| var sysctlMib = []mibentry { | ||||
| EOF | ||||
| 
 | ||||
| foreach my $name (sort keys %sysctl) { | ||||
| 	my @oid = @{$sysctl{$name}}; | ||||
| 	print "\t{ \"$name\", []_C_int{ ", join(', ', @oid), " } }, \n"; | ||||
| } | ||||
| 
 | ||||
| print <<EOF; | ||||
| } | ||||
| EOF | ||||
| @ -2,9 +2,6 @@ | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build openbsd | ||||
| // +build 386 amd64 arm | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import ( | ||||
							
								
								
									
										12
									
								
								vendor/golang.org/x/sys/unix/readdirent_getdents.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/golang.org/x/sys/unix/readdirent_getdents.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build aix dragonfly freebsd linux netbsd openbsd | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| // ReadDirent reads directory entries from fd and writes them into buf. | ||||
| func ReadDirent(fd int, buf []byte) (n int, err error) { | ||||
| 	return Getdents(fd, buf) | ||||
| } | ||||
							
								
								
									
										19
									
								
								vendor/golang.org/x/sys/unix/readdirent_getdirentries.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/golang.org/x/sys/unix/readdirent_getdirentries.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build darwin | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import "unsafe" | ||||
| 
 | ||||
| // ReadDirent reads directory entries from fd and writes them into buf. | ||||
| func ReadDirent(fd int, buf []byte) (n int, err error) { | ||||
| 	// Final argument is (basep *uintptr) and the syscall doesn't take nil. | ||||
| 	// 64 bits should be enough. (32 bits isn't even on 386). Since the | ||||
| 	// actual system call is getdirentries64, 64 is a good guess. | ||||
| 	// TODO(rsc): Can we use a single global basep for all calls? | ||||
| 	var base = (*uintptr)(unsafe.Pointer(new(uint64))) | ||||
| 	return Getdirentries(fd, buf, base) | ||||
| } | ||||
							
								
								
									
										16
									
								
								vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| // Round the length of a raw sockaddr up to align it properly. | ||||
| func cmsgAlignOf(salen int) int { | ||||
| 	salign := SizeofPtr | ||||
| 	if SizeofPtr == 8 && !supportsABI(_dragonflyABIChangeVersion) { | ||||
| 		// 64-bit Dragonfly before the September 2019 ABI changes still requires | ||||
| 		// 32-bit aligned access to network subsystem. | ||||
| 		salign = 4 | ||||
| 	} | ||||
| 	return (salen + salign - 1) & ^(salign - 1) | ||||
| } | ||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/sys/unix/sockcmsg_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/sys/unix/sockcmsg_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -17,7 +17,7 @@ func UnixCredentials(ucred *Ucred) []byte { | ||||
| 	h.Level = SOL_SOCKET | ||||
| 	h.Type = SCM_CREDENTIALS | ||||
| 	h.SetLen(CmsgLen(SizeofUcred)) | ||||
| 	*((*Ucred)(cmsgData(h))) = *ucred | ||||
| 	*(*Ucred)(h.data(0)) = *ucred | ||||
| 	return b | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										33
									
								
								vendor/golang.org/x/sys/unix/sockcmsg_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/golang.org/x/sys/unix/sockcmsg_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -9,32 +9,9 @@ | ||||
| package unix | ||||
| 
 | ||||
| import ( | ||||
| 	"runtime" | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| // Round the length of a raw sockaddr up to align it properly. | ||||
| func cmsgAlignOf(salen int) int { | ||||
| 	salign := SizeofPtr | ||||
| 
 | ||||
| 	switch runtime.GOOS { | ||||
| 	case "darwin", "dragonfly", "solaris": | ||||
| 		// NOTE: It seems like 64-bit Darwin, DragonFly BSD and | ||||
| 		// Solaris kernels still require 32-bit aligned access to | ||||
| 		// network subsystem. | ||||
| 		if SizeofPtr == 8 { | ||||
| 			salign = 4 | ||||
| 		} | ||||
| 	case "openbsd": | ||||
| 		// OpenBSD armv7 requires 64-bit alignment. | ||||
| 		if runtime.GOARCH == "arm" { | ||||
| 			salign = 8 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return (salen + salign - 1) & ^(salign - 1) | ||||
| } | ||||
| 
 | ||||
| // CmsgLen returns the value to store in the Len field of the Cmsghdr | ||||
| // structure, taking into account any necessary alignment. | ||||
| func CmsgLen(datalen int) int { | ||||
| @ -47,8 +24,8 @@ func CmsgSpace(datalen int) int { | ||||
| 	return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen) | ||||
| } | ||||
| 
 | ||||
| func cmsgData(h *Cmsghdr) unsafe.Pointer { | ||||
| 	return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr))) | ||||
| func (h *Cmsghdr) data(offset uintptr) unsafe.Pointer { | ||||
| 	return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr)) + offset) | ||||
| } | ||||
| 
 | ||||
| // SocketControlMessage represents a socket control message. | ||||
| @ -91,10 +68,8 @@ func UnixRights(fds ...int) []byte { | ||||
| 	h.Level = SOL_SOCKET | ||||
| 	h.Type = SCM_RIGHTS | ||||
| 	h.SetLen(CmsgLen(datalen)) | ||||
| 	data := cmsgData(h) | ||||
| 	for _, fd := range fds { | ||||
| 		*(*int32)(data) = int32(fd) | ||||
| 		data = unsafe.Pointer(uintptr(data) + 4) | ||||
| 	for i, fd := range fds { | ||||
| 		*(*int32)(h.data(4 * uintptr(i))) = int32(fd) | ||||
| 	} | ||||
| 	return b | ||||
| } | ||||
|  | ||||
							
								
								
									
										42
									
								
								vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build aix darwin freebsd linux netbsd openbsd solaris | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import ( | ||||
| 	"runtime" | ||||
| ) | ||||
| 
 | ||||
| // Round the length of a raw sockaddr up to align it properly. | ||||
| func cmsgAlignOf(salen int) int { | ||||
| 	salign := SizeofPtr | ||||
| 
 | ||||
| 	// dragonfly needs to check ABI version at runtime, see cmsgAlignOf in | ||||
| 	// sockcmsg_dragonfly.go | ||||
| 	switch runtime.GOOS { | ||||
| 	case "aix": | ||||
| 		// There is no alignment on AIX. | ||||
| 		salign = 1 | ||||
| 	case "darwin", "ios", "illumos", "solaris": | ||||
| 		// NOTE: It seems like 64-bit Darwin, Illumos and Solaris | ||||
| 		// kernels still require 32-bit aligned access to network | ||||
| 		// subsystem. | ||||
| 		if SizeofPtr == 8 { | ||||
| 			salign = 4 | ||||
| 		} | ||||
| 	case "netbsd", "openbsd": | ||||
| 		// NetBSD and OpenBSD armv7 require 64-bit alignment. | ||||
| 		if runtime.GOARCH == "arm" { | ||||
| 			salign = 8 | ||||
| 		} | ||||
| 		// NetBSD aarch64 requires 128-bit alignment. | ||||
| 		if runtime.GOOS == "netbsd" && runtime.GOARCH == "arm64" { | ||||
| 			salign = 16 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return (salen + salign - 1) & ^(salign - 1) | ||||
| } | ||||
							
								
								
									
										1
									
								
								vendor/golang.org/x/sys/unix/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/golang.org/x/sys/unix/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -50,5 +50,4 @@ func BytePtrFromString(s string) (*byte, error) { | ||||
| } | ||||
| 
 | ||||
| // Single-word zero for use when we need a valid pointer to 0 bytes. | ||||
| // See mkunix.pl. | ||||
| var _zero uintptr | ||||
|  | ||||
							
								
								
									
										87
									
								
								vendor/golang.org/x/sys/unix/syscall_aix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										87
									
								
								vendor/golang.org/x/sys/unix/syscall_aix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -280,8 +280,24 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| 	return -1, ENOSYS | ||||
| } | ||||
| 
 | ||||
| func direntIno(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) | ||||
| } | ||||
| 
 | ||||
| func direntReclen(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) | ||||
| } | ||||
| 
 | ||||
| func direntNamlen(buf []byte) (uint64, bool) { | ||||
| 	reclen, ok := direntReclen(buf) | ||||
| 	if !ok { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true | ||||
| } | ||||
| 
 | ||||
| //sys	getdirent(fd int, buf []byte) (n int, err error) | ||||
| func ReadDirent(fd int, buf []byte) (n int, err error) { | ||||
| func Getdents(fd int, buf []byte) (n int, err error) { | ||||
| 	return getdirent(fd, buf) | ||||
| } | ||||
| 
 | ||||
| @ -334,49 +350,12 @@ func (w WaitStatus) Signal() Signal { | ||||
| 
 | ||||
| func (w WaitStatus) Continued() bool { return w&0x01000000 != 0 } | ||||
| 
 | ||||
| func (w WaitStatus) CoreDump() bool { return w&0x200 != 0 } | ||||
| func (w WaitStatus) CoreDump() bool { return w&0x80 == 0x80 } | ||||
| 
 | ||||
| func (w WaitStatus) TrapCause() int { return -1 } | ||||
| 
 | ||||
| //sys	ioctl(fd int, req uint, arg uintptr) (err error) | ||||
| 
 | ||||
| // ioctl itself should not be exposed directly, but additional get/set | ||||
| // functions for specific types are permissible. | ||||
| 
 | ||||
| // IoctlSetInt performs an ioctl operation which sets an integer value | ||||
| // on fd, using the specified request number. | ||||
| func IoctlSetInt(fd int, req uint, value int) error { | ||||
| 	return ioctl(fd, req, uintptr(value)) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetWinsize(fd int, req uint, value *Winsize) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetTermios(fd int, req uint, value *Termios) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| // IoctlGetInt performs an ioctl operation which gets an integer value | ||||
| // from fd, using the specified request number. | ||||
| func IoctlGetInt(fd int, req uint) (int, error) { | ||||
| 	var value int | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { | ||||
| 	var value Winsize | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetTermios(fd int, req uint) (*Termios, error) { | ||||
| 	var value Termios | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| // fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX | ||||
| // There is no way to create a custom fcntl and to keep //sys fcntl easily, | ||||
| // Therefore, the programmer must call dup2 instead of fcntl in this case. | ||||
| @ -444,8 +423,6 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) { | ||||
| //sysnb	Times(tms *Tms) (ticks uintptr, err error) | ||||
| //sysnb	Umask(mask int) (oldmask int) | ||||
| //sysnb	Uname(buf *Utsname) (err error) | ||||
| //TODO umount | ||||
| // //sys	Unmount(target string, flags int) (err error) = umount | ||||
| //sys   Unlink(path string) (err error) | ||||
| //sys   Unlinkat(dirfd int, path string, flags int) (err error) | ||||
| //sys	Ustat(dev int, ubuf *Ustat_t) (err error) | ||||
| @ -456,8 +433,8 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) { | ||||
| //sys	Dup2(oldfd int, newfd int) (err error) | ||||
| //sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64 | ||||
| //sys	Fchown(fd int, uid int, gid int) (err error) | ||||
| //sys	Fstat(fd int, stat *Stat_t) (err error) | ||||
| //sys	Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = fstatat | ||||
| //sys	fstat(fd int, stat *Stat_t) (err error) | ||||
| //sys	fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = fstatat | ||||
| //sys	Fstatfs(fd int, buf *Statfs_t) (err error) | ||||
| //sys	Ftruncate(fd int, length int64) (err error) | ||||
| //sysnb	Getegid() (egid int) | ||||
| @ -466,18 +443,17 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) { | ||||
| //sysnb	Getuid() (uid int) | ||||
| //sys	Lchown(path string, uid int, gid int) (err error) | ||||
| //sys	Listen(s int, n int) (err error) | ||||
| //sys	Lstat(path string, stat *Stat_t) (err error) | ||||
| //sys	lstat(path string, stat *Stat_t) (err error) | ||||
| //sys	Pause() (err error) | ||||
| //sys	Pread(fd int, p []byte, offset int64) (n int, err error) = pread64 | ||||
| //sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 | ||||
| //TODO Select | ||||
| // //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) | ||||
| //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) | ||||
| //sys	Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) | ||||
| //sysnb	Setregid(rgid int, egid int) (err error) | ||||
| //sysnb	Setreuid(ruid int, euid int) (err error) | ||||
| //sys	Shutdown(fd int, how int) (err error) | ||||
| //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) | ||||
| //sys	Stat(path string, stat *Stat_t) (err error) | ||||
| //sys	stat(path string, statptr *Stat_t) (err error) | ||||
| //sys	Statfs(path string, buf *Statfs_t) (err error) | ||||
| //sys	Truncate(path string, length int64) (err error) | ||||
| 
 | ||||
| @ -493,8 +469,10 @@ func IoctlGetTermios(fd int, req uint) (*Termios, 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) | ||||
| 
 | ||||
| // In order to use msghdr structure with Control, Controllen, nrecvmsg and nsendmsg must be used. | ||||
| //sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = nrecvmsg | ||||
| //sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg | ||||
| 
 | ||||
| //sys	munmap(addr uintptr, length uintptr) (err error) | ||||
| 
 | ||||
| @ -545,3 +523,14 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { | ||||
| //sys	gettimeofday(tv *Timeval, tzp *Timezone) (err error) | ||||
| //sysnb	Time(t *Time_t) (tt Time_t, err error) | ||||
| //sys	Utime(path string, buf *Utimbuf) (err error) | ||||
| 
 | ||||
| //sys	Getsystemcfg(label int) (n uint64) | ||||
| 
 | ||||
| //sys	umount(target string) (err error) | ||||
| func Unmount(target string, flags int) (err error) { | ||||
| 	if flags != 0 { | ||||
| 		// AIX doesn't have any flags for umount. | ||||
| 		return ENOSYS | ||||
| 	} | ||||
| 	return umount(target) | ||||
| } | ||||
|  | ||||
							
								
								
									
										20
									
								
								vendor/golang.org/x/sys/unix/syscall_aix_ppc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/golang.org/x/sys/unix/syscall_aix_ppc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -29,6 +29,26 @@ func (msghdr *Msghdr) SetControllen(length int) { | ||||
| 	msghdr.Controllen = uint32(length) | ||||
| } | ||||
| 
 | ||||
| func (msghdr *Msghdr) SetIovlen(length int) { | ||||
| 	msghdr.Iovlen = int32(length) | ||||
| } | ||||
| 
 | ||||
| func (cmsg *Cmsghdr) SetLen(length int) { | ||||
| 	cmsg.Len = uint32(length) | ||||
| } | ||||
| 
 | ||||
| func Fstat(fd int, stat *Stat_t) error { | ||||
| 	return fstat(fd, stat) | ||||
| } | ||||
| 
 | ||||
| func Fstatat(dirfd int, path string, stat *Stat_t, flags int) error { | ||||
| 	return fstatat(dirfd, path, stat, flags) | ||||
| } | ||||
| 
 | ||||
| func Lstat(path string, stat *Stat_t) error { | ||||
| 	return lstat(path, stat) | ||||
| } | ||||
| 
 | ||||
| func Stat(path string, statptr *Stat_t) error { | ||||
| 	return stat(path, statptr) | ||||
| } | ||||
|  | ||||
							
								
								
									
										51
									
								
								vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -29,6 +29,57 @@ func (msghdr *Msghdr) SetControllen(length int) { | ||||
| 	msghdr.Controllen = uint32(length) | ||||
| } | ||||
| 
 | ||||
| func (msghdr *Msghdr) SetIovlen(length int) { | ||||
| 	msghdr.Iovlen = int32(length) | ||||
| } | ||||
| 
 | ||||
| func (cmsg *Cmsghdr) SetLen(length int) { | ||||
| 	cmsg.Len = uint32(length) | ||||
| } | ||||
| 
 | ||||
| // In order to only have Timespec structure, type of Stat_t's fields | ||||
| // Atim, Mtim and Ctim is changed from StTimespec to Timespec during | ||||
| // ztypes generation. | ||||
| // On ppc64, Timespec.Nsec is an int64 while StTimespec.Nsec is an | ||||
| // int32, so the fields' value must be modified. | ||||
| func fixStatTimFields(stat *Stat_t) { | ||||
| 	stat.Atim.Nsec >>= 32 | ||||
| 	stat.Mtim.Nsec >>= 32 | ||||
| 	stat.Ctim.Nsec >>= 32 | ||||
| } | ||||
| 
 | ||||
| func Fstat(fd int, stat *Stat_t) error { | ||||
| 	err := fstat(fd, stat) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	fixStatTimFields(stat) | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func Fstatat(dirfd int, path string, stat *Stat_t, flags int) error { | ||||
| 	err := fstatat(dirfd, path, stat, flags) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	fixStatTimFields(stat) | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func Lstat(path string, stat *Stat_t) error { | ||||
| 	err := lstat(path, stat) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	fixStatTimFields(stat) | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func Stat(path string, statptr *Stat_t) error { | ||||
| 	err := stat(path, statptr) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	fixStatTimFields(statptr) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
							
								
								
									
										69
									
								
								vendor/golang.org/x/sys/unix/syscall_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										69
									
								
								vendor/golang.org/x/sys/unix/syscall_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -18,6 +18,21 @@ import ( | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| const ImplementsGetwd = true | ||||
| 
 | ||||
| func Getwd() (string, error) { | ||||
| 	var buf [PathMax]byte | ||||
| 	_, err := Getcwd(buf[0:]) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	n := clen(buf[:]) | ||||
| 	if n < 1 { | ||||
| 		return "", EINVAL | ||||
| 	} | ||||
| 	return string(buf[:n]), nil | ||||
| } | ||||
| 
 | ||||
| /* | ||||
|  * Wrapped | ||||
|  */ | ||||
| @ -63,15 +78,6 @@ func Setgroups(gids []int) (err error) { | ||||
| 	return setgroups(len(a), &a[0]) | ||||
| } | ||||
| 
 | ||||
| func ReadDirent(fd int, buf []byte) (n int, err error) { | ||||
| 	// Final argument is (basep *uintptr) and the syscall doesn't take nil. | ||||
| 	// 64 bits should be enough. (32 bits isn't even on 386). Since the | ||||
| 	// actual system call is getdirentries64, 64 is a good guess. | ||||
| 	// TODO(rsc): Can we use a single global basep for all calls? | ||||
| 	var base = (*uintptr)(unsafe.Pointer(new(uint64))) | ||||
| 	return Getdirentries(fd, buf, base) | ||||
| } | ||||
| 
 | ||||
| // Wait status is 7 bits at bottom, either 0 (exited), | ||||
| // 0x7F (stopped), or a signal number that caused an exit. | ||||
| // The 0x80 bit is whether there was a core dump. | ||||
| @ -86,6 +92,7 @@ const ( | ||||
| 	shift = 8 | ||||
| 
 | ||||
| 	exited  = 0 | ||||
| 	killed  = 9 | ||||
| 	stopped = 0x7F | ||||
| ) | ||||
| 
 | ||||
| @ -112,6 +119,8 @@ func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } | ||||
| 
 | ||||
| func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } | ||||
| 
 | ||||
| func (w WaitStatus) Killed() bool { return w&mask == killed && syscall.Signal(w>>shift) != SIGKILL } | ||||
| 
 | ||||
| func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } | ||||
| 
 | ||||
| func (w WaitStatus) StopSignal() syscall.Signal { | ||||
| @ -243,7 +252,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] | ||||
| 		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] | ||||
| 		sa.Name = string(bytes) | ||||
| 		return sa, nil | ||||
| 
 | ||||
| @ -278,7 +287,7 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	if runtime.GOOS == "darwin" && len == 0 { | ||||
| 	if (runtime.GOOS == "darwin" || runtime.GOOS == "ios") && len == 0 { | ||||
| 		// Accepted socket has no address. | ||||
| 		// This is likely due to a bug in xnu kernels, | ||||
| 		// where instead of ECONNABORTED error socket | ||||
| @ -419,8 +428,6 @@ func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err e | ||||
| 	return kevent(kq, change, len(changes), event, len(events), timeout) | ||||
| } | ||||
| 
 | ||||
| //sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL | ||||
| 
 | ||||
| // sysctlmib translates name to mib number and appends any additional args. | ||||
| func sysctlmib(name string, args ...int) ([]_C_int, error) { | ||||
| 	// Translate name to mib number. | ||||
| @ -518,6 +525,40 @@ func SysctlRaw(name string, args ...int) ([]byte, error) { | ||||
| 	return buf[:n], nil | ||||
| } | ||||
| 
 | ||||
| func SysctlClockinfo(name string) (*Clockinfo, error) { | ||||
| 	mib, err := sysctlmib(name) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	n := uintptr(SizeofClockinfo) | ||||
| 	var ci Clockinfo | ||||
| 	if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if n != SizeofClockinfo { | ||||
| 		return nil, EIO | ||||
| 	} | ||||
| 	return &ci, nil | ||||
| } | ||||
| 
 | ||||
| func SysctlTimeval(name string) (*Timeval, error) { | ||||
| 	mib, err := sysctlmib(name) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	var tv Timeval | ||||
| 	n := uintptr(unsafe.Sizeof(tv)) | ||||
| 	if err := sysctl(mib, (*byte)(unsafe.Pointer(&tv)), &n, nil, 0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if n != unsafe.Sizeof(tv) { | ||||
| 		return nil, EIO | ||||
| 	} | ||||
| 	return &tv, nil | ||||
| } | ||||
| 
 | ||||
| //sys	utimes(path string, timeval *[2]Timeval) (err error) | ||||
| 
 | ||||
| func Utimes(path string, tv []Timeval) error { | ||||
| @ -585,8 +626,6 @@ func Futimes(fd int, tv []Timeval) error { | ||||
| 	return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) | ||||
| } | ||||
| 
 | ||||
| //sys	fcntl(fd int, cmd int, arg int) (val int, err error) | ||||
| 
 | ||||
| //sys   poll(fds *PollFd, nfds int, timeout int) (n int, err error) | ||||
| 
 | ||||
| func Poll(fds []PollFd, timeout int) (n int, err error) { | ||||
|  | ||||
							
								
								
									
										31
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build darwin,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 | ||||
| } | ||||
							
								
								
									
										108
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,108 @@ | ||||
| // Copyright 2019 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build darwin,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(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0) | ||||
| 	dir = uintptr(r0) | ||||
| 	if e1 != 0 { | ||||
| 		err = errnoErr(e1) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func libc_fdopendir_trampoline() | ||||
| 
 | ||||
| //go:linkname libc_fdopendir libc_fdopendir | ||||
| //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 | ||||
| } | ||||
							
								
								
									
										136
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										136
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -13,29 +13,10 @@ | ||||
| package unix | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"syscall" | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| const ImplementsGetwd = true | ||||
| 
 | ||||
| func Getwd() (string, error) { | ||||
| 	buf := make([]byte, 2048) | ||||
| 	attrs, err := getAttrList(".", attrList{CommonAttr: attrCmnFullpath}, buf, 0) | ||||
| 	if err == nil && len(attrs) == 1 && len(attrs[0]) >= 2 { | ||||
| 		wd := string(attrs[0]) | ||||
| 		// Sanity check that it's an absolute path and ends | ||||
| 		// in a null byte, which we then strip. | ||||
| 		if wd[0] == '/' && wd[len(wd)-1] == 0 { | ||||
| 			return wd[:len(wd)-1], nil | ||||
| 		} | ||||
| 	} | ||||
| 	// If pkg/os/getwd.go gets ENOTSUP, it will fall back to the | ||||
| 	// slow algorithm. | ||||
| 	return "", ENOTSUP | ||||
| } | ||||
| 
 | ||||
| // SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. | ||||
| type SockaddrDatalink struct { | ||||
| 	Len    uint8 | ||||
| @ -49,6 +30,11 @@ type SockaddrDatalink struct { | ||||
| 	raw    RawSockaddrDatalink | ||||
| } | ||||
| 
 | ||||
| // Some external packages rely on SYS___SYSCTL being defined to implement their | ||||
| // own sysctl wrappers. Provide it here, even though direct syscalls are no | ||||
| // longer supported on darwin. | ||||
| const SYS___SYSCTL = 202 | ||||
| 
 | ||||
| // Translate "kern.hostname" to []_C_int{0,1,2,3}. | ||||
| func nametomib(name string) (mib []_C_int, err error) { | ||||
| 	const siz = unsafe.Sizeof(mib[0]) | ||||
| @ -77,15 +63,21 @@ func nametomib(name string) (mib []_C_int, err error) { | ||||
| 	return buf[0 : n/siz], nil | ||||
| } | ||||
| 
 | ||||
| //sys   ptrace(request int, pid int, addr uintptr, data uintptr) (err error) | ||||
| func direntIno(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) | ||||
| } | ||||
| 
 | ||||
| func direntReclen(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) | ||||
| } | ||||
| 
 | ||||
| func direntNamlen(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) | ||||
| } | ||||
| 
 | ||||
| func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } | ||||
| func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } | ||||
| 
 | ||||
| const ( | ||||
| 	attrBitMapCount = 5 | ||||
| 	attrCmnFullpath = 0x08000000 | ||||
| ) | ||||
| 
 | ||||
| type attrList struct { | ||||
| 	bitmapCount uint16 | ||||
| 	_           uint16 | ||||
| @ -96,54 +88,6 @@ type attrList struct { | ||||
| 	Forkattr    uint32 | ||||
| } | ||||
| 
 | ||||
| func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) { | ||||
| 	if len(attrBuf) < 4 { | ||||
| 		return nil, errors.New("attrBuf too small") | ||||
| 	} | ||||
| 	attrList.bitmapCount = attrBitMapCount | ||||
| 
 | ||||
| 	var _p0 *byte | ||||
| 	_p0, err = BytePtrFromString(path) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	if err := getattrlist(_p0, unsafe.Pointer(&attrList), unsafe.Pointer(&attrBuf[0]), uintptr(len(attrBuf)), int(options)); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	size := *(*uint32)(unsafe.Pointer(&attrBuf[0])) | ||||
| 
 | ||||
| 	// dat is the section of attrBuf that contains valid data, | ||||
| 	// without the 4 byte length header. All attribute offsets | ||||
| 	// are relative to dat. | ||||
| 	dat := attrBuf | ||||
| 	if int(size) < len(attrBuf) { | ||||
| 		dat = dat[:size] | ||||
| 	} | ||||
| 	dat = dat[4:] // remove length prefix | ||||
| 
 | ||||
| 	for i := uint32(0); int(i) < len(dat); { | ||||
| 		header := dat[i:] | ||||
| 		if len(header) < 8 { | ||||
| 			return attrs, errors.New("truncated attribute header") | ||||
| 		} | ||||
| 		datOff := *(*int32)(unsafe.Pointer(&header[0])) | ||||
| 		attrLen := *(*uint32)(unsafe.Pointer(&header[4])) | ||||
| 		if datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) { | ||||
| 			return attrs, errors.New("truncated results; attrBuf too small") | ||||
| 		} | ||||
| 		end := uint32(datOff) + attrLen | ||||
| 		attrs = append(attrs, dat[datOff:end]) | ||||
| 		i = end | ||||
| 		if r := i % 4; r != 0 { | ||||
| 			i += (4 - r) | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| //sys getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) | ||||
| 
 | ||||
| //sysnb pipe() (r int, w int, err error) | ||||
| 
 | ||||
| func Pipe(p []int) (err error) { | ||||
| @ -305,48 +249,15 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { | ||||
|  * Wrapped | ||||
|  */ | ||||
| 
 | ||||
| //sys	fcntl(fd int, cmd int, arg int) (val int, err error) | ||||
| 
 | ||||
| //sys	kill(pid int, signum int, posix int) (err error) | ||||
| 
 | ||||
| func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } | ||||
| 
 | ||||
| //sys	ioctl(fd int, req uint, arg uintptr) (err error) | ||||
| 
 | ||||
| // ioctl itself should not be exposed directly, but additional get/set | ||||
| // functions for specific types are permissible. | ||||
| 
 | ||||
| // IoctlSetInt performs an ioctl operation which sets an integer value | ||||
| // on fd, using the specified request number. | ||||
| func IoctlSetInt(fd int, req uint, value int) error { | ||||
| 	return ioctl(fd, req, uintptr(value)) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetWinsize(fd int, req uint, value *Winsize) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetTermios(fd int, req uint, value *Termios) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| // IoctlGetInt performs an ioctl operation which gets an integer value | ||||
| // from fd, using the specified request number. | ||||
| func IoctlGetInt(fd int, req uint) (int, error) { | ||||
| 	var value int | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { | ||||
| 	var value Winsize | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetTermios(fd int, req uint) (*Termios, error) { | ||||
| 	var value Termios | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| //sys   sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS_SYSCTL | ||||
| 
 | ||||
| func Uname(uname *Utsname) error { | ||||
| 	mib := []_C_int{CTL_KERN, KERN_OSTYPE} | ||||
| @ -418,6 +329,8 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Chroot(path string) (err error) | ||||
| //sys	ClockGettime(clockid int32, time *Timespec) (err error) | ||||
| //sys	Close(fd int) (err error) | ||||
| //sys	Clonefile(src string, dst string, flags int) (err error) | ||||
| //sys	Clonefileat(srcDirfd int, src string, dstDirfd int, dst string, flags int) (err error) | ||||
| //sys	Dup(fd int) (nfd int, err error) | ||||
| //sys	Dup2(from int, to int) (err error) | ||||
| //sys	Exchangedata(path1 string, path2 string, options int) (err error) | ||||
| @ -429,10 +342,12 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) | ||||
| //sys	Fchown(fd int, uid int, gid int) (err error) | ||||
| //sys	Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) | ||||
| //sys	Fclonefileat(srcDirfd int, dstDirfd int, dst string, flags int) (err error) | ||||
| //sys	Flock(fd int, how int) (err error) | ||||
| //sys	Fpathconf(fd int, name int) (val int, err error) | ||||
| //sys	Fsync(fd int) (err error) | ||||
| //sys	Ftruncate(fd int, length int64) (err error) | ||||
| //sys	Getcwd(buf []byte) (n int, err error) | ||||
| //sys	Getdtablesize() (size int) | ||||
| //sysnb	Getegid() (egid int) | ||||
| //sysnb	Geteuid() (uid int) | ||||
| @ -445,6 +360,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sysnb	Getrlimit(which int, lim *Rlimit) (err error) | ||||
| //sysnb	Getrusage(who int, rusage *Rusage) (err error) | ||||
| //sysnb	Getsid(pid int) (sid int, err error) | ||||
| //sysnb	Gettimeofday(tp *Timeval) (err error) | ||||
| //sysnb	Getuid() (uid int) | ||||
| //sysnb	Issetugid() (tainted bool) | ||||
| //sys	Kqueue() (fd int, err error) | ||||
| @ -469,7 +385,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Revoke(path string) (err error) | ||||
| //sys	Rmdir(path string) (err error) | ||||
| //sys	Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK | ||||
| //sys	Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) | ||||
| //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) | ||||
| //sys	Setegid(egid int) (err error) | ||||
| //sysnb	Seteuid(euid int) (err error) | ||||
| //sysnb	Setgid(gid int) (err error) | ||||
|  | ||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -10,6 +10,8 @@ import ( | ||||
| 	"syscall" | ||||
| ) | ||||
| 
 | ||||
| //sys   ptrace(request int, pid int, addr uintptr, data uintptr) (err error) | ||||
| 
 | ||||
| func setTimespec(sec, nsec int64) Timespec { | ||||
| 	return Timespec{Sec: int32(sec), Nsec: int32(nsec)} | ||||
| } | ||||
| @ -18,17 +20,6 @@ func setTimeval(sec, usec int64) Timeval { | ||||
| 	return Timeval{Sec: int32(sec), Usec: int32(usec)} | ||||
| } | ||||
| 
 | ||||
| //sysnb	gettimeofday(tp *Timeval) (sec int32, usec int32, err error) | ||||
| func Gettimeofday(tv *Timeval) (err error) { | ||||
| 	// The tv passed to gettimeofday must be non-nil | ||||
| 	// but is otherwise unused. The answers come back | ||||
| 	// in the two registers. | ||||
| 	sec, usec, err := gettimeofday(tv) | ||||
| 	tv.Sec = int32(sec) | ||||
| 	tv.Usec = int32(usec) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func SetKevent(k *Kevent_t, fd, mode, flags int) { | ||||
| 	k.Ident = uint32(fd) | ||||
| 	k.Filter = int16(mode) | ||||
| @ -43,20 +34,19 @@ 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 Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) | ||||
| 
 | ||||
| // SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions | ||||
| // of darwin/386 the syscall is called sysctl instead of __sysctl. | ||||
| const SYS___SYSCTL = SYS_SYSCTL | ||||
| 
 | ||||
| //sys	Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 | ||||
| //sys	Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 | ||||
| //sys	Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 | ||||
| //sys	Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64 | ||||
| //sys	getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64 | ||||
| //sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 | ||||
| //sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 | ||||
|  | ||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -10,6 +10,8 @@ import ( | ||||
| 	"syscall" | ||||
| ) | ||||
| 
 | ||||
| //sys   ptrace(request int, pid int, addr uintptr, data uintptr) (err error) | ||||
| 
 | ||||
| func setTimespec(sec, nsec int64) Timespec { | ||||
| 	return Timespec{Sec: sec, Nsec: nsec} | ||||
| } | ||||
| @ -18,17 +20,6 @@ func setTimeval(sec, usec int64) Timeval { | ||||
| 	return Timeval{Sec: sec, Usec: int32(usec)} | ||||
| } | ||||
| 
 | ||||
| //sysnb	gettimeofday(tp *Timeval) (sec int64, usec int32, err error) | ||||
| func Gettimeofday(tv *Timeval) (err error) { | ||||
| 	// The tv passed to gettimeofday must be non-nil | ||||
| 	// but is otherwise unused. The answers come back | ||||
| 	// in the two registers. | ||||
| 	sec, usec, err := gettimeofday(tv) | ||||
| 	tv.Sec = sec | ||||
| 	tv.Usec = usec | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func SetKevent(k *Kevent_t, fd, mode, flags int) { | ||||
| 	k.Ident = uint64(fd) | ||||
| 	k.Filter = int16(mode) | ||||
| @ -43,20 +34,19 @@ 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 Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) | ||||
| 
 | ||||
| // SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions | ||||
| // of darwin/amd64 the syscall is called sysctl instead of __sysctl. | ||||
| const SYS___SYSCTL = SYS_SYSCTL | ||||
| 
 | ||||
| //sys	Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 | ||||
| //sys	Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 | ||||
| //sys	Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 | ||||
| //sys	Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64 | ||||
| //sys	getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64 | ||||
| //sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 | ||||
| //sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 | ||||
|  | ||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -8,6 +8,10 @@ import ( | ||||
| 	"syscall" | ||||
| ) | ||||
| 
 | ||||
| func ptrace(request int, pid int, addr uintptr, data uintptr) error { | ||||
| 	return ENOTSUP | ||||
| } | ||||
| 
 | ||||
| func setTimespec(sec, nsec int64) Timespec { | ||||
| 	return Timespec{Sec: int32(sec), Nsec: int32(nsec)} | ||||
| } | ||||
| @ -16,17 +20,6 @@ func setTimeval(sec, usec int64) Timeval { | ||||
| 	return Timeval{Sec: int32(sec), Usec: int32(usec)} | ||||
| } | ||||
| 
 | ||||
| //sysnb	gettimeofday(tp *Timeval) (sec int32, usec int32, err error) | ||||
| func Gettimeofday(tv *Timeval) (err error) { | ||||
| 	// The tv passed to gettimeofday must be non-nil | ||||
| 	// but is otherwise unused. The answers come back | ||||
| 	// in the two registers. | ||||
| 	sec, usec, err := gettimeofday(tv) | ||||
| 	tv.Sec = int32(sec) | ||||
| 	tv.Usec = int32(usec) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func SetKevent(k *Kevent_t, fd, mode, flags int) { | ||||
| 	k.Ident = uint32(fd) | ||||
| 	k.Filter = int16(mode) | ||||
| @ -41,16 +34,16 @@ 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 Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic | ||||
| 
 | ||||
| // SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions | ||||
| // of darwin/arm the syscall is called sysctl instead of __sysctl. | ||||
| const SYS___SYSCTL = SYS_SYSCTL | ||||
| 
 | ||||
| //sys	Fstat(fd int, stat *Stat_t) (err error) | ||||
| //sys	Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) | ||||
| //sys	Fstatfs(fd int, stat *Statfs_t) (err error) | ||||
| @ -58,7 +51,3 @@ const SYS___SYSCTL = SYS_SYSCTL | ||||
| //sys	Lstat(path string, stat *Stat_t) (err error) | ||||
| //sys	Stat(path string, stat *Stat_t) (err error) | ||||
| //sys	Statfs(path string, stat *Statfs_t) (err error) | ||||
| 
 | ||||
| func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { | ||||
| 	return 0, ENOSYS | ||||
| } | ||||
|  | ||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -10,6 +10,10 @@ import ( | ||||
| 	"syscall" | ||||
| ) | ||||
| 
 | ||||
| func ptrace(request int, pid int, addr uintptr, data uintptr) error { | ||||
| 	return ENOTSUP | ||||
| } | ||||
| 
 | ||||
| func setTimespec(sec, nsec int64) Timespec { | ||||
| 	return Timespec{Sec: sec, Nsec: nsec} | ||||
| } | ||||
| @ -18,17 +22,6 @@ func setTimeval(sec, usec int64) Timeval { | ||||
| 	return Timeval{Sec: sec, Usec: int32(usec)} | ||||
| } | ||||
| 
 | ||||
| //sysnb	gettimeofday(tp *Timeval) (sec int64, usec int32, err error) | ||||
| func Gettimeofday(tv *Timeval) (err error) { | ||||
| 	// The tv passed to gettimeofday must be non-nil | ||||
| 	// but is otherwise unused. The answers come back | ||||
| 	// in the two registers. | ||||
| 	sec, usec, err := gettimeofday(tv) | ||||
| 	tv.Sec = sec | ||||
| 	tv.Usec = usec | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func SetKevent(k *Kevent_t, fd, mode, flags int) { | ||||
| 	k.Ident = uint64(fd) | ||||
| 	k.Filter = int16(mode) | ||||
| @ -43,16 +36,16 @@ 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 Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic | ||||
| 
 | ||||
| // SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions | ||||
| // of darwin/arm64 the syscall is called sysctl instead of __sysctl. | ||||
| const SYS___SYSCTL = SYS_SYSCTL | ||||
| 
 | ||||
| //sys	Fstat(fd int, stat *Stat_t) (err error) | ||||
| //sys	Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) | ||||
| //sys	Fstatfs(fd int, stat *Statfs_t) (err error) | ||||
| @ -60,7 +53,3 @@ const SYS___SYSCTL = SYS_SYSCTL | ||||
| //sys	Lstat(path string, stat *Stat_t) (err error) | ||||
| //sys	Stat(path string, stat *Stat_t) (err error) | ||||
| //sys	Statfs(path string, stat *Statfs_t) (err error) | ||||
| 
 | ||||
| func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { | ||||
| 	return 0, ENOSYS | ||||
| } | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -15,6 +15,7 @@ func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err | ||||
| func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) // 32-bit only | ||||
| func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) | ||||
| func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) | ||||
| func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) | ||||
| 
 | ||||
| //go:linkname syscall_syscall syscall.syscall | ||||
| //go:linkname syscall_syscall6 syscall.syscall6 | ||||
| @ -22,6 +23,7 @@ func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, er | ||||
| //go:linkname syscall_syscall9 syscall.syscall9 | ||||
| //go:linkname syscall_rawSyscall syscall.rawSyscall | ||||
| //go:linkname syscall_rawSyscall6 syscall.rawSyscall6 | ||||
| //go:linkname syscall_syscallPtr syscall.syscallPtr | ||||
| 
 | ||||
| // Find the entry point for f. See comments in runtime/proc.go for the | ||||
| // function of the same name. | ||||
|  | ||||
							
								
								
									
										91
									
								
								vendor/golang.org/x/sys/unix/syscall_dragonfly.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										91
									
								
								vendor/golang.org/x/sys/unix/syscall_dragonfly.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -12,7 +12,25 @@ | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import "unsafe" | ||||
| import ( | ||||
| 	"sync" | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| // See version list in https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/sys/sys/param.h | ||||
| var ( | ||||
| 	osreldateOnce sync.Once | ||||
| 	osreldate     uint32 | ||||
| ) | ||||
| 
 | ||||
| // First __DragonFly_version after September 2019 ABI changes | ||||
| // http://lists.dragonflybsd.org/pipermail/users/2019-September/358280.html | ||||
| const _dragonflyABIChangeVersion = 500705 | ||||
| 
 | ||||
| func supportsABI(ver uint32) bool { | ||||
| 	osreldateOnce.Do(func() { osreldate, _ = SysctlUint32("kern.osreldate") }) | ||||
| 	return osreldate >= ver | ||||
| } | ||||
| 
 | ||||
| // SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. | ||||
| type SockaddrDatalink struct { | ||||
| @ -57,6 +75,22 @@ func nametomib(name string) (mib []_C_int, err error) { | ||||
| 	return buf[0 : n/siz], nil | ||||
| } | ||||
| 
 | ||||
| func direntIno(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) | ||||
| } | ||||
| 
 | ||||
| func direntReclen(buf []byte) (uint64, bool) { | ||||
| 	namlen, ok := direntNamlen(buf) | ||||
| 	if !ok { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return (16 + namlen + 1 + 7) &^ 7, true | ||||
| } | ||||
| 
 | ||||
| func direntNamlen(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) | ||||
| } | ||||
| 
 | ||||
| //sysnb pipe() (r int, w int, err error) | ||||
| 
 | ||||
| func Pipe(p []int) (err error) { | ||||
| @ -95,23 +129,8 @@ func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| const ImplementsGetwd = true | ||||
| 
 | ||||
| //sys	Getcwd(buf []byte) (n int, err error) = SYS___GETCWD | ||||
| 
 | ||||
| func Getwd() (string, error) { | ||||
| 	var buf [PathMax]byte | ||||
| 	_, err := Getcwd(buf[0:]) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	n := clen(buf[:]) | ||||
| 	if n < 1 { | ||||
| 		return "", EINVAL | ||||
| 	} | ||||
| 	return string(buf[:n]), nil | ||||
| } | ||||
| 
 | ||||
| func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { | ||||
| 	var _p0 unsafe.Pointer | ||||
| 	var bufsize uintptr | ||||
| @ -134,42 +153,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { | ||||
| 
 | ||||
| //sys	ioctl(fd int, req uint, arg uintptr) (err error) | ||||
| 
 | ||||
| // ioctl itself should not be exposed directly, but additional get/set | ||||
| // functions for specific types are permissible. | ||||
| 
 | ||||
| // IoctlSetInt performs an ioctl operation which sets an integer value | ||||
| // on fd, using the specified request number. | ||||
| func IoctlSetInt(fd int, req uint, value int) error { | ||||
| 	return ioctl(fd, req, uintptr(value)) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetWinsize(fd int, req uint, value *Winsize) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetTermios(fd int, req uint, value *Termios) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| // IoctlGetInt performs an ioctl operation which gets an integer value | ||||
| // from fd, using the specified request number. | ||||
| func IoctlGetInt(fd int, req uint) (int, error) { | ||||
| 	var value int | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { | ||||
| 	var value Winsize | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetTermios(fd int, req uint) (*Termios, error) { | ||||
| 	var value Termios | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| //sys   sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL | ||||
| 
 | ||||
| func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error { | ||||
| 	err := sysctl(mib, old, oldlen, nil, 0) | ||||
| @ -269,6 +253,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Fstatfs(fd int, stat *Statfs_t) (err error) | ||||
| //sys	Fsync(fd int) (err error) | ||||
| //sys	Ftruncate(fd int, length int64) (err error) | ||||
| //sys	Getdents(fd int, buf []byte) (n int, err error) | ||||
| //sys	Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) | ||||
| //sys	Getdtablesize() (size int) | ||||
| //sysnb	Getegid() (egid int) | ||||
| @ -308,7 +293,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Revoke(path string) (err error) | ||||
| //sys	Rmdir(path string) (err error) | ||||
| //sys	Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK | ||||
| //sys	Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) | ||||
| //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) | ||||
| //sysnb	Setegid(egid int) (err error) | ||||
| //sysnb	Seteuid(euid int) (err error) | ||||
| //sysnb	Setgid(gid int) (err error) | ||||
|  | ||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -33,6 +33,10 @@ 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) | ||||
| } | ||||
|  | ||||
							
								
								
									
										149
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										149
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -82,6 +82,18 @@ func nametomib(name string) (mib []_C_int, err error) { | ||||
| 	return buf[0 : n/siz], nil | ||||
| } | ||||
| 
 | ||||
| func direntIno(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) | ||||
| } | ||||
| 
 | ||||
| func direntReclen(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) | ||||
| } | ||||
| 
 | ||||
| func direntNamlen(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) | ||||
| } | ||||
| 
 | ||||
| func Pipe(p []int) (err error) { | ||||
| 	return Pipe2(p, 0) | ||||
| } | ||||
| @ -128,23 +140,8 @@ func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| const ImplementsGetwd = true | ||||
| 
 | ||||
| //sys	Getcwd(buf []byte) (n int, err error) = SYS___GETCWD | ||||
| 
 | ||||
| func Getwd() (string, error) { | ||||
| 	var buf [PathMax]byte | ||||
| 	_, err := Getcwd(buf[0:]) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	n := clen(buf[:]) | ||||
| 	if n < 1 { | ||||
| 		return "", EINVAL | ||||
| 	} | ||||
| 	return string(buf[:n]), nil | ||||
| } | ||||
| 
 | ||||
| func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { | ||||
| 	var ( | ||||
| 		_p0          unsafe.Pointer | ||||
| @ -189,42 +186,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { | ||||
| 
 | ||||
| //sys   ioctl(fd int, req uint, arg uintptr) (err error) | ||||
| 
 | ||||
| // ioctl itself should not be exposed directly, but additional get/set | ||||
| // functions for specific types are permissible. | ||||
| 
 | ||||
| // IoctlSetInt performs an ioctl operation which sets an integer value | ||||
| // on fd, using the specified request number. | ||||
| func IoctlSetInt(fd int, req uint, value int) error { | ||||
| 	return ioctl(fd, req, uintptr(value)) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetWinsize(fd int, req uint, value *Winsize) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetTermios(fd int, req uint, value *Termios) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| // IoctlGetInt performs an ioctl operation which gets an integer value | ||||
| // from fd, using the specified request number. | ||||
| func IoctlGetInt(fd int, req uint) (int, error) { | ||||
| 	var value int | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { | ||||
| 	var value Winsize | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetTermios(fd int, req uint) (*Termios, error) { | ||||
| 	var value Termios | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| //sys   sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL | ||||
| 
 | ||||
| func Uname(uname *Utsname) error { | ||||
| 	mib := []_C_int{CTL_KERN, KERN_OSTYPE} | ||||
| @ -362,7 +324,21 @@ func Getdents(fd int, buf []byte) (n int, err error) { | ||||
| 
 | ||||
| func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { | ||||
| 	if supportsABI(_ino64First) { | ||||
| 		return getdirentries_freebsd12(fd, buf, basep) | ||||
| 		if basep == nil || unsafe.Sizeof(*basep) == 8 { | ||||
| 			return getdirentries_freebsd12(fd, buf, (*uint64)(unsafe.Pointer(basep))) | ||||
| 		} | ||||
| 		// The freebsd12 syscall needs a 64-bit base. On 32-bit machines | ||||
| 		// we can't just use the basep passed in. See #32498. | ||||
| 		var base uint64 = uint64(*basep) | ||||
| 		n, err = getdirentries_freebsd12(fd, buf, &base) | ||||
| 		*basep = uintptr(base) | ||||
| 		if base>>32 != 0 { | ||||
| 			// We can't stuff the base back into a uintptr, so any | ||||
| 			// future calls would be suspect. Generate an error. | ||||
| 			// EIO is allowed by getdirentries. | ||||
| 			err = EIO | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// The old syscall entries are smaller than the new. Use 1/4 of the original | ||||
| @ -414,7 +390,7 @@ func (s *Stat_t) convertFrom(old *stat_freebsd11_t) { | ||||
| 		Atim:    old.Atim, | ||||
| 		Mtim:    old.Mtim, | ||||
| 		Ctim:    old.Ctim, | ||||
| 		Birthtim: old.Birthtim, | ||||
| 		Btim:    old.Btim, | ||||
| 		Size:    old.Size, | ||||
| 		Blocks:  old.Blocks, | ||||
| 		Blksize: old.Blksize, | ||||
| @ -471,8 +447,12 @@ func convertFromDirents11(buf []byte, old []byte) int { | ||||
| 	dstPos := 0 | ||||
| 	srcPos := 0 | ||||
| 	for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) { | ||||
| 		dstDirent := (*Dirent)(unsafe.Pointer(&buf[dstPos])) | ||||
| 		srcDirent := (*dirent_freebsd11)(unsafe.Pointer(&old[srcPos])) | ||||
| 		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) { | ||||
| @ -488,6 +468,7 @@ func convertFromDirents11(buf []byte, old []byte) int { | ||||
| 		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 | ||||
| @ -507,6 +488,60 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| 	return sendfile(outfd, infd, offset, count) | ||||
| } | ||||
| 
 | ||||
| //sys	ptrace(request int, pid int, addr uintptr, data int) (err error) | ||||
| 
 | ||||
| func PtraceAttach(pid int) (err error) { | ||||
| 	return ptrace(PTRACE_ATTACH, pid, 0, 0) | ||||
| } | ||||
| 
 | ||||
| func PtraceCont(pid int, signal int) (err error) { | ||||
| 	return ptrace(PTRACE_CONT, pid, 1, signal) | ||||
| } | ||||
| 
 | ||||
| func PtraceDetach(pid int) (err error) { | ||||
| 	return ptrace(PTRACE_DETACH, pid, 1, 0) | ||||
| } | ||||
| 
 | ||||
| func PtraceGetFpRegs(pid int, fpregsout *FpReg) (err error) { | ||||
| 	return ptrace(PTRACE_GETFPREGS, pid, uintptr(unsafe.Pointer(fpregsout)), 0) | ||||
| } | ||||
| 
 | ||||
| func PtraceGetRegs(pid int, regsout *Reg) (err error) { | ||||
| 	return ptrace(PTRACE_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0) | ||||
| } | ||||
| 
 | ||||
| func PtraceLwpEvents(pid int, enable int) (err error) { | ||||
| 	return ptrace(PTRACE_LWPEVENTS, pid, 0, enable) | ||||
| } | ||||
| 
 | ||||
| func PtraceLwpInfo(pid int, info uintptr) (err error) { | ||||
| 	return ptrace(PTRACE_LWPINFO, pid, info, int(unsafe.Sizeof(PtraceLwpInfoStruct{}))) | ||||
| } | ||||
| 
 | ||||
| func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { | ||||
| 	return PtraceIO(PIOD_READ_D, pid, addr, out, SizeofLong) | ||||
| } | ||||
| 
 | ||||
| func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) { | ||||
| 	return PtraceIO(PIOD_READ_I, pid, addr, out, SizeofLong) | ||||
| } | ||||
| 
 | ||||
| func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) { | ||||
| 	return PtraceIO(PIOD_WRITE_D, pid, addr, data, SizeofLong) | ||||
| } | ||||
| 
 | ||||
| func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { | ||||
| 	return PtraceIO(PIOD_WRITE_I, pid, addr, data, SizeofLong) | ||||
| } | ||||
| 
 | ||||
| func PtraceSetRegs(pid int, regs *Reg) (err error) { | ||||
| 	return ptrace(PTRACE_SETREGS, pid, uintptr(unsafe.Pointer(regs)), 0) | ||||
| } | ||||
| 
 | ||||
| func PtraceSingleStep(pid int) (err error) { | ||||
| 	return ptrace(PTRACE_SINGLESTEP, pid, 1, 0) | ||||
| } | ||||
| 
 | ||||
| /* | ||||
|  * Exposed directly | ||||
|  */ | ||||
| @ -555,7 +590,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Fsync(fd int) (err error) | ||||
| //sys	Ftruncate(fd int, length int64) (err error) | ||||
| //sys	getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) | ||||
| //sys	getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) | ||||
| //sys	getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) | ||||
| //sys	Getdtablesize() (size int) | ||||
| //sysnb	Getegid() (egid int) | ||||
| //sysnb	Geteuid() (uid int) | ||||
| @ -598,7 +633,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Revoke(path string) (err error) | ||||
| //sys	Rmdir(path string) (err error) | ||||
| //sys	Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK | ||||
| //sys	Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) | ||||
| //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) | ||||
| //sysnb	Setegid(egid int) (err error) | ||||
| //sysnb	Seteuid(euid int) (err error) | ||||
| //sysnb	Setgid(gid int) (err error) | ||||
|  | ||||
							
								
								
									
										14
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -33,6 +33,10 @@ 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) | ||||
| } | ||||
| @ -50,3 +54,13 @@ 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 PtraceGetFsBase(pid int, fsbase *int64) (err error) { | ||||
| 	return ptrace(PTRACE_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) | ||||
| } | ||||
| 
 | ||||
| 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)} | ||||
| 	err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) | ||||
| 	return int(ioDesc.Len), err | ||||
| } | ||||
|  | ||||
							
								
								
									
										14
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -33,6 +33,10 @@ 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) | ||||
| } | ||||
| @ -50,3 +54,13 @@ 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 PtraceGetFsBase(pid int, fsbase *int64) (err error) { | ||||
| 	return ptrace(PTRACE_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) | ||||
| } | ||||
| 
 | ||||
| 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)} | ||||
| 	err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) | ||||
| 	return int(ioDesc.Len), err | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -33,6 +33,10 @@ 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) | ||||
| } | ||||
| @ -50,3 +54,9 @@ 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 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)} | ||||
| 	err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) | ||||
| 	return int(ioDesc.Len), err | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -33,6 +33,10 @@ 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) | ||||
| } | ||||
| @ -50,3 +54,9 @@ 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 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)} | ||||
| 	err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) | ||||
| 	return int(ioDesc.Len), err | ||||
| } | ||||
|  | ||||
							
								
								
									
										90
									
								
								vendor/golang.org/x/sys/unix/syscall_illumos.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								vendor/golang.org/x/sys/unix/syscall_illumos.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | ||||
| // 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. | ||||
| 
 | ||||
| // illumos system calls not present on Solaris. | ||||
| 
 | ||||
| // +build amd64,illumos | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import "unsafe" | ||||
| 
 | ||||
| func bytes2iovec(bs [][]byte) []Iovec { | ||||
| 	iovecs := make([]Iovec, len(bs)) | ||||
| 	for i, b := range bs { | ||||
| 		iovecs[i].SetLen(len(b)) | ||||
| 		if len(b) > 0 { | ||||
| 			// somehow Iovec.Base on illumos is (*int8), not (*byte) | ||||
| 			iovecs[i].Base = (*int8)(unsafe.Pointer(&b[0])) | ||||
| 		} else { | ||||
| 			iovecs[i].Base = (*int8)(unsafe.Pointer(&_zero)) | ||||
| 		} | ||||
| 	} | ||||
| 	return iovecs | ||||
| } | ||||
| 
 | ||||
| //sys	readv(fd int, iovs []Iovec) (n int, err error) | ||||
| 
 | ||||
| func Readv(fd int, iovs [][]byte) (n int, err error) { | ||||
| 	iovecs := bytes2iovec(iovs) | ||||
| 	n, err = readv(fd, iovecs) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| //sys	preadv(fd int, iovs []Iovec, off int64) (n int, err error) | ||||
| 
 | ||||
| func Preadv(fd int, iovs [][]byte, off int64) (n int, err error) { | ||||
| 	iovecs := bytes2iovec(iovs) | ||||
| 	n, err = preadv(fd, iovecs, off) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| //sys	writev(fd int, iovs []Iovec) (n int, err error) | ||||
| 
 | ||||
| func Writev(fd int, iovs [][]byte) (n int, err error) { | ||||
| 	iovecs := bytes2iovec(iovs) | ||||
| 	n, err = writev(fd, iovecs) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| //sys	pwritev(fd int, iovs []Iovec, off int64) (n int, err error) | ||||
| 
 | ||||
| func Pwritev(fd int, iovs [][]byte, off int64) (n int, err error) { | ||||
| 	iovecs := bytes2iovec(iovs) | ||||
| 	n, err = pwritev(fd, iovecs, off) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| //sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) = libsocket.accept4 | ||||
| 
 | ||||
| func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) { | ||||
| 	var rsa RawSockaddrAny | ||||
| 	var len _Socklen = SizeofSockaddrAny | ||||
| 	nfd, err = accept4(fd, &rsa, &len, flags) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	if len > SizeofSockaddrAny { | ||||
| 		panic("RawSockaddrAny too small") | ||||
| 	} | ||||
| 	sa, err = anyToSockaddr(fd, &rsa) | ||||
| 	if err != nil { | ||||
| 		Close(nfd) | ||||
| 		nfd = 0 | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| //sysnb	pipe2(p *[2]_C_int, flags int) (err error) | ||||
| 
 | ||||
| func Pipe2(p []int, flags int) error { | ||||
| 	if len(p) != 2 { | ||||
| 		return EINVAL | ||||
| 	} | ||||
| 	var pp [2]_C_int | ||||
| 	err := pipe2(&pp, flags) | ||||
| 	p[0] = int(pp[0]) | ||||
| 	p[1] = int(pp[1]) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										717
									
								
								vendor/golang.org/x/sys/unix/syscall_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										717
									
								
								vendor/golang.org/x/sys/unix/syscall_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -13,7 +13,6 @@ package unix | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"net" | ||||
| 	"runtime" | ||||
| 	"syscall" | ||||
| 	"unsafe" | ||||
| @ -39,6 +38,20 @@ func Creat(path string, mode uint32) (fd int, err error) { | ||||
| 	return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) | ||||
| } | ||||
| 
 | ||||
| //sys	FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) | ||||
| //sys	fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) | ||||
| 
 | ||||
| func FanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname string) (err error) { | ||||
| 	if pathname == "" { | ||||
| 		return fanotifyMark(fd, flags, mask, dirFd, nil) | ||||
| 	} | ||||
| 	p, err := BytePtrFromString(pathname) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return fanotifyMark(fd, flags, mask, dirFd, p) | ||||
| } | ||||
| 
 | ||||
| //sys	fchmodat(dirfd int, path string, mode uint32) (err error) | ||||
| 
 | ||||
| func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { | ||||
| @ -58,27 +71,15 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { | ||||
| // ioctl itself should not be exposed directly, but additional get/set | ||||
| // functions for specific types are permissible. | ||||
| 
 | ||||
| // IoctlSetPointerInt performs an ioctl operation which sets an | ||||
| // integer value on fd, using the specified request number. The ioctl | ||||
| // argument is called with a pointer to the integer value, rather than | ||||
| // passing the integer value directly. | ||||
| func IoctlSetPointerInt(fd int, req uint, value int) error { | ||||
| 	v := int32(value) | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(&v))) | ||||
| } | ||||
| 
 | ||||
| // IoctlSetInt performs an ioctl operation which sets an integer value | ||||
| // on fd, using the specified request number. | ||||
| func IoctlSetInt(fd int, req uint, value int) error { | ||||
| 	return ioctl(fd, req, uintptr(value)) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetWinsize(fd int, req uint, value *Winsize) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetTermios(fd int, req uint, value *Termios) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| // IoctlRetInt performs an ioctl operation specified by req on a device | ||||
| // associated with opened file descriptor fd, and returns a non-negative | ||||
| // integer that is returned by the ioctl syscall. | ||||
| func IoctlRetInt(fd int, req uint) (int, error) { | ||||
| 	ret, _, err := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), 0) | ||||
| 	if err != 0 { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	return int(ret), nil | ||||
| } | ||||
| 
 | ||||
| func IoctlSetRTCTime(fd int, value *RTCTime) error { | ||||
| @ -87,32 +88,55 @@ func IoctlSetRTCTime(fd int, value *RTCTime) error { | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // IoctlGetInt performs an ioctl operation which gets an integer value | ||||
| // from fd, using the specified request number. | ||||
| func IoctlGetInt(fd int, req uint) (int, error) { | ||||
| 	var value int | ||||
| func IoctlSetRTCWkAlrm(fd int, value *RTCWkAlrm) error { | ||||
| 	err := ioctl(fd, RTC_WKALM_SET, uintptr(unsafe.Pointer(value))) | ||||
| 	runtime.KeepAlive(value) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetUint32(fd int, req uint) (uint32, error) { | ||||
| 	var value uint32 | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { | ||||
| 	var value Winsize | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetTermios(fd int, req uint) (*Termios, error) { | ||||
| 	var value Termios | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetRTCTime(fd int) (*RTCTime, error) { | ||||
| 	var value RTCTime | ||||
| 	err := ioctl(fd, RTC_RD_TIME, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetRTCWkAlrm(fd int) (*RTCWkAlrm, error) { | ||||
| 	var value RTCWkAlrm | ||||
| 	err := ioctl(fd, RTC_WKALM_RD, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| // IoctlFileClone performs an FICLONERANGE ioctl operation to clone the range of | ||||
| // data conveyed in value to the file associated with the file descriptor | ||||
| // destFd. See the ioctl_ficlonerange(2) man page for details. | ||||
| func IoctlFileCloneRange(destFd int, value *FileCloneRange) error { | ||||
| 	err := ioctl(destFd, FICLONERANGE, uintptr(unsafe.Pointer(value))) | ||||
| 	runtime.KeepAlive(value) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // IoctlFileClone performs an FICLONE ioctl operation to clone the entire file | ||||
| // associated with the file description srcFd to the file associated with the | ||||
| // file descriptor destFd. See the ioctl_ficlone(2) man page for details. | ||||
| func IoctlFileClone(destFd, srcFd int) error { | ||||
| 	return ioctl(destFd, FICLONE, uintptr(srcFd)) | ||||
| } | ||||
| 
 | ||||
| // IoctlFileClone performs an FIDEDUPERANGE ioctl operation to share the range of | ||||
| // data conveyed in value with the file associated with the file descriptor | ||||
| // destFd. See the ioctl_fideduperange(2) man page for details. | ||||
| func IoctlFileDedupeRange(destFd int, value *FileDedupeRange) error { | ||||
| 	err := ioctl(destFd, FIDEDUPERANGE, uintptr(unsafe.Pointer(value))) | ||||
| 	runtime.KeepAlive(value) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| //sys	Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) | ||||
| 
 | ||||
| func Link(oldpath string, newpath string) (err error) { | ||||
| @ -137,6 +161,12 @@ func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) | ||||
| 	return openat(dirfd, path, flags|O_LARGEFILE, mode) | ||||
| } | ||||
| 
 | ||||
| //sys	openat2(dirfd int, path string, open_how *OpenHow, size int) (fd int, err error) | ||||
| 
 | ||||
| func Openat2(dirfd int, path string, how *OpenHow) (fd int, err error) { | ||||
| 	return openat2(dirfd, path, how, SizeofOpenHow) | ||||
| } | ||||
| 
 | ||||
| //sys	ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) | ||||
| 
 | ||||
| func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { | ||||
| @ -745,7 +775,7 @@ const px_proto_oe = 0 | ||||
| 
 | ||||
| type SockaddrPPPoE struct { | ||||
| 	SID    uint16 | ||||
| 	Remote net.HardwareAddr | ||||
| 	Remote []byte | ||||
| 	Dev    string | ||||
| 	raw    RawSockaddrPPPoX | ||||
| } | ||||
| @ -779,6 +809,133 @@ func (sa *SockaddrPPPoE) sockaddr() (unsafe.Pointer, _Socklen, error) { | ||||
| 	return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil | ||||
| } | ||||
| 
 | ||||
| // SockaddrTIPC implements the Sockaddr interface for AF_TIPC type sockets. | ||||
| // For more information on TIPC, see: http://tipc.sourceforge.net/. | ||||
| type SockaddrTIPC struct { | ||||
| 	// Scope is the publication scopes when binding service/service range. | ||||
| 	// Should be set to TIPC_CLUSTER_SCOPE or TIPC_NODE_SCOPE. | ||||
| 	Scope int | ||||
| 
 | ||||
| 	// Addr is the type of address used to manipulate a socket. Addr must be | ||||
| 	// one of: | ||||
| 	//  - *TIPCSocketAddr: "id" variant in the C addr union | ||||
| 	//  - *TIPCServiceRange: "nameseq" variant in the C addr union | ||||
| 	//  - *TIPCServiceName: "name" variant in the C addr union | ||||
| 	// | ||||
| 	// If nil, EINVAL will be returned when the structure is used. | ||||
| 	Addr TIPCAddr | ||||
| 
 | ||||
| 	raw RawSockaddrTIPC | ||||
| } | ||||
| 
 | ||||
| // TIPCAddr is implemented by types that can be used as an address for | ||||
| // SockaddrTIPC. It is only implemented by *TIPCSocketAddr, *TIPCServiceRange, | ||||
| // and *TIPCServiceName. | ||||
| type TIPCAddr interface { | ||||
| 	tipcAddrtype() uint8 | ||||
| 	tipcAddr() [12]byte | ||||
| } | ||||
| 
 | ||||
| func (sa *TIPCSocketAddr) tipcAddr() [12]byte { | ||||
| 	var out [12]byte | ||||
| 	copy(out[:], (*(*[unsafe.Sizeof(TIPCSocketAddr{})]byte)(unsafe.Pointer(sa)))[:]) | ||||
| 	return out | ||||
| } | ||||
| 
 | ||||
| func (sa *TIPCSocketAddr) tipcAddrtype() uint8 { return TIPC_SOCKET_ADDR } | ||||
| 
 | ||||
| func (sa *TIPCServiceRange) tipcAddr() [12]byte { | ||||
| 	var out [12]byte | ||||
| 	copy(out[:], (*(*[unsafe.Sizeof(TIPCServiceRange{})]byte)(unsafe.Pointer(sa)))[:]) | ||||
| 	return out | ||||
| } | ||||
| 
 | ||||
| func (sa *TIPCServiceRange) tipcAddrtype() uint8 { return TIPC_SERVICE_RANGE } | ||||
| 
 | ||||
| func (sa *TIPCServiceName) tipcAddr() [12]byte { | ||||
| 	var out [12]byte | ||||
| 	copy(out[:], (*(*[unsafe.Sizeof(TIPCServiceName{})]byte)(unsafe.Pointer(sa)))[:]) | ||||
| 	return out | ||||
| } | ||||
| 
 | ||||
| func (sa *TIPCServiceName) tipcAddrtype() uint8 { return TIPC_SERVICE_ADDR } | ||||
| 
 | ||||
| func (sa *SockaddrTIPC) sockaddr() (unsafe.Pointer, _Socklen, error) { | ||||
| 	if sa.Addr == nil { | ||||
| 		return nil, 0, EINVAL | ||||
| 	} | ||||
| 
 | ||||
| 	sa.raw.Family = AF_TIPC | ||||
| 	sa.raw.Scope = int8(sa.Scope) | ||||
| 	sa.raw.Addrtype = sa.Addr.tipcAddrtype() | ||||
| 	sa.raw.Addr = sa.Addr.tipcAddr() | ||||
| 
 | ||||
| 	return unsafe.Pointer(&sa.raw), SizeofSockaddrTIPC, nil | ||||
| } | ||||
| 
 | ||||
| // SockaddrL2TPIP implements the Sockaddr interface for IPPROTO_L2TP/AF_INET sockets. | ||||
| type SockaddrL2TPIP struct { | ||||
| 	Addr   [4]byte | ||||
| 	ConnId uint32 | ||||
| 	raw    RawSockaddrL2TPIP | ||||
| } | ||||
| 
 | ||||
| func (sa *SockaddrL2TPIP) sockaddr() (unsafe.Pointer, _Socklen, error) { | ||||
| 	sa.raw.Family = AF_INET | ||||
| 	sa.raw.Conn_id = sa.ConnId | ||||
| 	for i := 0; i < len(sa.Addr); i++ { | ||||
| 		sa.raw.Addr[i] = sa.Addr[i] | ||||
| 	} | ||||
| 	return unsafe.Pointer(&sa.raw), SizeofSockaddrL2TPIP, nil | ||||
| } | ||||
| 
 | ||||
| // SockaddrL2TPIP6 implements the Sockaddr interface for IPPROTO_L2TP/AF_INET6 sockets. | ||||
| type SockaddrL2TPIP6 struct { | ||||
| 	Addr   [16]byte | ||||
| 	ZoneId uint32 | ||||
| 	ConnId uint32 | ||||
| 	raw    RawSockaddrL2TPIP6 | ||||
| } | ||||
| 
 | ||||
| func (sa *SockaddrL2TPIP6) sockaddr() (unsafe.Pointer, _Socklen, error) { | ||||
| 	sa.raw.Family = AF_INET6 | ||||
| 	sa.raw.Conn_id = sa.ConnId | ||||
| 	sa.raw.Scope_id = sa.ZoneId | ||||
| 	for i := 0; i < len(sa.Addr); i++ { | ||||
| 		sa.raw.Addr[i] = sa.Addr[i] | ||||
| 	} | ||||
| 	return unsafe.Pointer(&sa.raw), SizeofSockaddrL2TPIP6, nil | ||||
| } | ||||
| 
 | ||||
| // SockaddrIUCV implements the Sockaddr interface for AF_IUCV sockets. | ||||
| type SockaddrIUCV struct { | ||||
| 	UserID string | ||||
| 	Name   string | ||||
| 	raw    RawSockaddrIUCV | ||||
| } | ||||
| 
 | ||||
| func (sa *SockaddrIUCV) sockaddr() (unsafe.Pointer, _Socklen, error) { | ||||
| 	sa.raw.Family = AF_IUCV | ||||
| 	// These are EBCDIC encoded by the kernel, but we still need to pad them | ||||
| 	// with blanks. Initializing with blanks allows the caller to feed in either | ||||
| 	// a padded or an unpadded string. | ||||
| 	for i := 0; i < 8; i++ { | ||||
| 		sa.raw.Nodeid[i] = ' ' | ||||
| 		sa.raw.User_id[i] = ' ' | ||||
| 		sa.raw.Name[i] = ' ' | ||||
| 	} | ||||
| 	if len(sa.UserID) > 8 || len(sa.Name) > 8 { | ||||
| 		return nil, 0, EINVAL | ||||
| 	} | ||||
| 	for i, b := range []byte(sa.UserID[:]) { | ||||
| 		sa.raw.User_id[i] = int8(b) | ||||
| 	} | ||||
| 	for i, b := range []byte(sa.Name[:]) { | ||||
| 		sa.raw.Name[i] = int8(b) | ||||
| 	} | ||||
| 	return unsafe.Pointer(&sa.raw), SizeofSockaddrIUCV, nil | ||||
| } | ||||
| 
 | ||||
| func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { | ||||
| 	switch rsa.Addr.Family { | ||||
| 	case AF_NETLINK: | ||||
| @ -824,11 +981,26 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { | ||||
| 		for n < len(pp.Path) && pp.Path[n] != 0 { | ||||
| 			n++ | ||||
| 		} | ||||
| 		bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] | ||||
| 		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] | ||||
| 		sa.Name = string(bytes) | ||||
| 		return sa, nil | ||||
| 
 | ||||
| 	case AF_INET: | ||||
| 		proto, err := GetsockoptInt(fd, SOL_SOCKET, SO_PROTOCOL) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 
 | ||||
| 		switch proto { | ||||
| 		case IPPROTO_L2TP: | ||||
| 			pp := (*RawSockaddrL2TPIP)(unsafe.Pointer(rsa)) | ||||
| 			sa := new(SockaddrL2TPIP) | ||||
| 			sa.ConnId = pp.Conn_id | ||||
| 			for i := 0; i < len(sa.Addr); i++ { | ||||
| 				sa.Addr[i] = pp.Addr[i] | ||||
| 			} | ||||
| 			return sa, nil | ||||
| 		default: | ||||
| 			pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) | ||||
| 			sa := new(SockaddrInet4) | ||||
| 			p := (*[2]byte)(unsafe.Pointer(&pp.Port)) | ||||
| @ -837,8 +1009,25 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { | ||||
| 				sa.Addr[i] = pp.Addr[i] | ||||
| 			} | ||||
| 			return sa, nil | ||||
| 		} | ||||
| 
 | ||||
| 	case AF_INET6: | ||||
| 		proto, err := GetsockoptInt(fd, SOL_SOCKET, SO_PROTOCOL) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 
 | ||||
| 		switch proto { | ||||
| 		case IPPROTO_L2TP: | ||||
| 			pp := (*RawSockaddrL2TPIP6)(unsafe.Pointer(rsa)) | ||||
| 			sa := new(SockaddrL2TPIP6) | ||||
| 			sa.ConnId = pp.Conn_id | ||||
| 			sa.ZoneId = pp.Scope_id | ||||
| 			for i := 0; i < len(sa.Addr); i++ { | ||||
| 				sa.Addr[i] = pp.Addr[i] | ||||
| 			} | ||||
| 			return sa, nil | ||||
| 		default: | ||||
| 			pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) | ||||
| 			sa := new(SockaddrInet6) | ||||
| 			p := (*[2]byte)(unsafe.Pointer(&pp.Port)) | ||||
| @ -848,6 +1037,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { | ||||
| 				sa.Addr[i] = pp.Addr[i] | ||||
| 			} | ||||
| 			return sa, nil | ||||
| 		} | ||||
| 
 | ||||
| 	case AF_VSOCK: | ||||
| 		pp := (*RawSockaddrVM)(unsafe.Pointer(rsa)) | ||||
| @ -896,7 +1086,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { | ||||
| 		} | ||||
| 		sa := &SockaddrPPPoE{ | ||||
| 			SID:    binary.BigEndian.Uint16(pp[6:8]), | ||||
| 			Remote: net.HardwareAddr(pp[8:14]), | ||||
| 			Remote: pp[8:14], | ||||
| 		} | ||||
| 		for i := 14; i < 14+IFNAMSIZ; i++ { | ||||
| 			if pp[i] == 0 { | ||||
| @ -905,6 +1095,59 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { | ||||
| 			} | ||||
| 		} | ||||
| 		return sa, nil | ||||
| 	case AF_TIPC: | ||||
| 		pp := (*RawSockaddrTIPC)(unsafe.Pointer(rsa)) | ||||
| 
 | ||||
| 		sa := &SockaddrTIPC{ | ||||
| 			Scope: int(pp.Scope), | ||||
| 		} | ||||
| 
 | ||||
| 		// Determine which union variant is present in pp.Addr by checking | ||||
| 		// pp.Addrtype. | ||||
| 		switch pp.Addrtype { | ||||
| 		case TIPC_SERVICE_RANGE: | ||||
| 			sa.Addr = (*TIPCServiceRange)(unsafe.Pointer(&pp.Addr)) | ||||
| 		case TIPC_SERVICE_ADDR: | ||||
| 			sa.Addr = (*TIPCServiceName)(unsafe.Pointer(&pp.Addr)) | ||||
| 		case TIPC_SOCKET_ADDR: | ||||
| 			sa.Addr = (*TIPCSocketAddr)(unsafe.Pointer(&pp.Addr)) | ||||
| 		default: | ||||
| 			return nil, EINVAL | ||||
| 		} | ||||
| 
 | ||||
| 		return sa, nil | ||||
| 	case AF_IUCV: | ||||
| 		pp := (*RawSockaddrIUCV)(unsafe.Pointer(rsa)) | ||||
| 
 | ||||
| 		var user [8]byte | ||||
| 		var name [8]byte | ||||
| 
 | ||||
| 		for i := 0; i < 8; i++ { | ||||
| 			user[i] = byte(pp.User_id[i]) | ||||
| 			name[i] = byte(pp.Name[i]) | ||||
| 		} | ||||
| 
 | ||||
| 		sa := &SockaddrIUCV{ | ||||
| 			UserID: string(user[:]), | ||||
| 			Name:   string(name[:]), | ||||
| 		} | ||||
| 		return sa, nil | ||||
| 
 | ||||
| 	case AF_CAN: | ||||
| 		pp := (*RawSockaddrCAN)(unsafe.Pointer(rsa)) | ||||
| 		sa := &SockaddrCAN{ | ||||
| 			Ifindex: int(pp.Ifindex), | ||||
| 		} | ||||
| 		rx := (*[4]byte)(unsafe.Pointer(&sa.RxID)) | ||||
| 		for i := 0; i < 4; i++ { | ||||
| 			rx[i] = pp.Addr[i] | ||||
| 		} | ||||
| 		tx := (*[4]byte)(unsafe.Pointer(&sa.TxID)) | ||||
| 		for i := 0; i < 4; i++ { | ||||
| 			tx[i] = pp.Addr[i+4] | ||||
| 		} | ||||
| 		return sa, nil | ||||
| 
 | ||||
| 	} | ||||
| 	return nil, EAFNOSUPPORT | ||||
| } | ||||
| @ -990,10 +1233,50 @@ func GetsockoptString(fd, level, opt int) (string, error) { | ||||
| 	return string(buf[:vallen-1]), nil | ||||
| } | ||||
| 
 | ||||
| func GetsockoptTpacketStats(fd, level, opt int) (*TpacketStats, error) { | ||||
| 	var value TpacketStats | ||||
| 	vallen := _Socklen(SizeofTpacketStats) | ||||
| 	err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func GetsockoptTpacketStatsV3(fd, level, opt int) (*TpacketStatsV3, error) { | ||||
| 	var value TpacketStatsV3 | ||||
| 	vallen := _Socklen(SizeofTpacketStatsV3) | ||||
| 	err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { | ||||
| 	return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) | ||||
| } | ||||
| 
 | ||||
| func SetsockoptPacketMreq(fd, level, opt int, mreq *PacketMreq) error { | ||||
| 	return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) | ||||
| } | ||||
| 
 | ||||
| // SetsockoptSockFprog attaches a classic BPF or an extended BPF program to a | ||||
| // socket to filter incoming packets.  See 'man 7 socket' for usage information. | ||||
| func SetsockoptSockFprog(fd, level, opt int, fprog *SockFprog) error { | ||||
| 	return setsockopt(fd, level, opt, unsafe.Pointer(fprog), unsafe.Sizeof(*fprog)) | ||||
| } | ||||
| 
 | ||||
| func SetsockoptCanRawFilter(fd, level, opt int, filter []CanFilter) error { | ||||
| 	var p unsafe.Pointer | ||||
| 	if len(filter) > 0 { | ||||
| 		p = unsafe.Pointer(&filter[0]) | ||||
| 	} | ||||
| 	return setsockopt(fd, level, opt, p, uintptr(len(filter)*SizeofCanFilter)) | ||||
| } | ||||
| 
 | ||||
| func SetsockoptTpacketReq(fd, level, opt int, tp *TpacketReq) error { | ||||
| 	return setsockopt(fd, level, opt, unsafe.Pointer(tp), unsafe.Sizeof(*tp)) | ||||
| } | ||||
| 
 | ||||
| func SetsockoptTpacketReq3(fd, level, opt int, tp *TpacketReq3) error { | ||||
| 	return setsockopt(fd, level, opt, unsafe.Pointer(tp), unsafe.Sizeof(*tp)) | ||||
| } | ||||
| 
 | ||||
| // Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html) | ||||
| 
 | ||||
| // KeyctlInt calls keyctl commands in which each argument is an int. | ||||
| @ -1101,6 +1384,34 @@ func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error | ||||
| 	return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer) | ||||
| } | ||||
| 
 | ||||
| // KeyctlRestrictKeyring implements the KEYCTL_RESTRICT_KEYRING command. This | ||||
| // command limits the set of keys that can be linked to the keyring, regardless | ||||
| // of keyring permissions. The command requires the "setattr" permission. | ||||
| // | ||||
| // When called with an empty keyType the command locks the keyring, preventing | ||||
| // any further keys from being linked to the keyring. | ||||
| // | ||||
| // The "asymmetric" keyType defines restrictions requiring key payloads to be | ||||
| // DER encoded X.509 certificates signed by keys in another keyring. Restrictions | ||||
| // for "asymmetric" include "builtin_trusted", "builtin_and_secondary_trusted", | ||||
| // "key_or_keyring:<key>", and "key_or_keyring:<key>:chain". | ||||
| // | ||||
| // As of Linux 4.12, only the "asymmetric" keyType defines type-specific | ||||
| // restrictions. | ||||
| // | ||||
| // See the full documentation at: | ||||
| // http://man7.org/linux/man-pages/man3/keyctl_restrict_keyring.3.html | ||||
| // http://man7.org/linux/man-pages/man2/keyctl.2.html | ||||
| func KeyctlRestrictKeyring(ringid int, keyType string, restriction string) error { | ||||
| 	if keyType == "" { | ||||
| 		return keyctlRestrictKeyring(KEYCTL_RESTRICT_KEYRING, ringid) | ||||
| 	} | ||||
| 	return keyctlRestrictKeyringByType(KEYCTL_RESTRICT_KEYRING, ringid, keyType, restriction) | ||||
| } | ||||
| 
 | ||||
| //sys keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (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) { | ||||
| 	var msg Msghdr | ||||
| 	var rsa RawSockaddrAny | ||||
| @ -1344,8 +1655,12 @@ func PtraceSyscall(pid int, signal int) (err error) { | ||||
| 
 | ||||
| func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) } | ||||
| 
 | ||||
| func PtraceInterrupt(pid int) (err error) { return ptrace(PTRACE_INTERRUPT, pid, 0, 0) } | ||||
| 
 | ||||
| func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) } | ||||
| 
 | ||||
| func PtraceSeize(pid int) (err error) { return ptrace(PTRACE_SEIZE, pid, 0, 0) } | ||||
| 
 | ||||
| func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) } | ||||
| 
 | ||||
| //sys	reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) | ||||
| @ -1354,8 +1669,20 @@ func Reboot(cmd int) (err error) { | ||||
| 	return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "") | ||||
| } | ||||
| 
 | ||||
| func ReadDirent(fd int, buf []byte) (n int, err error) { | ||||
| 	return Getdents(fd, buf) | ||||
| func direntIno(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) | ||||
| } | ||||
| 
 | ||||
| func direntReclen(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) | ||||
| } | ||||
| 
 | ||||
| func direntNamlen(buf []byte) (uint64, bool) { | ||||
| 	reclen, ok := direntReclen(buf) | ||||
| 	if !ok { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true | ||||
| } | ||||
| 
 | ||||
| //sys	mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) | ||||
| @ -1390,6 +1717,8 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Acct(path string) (err error) | ||||
| //sys	AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) | ||||
| //sys	Adjtimex(buf *Timex) (state int, err error) | ||||
| //sysnb	Capget(hdr *CapUserHeader, data *CapUserData) (err error) | ||||
| //sysnb	Capset(hdr *CapUserHeader, data *CapUserData) (err error) | ||||
| //sys	Chdir(path string) (err error) | ||||
| //sys	Chroot(path string) (err error) | ||||
| //sys	ClockGetres(clockid int32, res *Timespec) (err error) | ||||
| @ -1399,6 +1728,15 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) | ||||
| //sys	DeleteModule(name string, flags int) (err error) | ||||
| //sys	Dup(oldfd int) (fd int, err error) | ||||
| 
 | ||||
| func Dup2(oldfd, newfd int) error { | ||||
| 	// Android O and newer blocks dup2; riscv and arm64 don't implement dup2. | ||||
| 	if runtime.GOOS == "android" || runtime.GOARCH == "riscv64" || runtime.GOARCH == "arm64" { | ||||
| 		return Dup3(oldfd, newfd, 0) | ||||
| 	} | ||||
| 	return dup2(oldfd, newfd) | ||||
| } | ||||
| 
 | ||||
| //sys	Dup3(oldfd int, newfd int, flags int) (err error) | ||||
| //sysnb	EpollCreate1(flag int) (fd int, err error) | ||||
| //sysnb	EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) | ||||
| @ -1408,7 +1746,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Fchdir(fd int) (err error) | ||||
| //sys	Fchmod(fd int, mode uint32) (err error) | ||||
| //sys	Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) | ||||
| //sys	fcntl(fd int, cmd int, arg int) (val int, err error) | ||||
| //sys	Fdatasync(fd int) (err error) | ||||
| //sys	Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) | ||||
| //sys	FinitModule(fd int, params string, flags int) (err error) | ||||
| @ -1464,6 +1801,17 @@ func Getpgrp() (pid int) { | ||||
| //sysnb	Settimeofday(tv *Timeval) (err error) | ||||
| //sys	Setns(fd int, nstype int) (err error) | ||||
| 
 | ||||
| // PrctlRetInt performs a prctl operation specified by option and further | ||||
| // optional arguments arg2 through arg5 depending on option. It returns a | ||||
| // non-negative integer that is returned by the prctl syscall. | ||||
| func PrctlRetInt(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (int, error) { | ||||
| 	ret, _, err := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) | ||||
| 	if err != 0 { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	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 | ||||
| @ -1477,14 +1825,45 @@ func Setgid(uid int) (err error) { | ||||
| 	return EOPNOTSUPP | ||||
| } | ||||
| 
 | ||||
| // SetfsgidRetGid sets fsgid for current thread and returns previous fsgid set. | ||||
| // setfsgid(2) will return a non-nil error only if its caller lacks CAP_SETUID capability. | ||||
| // If the call fails due to other reasons, current fsgid will be returned. | ||||
| func SetfsgidRetGid(gid int) (int, error) { | ||||
| 	return setfsgid(gid) | ||||
| } | ||||
| 
 | ||||
| // SetfsuidRetUid sets fsuid for current thread and returns previous fsuid set. | ||||
| // setfsgid(2) will return a non-nil error only if its caller lacks CAP_SETUID capability | ||||
| // If the call fails due to other reasons, current fsuid will be returned. | ||||
| func SetfsuidRetUid(uid int) (int, error) { | ||||
| 	return setfsuid(uid) | ||||
| } | ||||
| 
 | ||||
| func Setfsgid(gid int) error { | ||||
| 	_, err := setfsgid(gid) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func Setfsuid(uid int) error { | ||||
| 	_, err := setfsuid(uid) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) { | ||||
| 	return signalfd(fd, sigmask, _C__NSIG/8, flags) | ||||
| } | ||||
| 
 | ||||
| //sys	Setpriority(which int, who int, prio int) (err error) | ||||
| //sys	Setxattr(path string, attr string, data []byte, flags int) (err error) | ||||
| //sys	Signalfd(fd int, mask *Sigset_t, flags int) = SYS_SIGNALFD4 | ||||
| //sys	signalfd(fd int, sigmask *Sigset_t, maskSize uintptr, flags int) (newfd int, err error) = SYS_SIGNALFD4 | ||||
| //sys	Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) | ||||
| //sys	Sync() | ||||
| //sys	Syncfs(fd int) (err error) | ||||
| //sysnb	Sysinfo(info *Sysinfo_t) (err error) | ||||
| //sys	Tee(rfd int, wfd int, len int, flags int) (n int64, err error) | ||||
| //sysnb TimerfdCreate(clockid int, flags int) (fd int, err error) | ||||
| //sysnb TimerfdGettime(fd int, currValue *ItimerSpec) (err error) | ||||
| //sysnb TimerfdSettime(fd int, flags int, newValue *ItimerSpec, oldValue *ItimerSpec) (err error) | ||||
| //sysnb	Tgkill(tgid int, tid int, sig syscall.Signal) (err error) | ||||
| //sysnb	Times(tms *Tms) (ticks uintptr, err error) | ||||
| //sysnb	Umask(mask int) (oldmask int) | ||||
| @ -1495,6 +1874,123 @@ func Setgid(uid int) (err error) { | ||||
| //sys	exitThread(code int) (err error) = SYS_EXIT | ||||
| //sys	readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ | ||||
| //sys	writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE | ||||
| //sys	readv(fd int, iovs []Iovec) (n int, err error) = SYS_READV | ||||
| //sys	writev(fd int, iovs []Iovec) (n int, err error) = SYS_WRITEV | ||||
| //sys	preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) = SYS_PREADV | ||||
| //sys	pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) = SYS_PWRITEV | ||||
| //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 | ||||
| 
 | ||||
| func bytes2iovec(bs [][]byte) []Iovec { | ||||
| 	iovecs := make([]Iovec, len(bs)) | ||||
| 	for i, b := range bs { | ||||
| 		iovecs[i].SetLen(len(b)) | ||||
| 		if len(b) > 0 { | ||||
| 			iovecs[i].Base = &b[0] | ||||
| 		} else { | ||||
| 			iovecs[i].Base = (*byte)(unsafe.Pointer(&_zero)) | ||||
| 		} | ||||
| 	} | ||||
| 	return iovecs | ||||
| } | ||||
| 
 | ||||
| // offs2lohi splits offs into its lower and upper unsigned long. On 64-bit | ||||
| // 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) { | ||||
| 	return uintptr(offs), uintptr(uint64(offs) >> SizeofLong) | ||||
| } | ||||
| 
 | ||||
| func Readv(fd int, iovs [][]byte) (n int, err error) { | ||||
| 	iovecs := bytes2iovec(iovs) | ||||
| 	n, err = readv(fd, iovecs) | ||||
| 	readvRacedetect(iovecs, n, err) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| func Preadv(fd int, iovs [][]byte, offset int64) (n int, err error) { | ||||
| 	iovecs := bytes2iovec(iovs) | ||||
| 	lo, hi := offs2lohi(offset) | ||||
| 	n, err = preadv(fd, iovecs, lo, hi) | ||||
| 	readvRacedetect(iovecs, n, err) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| func Preadv2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) { | ||||
| 	iovecs := bytes2iovec(iovs) | ||||
| 	lo, hi := offs2lohi(offset) | ||||
| 	n, err = preadv2(fd, iovecs, lo, hi, flags) | ||||
| 	readvRacedetect(iovecs, n, err) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| func readvRacedetect(iovecs []Iovec, n int, err error) { | ||||
| 	if !raceenabled { | ||||
| 		return | ||||
| 	} | ||||
| 	for i := 0; n > 0 && i < len(iovecs); i++ { | ||||
| 		m := int(iovecs[i].Len) | ||||
| 		if m > n { | ||||
| 			m = n | ||||
| 		} | ||||
| 		n -= m | ||||
| 		if m > 0 { | ||||
| 			raceWriteRange(unsafe.Pointer(iovecs[i].Base), m) | ||||
| 		} | ||||
| 	} | ||||
| 	if err == nil { | ||||
| 		raceAcquire(unsafe.Pointer(&ioSync)) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func Writev(fd int, iovs [][]byte) (n int, err error) { | ||||
| 	iovecs := bytes2iovec(iovs) | ||||
| 	if raceenabled { | ||||
| 		raceReleaseMerge(unsafe.Pointer(&ioSync)) | ||||
| 	} | ||||
| 	n, err = writev(fd, iovecs) | ||||
| 	writevRacedetect(iovecs, n) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| func Pwritev(fd int, iovs [][]byte, offset int64) (n int, err error) { | ||||
| 	iovecs := bytes2iovec(iovs) | ||||
| 	if raceenabled { | ||||
| 		raceReleaseMerge(unsafe.Pointer(&ioSync)) | ||||
| 	} | ||||
| 	lo, hi := offs2lohi(offset) | ||||
| 	n, err = pwritev(fd, iovecs, lo, hi) | ||||
| 	writevRacedetect(iovecs, n) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| func Pwritev2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) { | ||||
| 	iovecs := bytes2iovec(iovs) | ||||
| 	if raceenabled { | ||||
| 		raceReleaseMerge(unsafe.Pointer(&ioSync)) | ||||
| 	} | ||||
| 	lo, hi := offs2lohi(offset) | ||||
| 	n, err = pwritev2(fd, iovecs, lo, hi, flags) | ||||
| 	writevRacedetect(iovecs, n) | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| func writevRacedetect(iovecs []Iovec, n int) { | ||||
| 	if !raceenabled { | ||||
| 		return | ||||
| 	} | ||||
| 	for i := 0; n > 0 && i < len(iovecs); i++ { | ||||
| 		m := int(iovecs[i].Len) | ||||
| 		if m > n { | ||||
| 			m = n | ||||
| 		} | ||||
| 		n -= m | ||||
| 		if m > 0 { | ||||
| 			raceReadRange(unsafe.Pointer(iovecs[i].Base), m) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // mmap varies by architecture; see syscall_linux_*.go. | ||||
| //sys	munmap(addr uintptr, length uintptr) (err error) | ||||
| @ -1537,11 +2033,30 @@ func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { | ||||
| 	return int(n), nil | ||||
| } | ||||
| 
 | ||||
| func isGroupMember(gid int) bool { | ||||
| 	groups, err := Getgroups() | ||||
| 	if err != nil { | ||||
| 		return false | ||||
| 	} | ||||
| 
 | ||||
| 	for _, g := range groups { | ||||
| 		if g == gid { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| //sys	faccessat(dirfd int, path string, mode uint32) (err error) | ||||
| //sys	Faccessat2(dirfd int, path string, mode uint32, flags int) (err error) | ||||
| 
 | ||||
| func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { | ||||
| 	if flags & ^(AT_SYMLINK_NOFOLLOW|AT_EACCESS) != 0 { | ||||
| 		return EINVAL | ||||
| 	if flags == 0 { | ||||
| 		return faccessat(dirfd, path, mode) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := Faccessat2(dirfd, path, mode, flags); err != ENOSYS && err != EPERM { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	// The Linux kernel faccessat system call does not take any flags. | ||||
| @ -1550,8 +2065,8 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { | ||||
| 	// Because people naturally expect syscall.Faccessat to act | ||||
| 	// like C faccessat, we do the same. | ||||
| 
 | ||||
| 	if flags == 0 { | ||||
| 		return faccessat(dirfd, path, mode) | ||||
| 	if flags & ^(AT_SYMLINK_NOFOLLOW|AT_EACCESS) != 0 { | ||||
| 		return EINVAL | ||||
| 	} | ||||
| 
 | ||||
| 	var st Stat_t | ||||
| @ -1594,7 +2109,7 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { | ||||
| 			gid = Getgid() | ||||
| 		} | ||||
| 
 | ||||
| 		if uint32(gid) == st.Gid { | ||||
| 		if uint32(gid) == st.Gid || isGroupMember(gid) { | ||||
| 			fmode = (st.Mode >> 3) & 7 | ||||
| 		} else { | ||||
| 			fmode = st.Mode & 7 | ||||
| @ -1608,6 +2123,105 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { | ||||
| 	return EACCES | ||||
| } | ||||
| 
 | ||||
| //sys nameToHandleAt(dirFD int, pathname string, fh *fileHandle, mountID *_C_int, flags int) (err error) = SYS_NAME_TO_HANDLE_AT | ||||
| //sys openByHandleAt(mountFD int, fh *fileHandle, flags int) (fd int, err error) = SYS_OPEN_BY_HANDLE_AT | ||||
| 
 | ||||
| // fileHandle is the argument to nameToHandleAt and openByHandleAt. We | ||||
| // originally tried to generate it via unix/linux/types.go with "type | ||||
| // fileHandle C.struct_file_handle" but that generated empty structs | ||||
| // for mips64 and mips64le. Instead, hard code it for now (it's the | ||||
| // same everywhere else) until the mips64 generator issue is fixed. | ||||
| type fileHandle struct { | ||||
| 	Bytes uint32 | ||||
| 	Type  int32 | ||||
| } | ||||
| 
 | ||||
| // FileHandle represents the C struct file_handle used by | ||||
| // name_to_handle_at (see NameToHandleAt) and open_by_handle_at (see | ||||
| // OpenByHandleAt). | ||||
| type FileHandle struct { | ||||
| 	*fileHandle | ||||
| } | ||||
| 
 | ||||
| // NewFileHandle constructs a FileHandle. | ||||
| func NewFileHandle(handleType int32, handle []byte) FileHandle { | ||||
| 	const hdrSize = unsafe.Sizeof(fileHandle{}) | ||||
| 	buf := make([]byte, hdrSize+uintptr(len(handle))) | ||||
| 	copy(buf[hdrSize:], handle) | ||||
| 	fh := (*fileHandle)(unsafe.Pointer(&buf[0])) | ||||
| 	fh.Type = handleType | ||||
| 	fh.Bytes = uint32(len(handle)) | ||||
| 	return FileHandle{fh} | ||||
| } | ||||
| 
 | ||||
| func (fh *FileHandle) Size() int   { return int(fh.fileHandle.Bytes) } | ||||
| func (fh *FileHandle) Type() int32 { return fh.fileHandle.Type } | ||||
| func (fh *FileHandle) Bytes() []byte { | ||||
| 	n := fh.Size() | ||||
| 	if n == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return (*[1 << 30]byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&fh.fileHandle.Type)) + 4))[:n:n] | ||||
| } | ||||
| 
 | ||||
| // NameToHandleAt wraps the name_to_handle_at system call; it obtains | ||||
| // a handle for a path name. | ||||
| func NameToHandleAt(dirfd int, path string, flags int) (handle FileHandle, mountID int, err error) { | ||||
| 	var mid _C_int | ||||
| 	// Try first with a small buffer, assuming the handle will | ||||
| 	// only be 32 bytes. | ||||
| 	size := uint32(32 + unsafe.Sizeof(fileHandle{})) | ||||
| 	didResize := false | ||||
| 	for { | ||||
| 		buf := make([]byte, size) | ||||
| 		fh := (*fileHandle)(unsafe.Pointer(&buf[0])) | ||||
| 		fh.Bytes = size - uint32(unsafe.Sizeof(fileHandle{})) | ||||
| 		err = nameToHandleAt(dirfd, path, fh, &mid, flags) | ||||
| 		if err == EOVERFLOW { | ||||
| 			if didResize { | ||||
| 				// We shouldn't need to resize more than once | ||||
| 				return | ||||
| 			} | ||||
| 			didResize = true | ||||
| 			size = fh.Bytes + uint32(unsafe.Sizeof(fileHandle{})) | ||||
| 			continue | ||||
| 		} | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 		return FileHandle{fh}, int(mid), nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // OpenByHandleAt wraps the open_by_handle_at system call; it opens a | ||||
| // file via a handle as previously returned by NameToHandleAt. | ||||
| func OpenByHandleAt(mountFD int, handle FileHandle, flags int) (fd int, err error) { | ||||
| 	return openByHandleAt(mountFD, handle.fileHandle, flags) | ||||
| } | ||||
| 
 | ||||
| // Klogset wraps the sys_syslog system call; it sets console_loglevel to | ||||
| // the value specified by arg and passes a dummy pointer to bufp. | ||||
| func Klogset(typ int, arg int) (err error) { | ||||
| 	var p unsafe.Pointer | ||||
| 	_, _, errno := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(p), uintptr(arg)) | ||||
| 	if errno != 0 { | ||||
| 		return errnoErr(errno) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // RemoteIovec is Iovec with the pointer replaced with an integer. | ||||
| // It is used for ProcessVMReadv and ProcessVMWritev, where the pointer | ||||
| // refers to a location in a different process' address space, which | ||||
| // would confuse the Go garbage collector. | ||||
| type RemoteIovec struct { | ||||
| 	Base uintptr | ||||
| 	Len  int | ||||
| } | ||||
| 
 | ||||
| //sys	ProcessVMReadv(pid int, localIov []Iovec, remoteIov []RemoteIovec, flags uint) (n int, err error) = SYS_PROCESS_VM_READV | ||||
| //sys	ProcessVMWritev(pid int, localIov []Iovec, remoteIov []RemoteIovec, flags uint) (n int, err error) = SYS_PROCESS_VM_WRITEV | ||||
| 
 | ||||
| /* | ||||
|  * Unimplemented | ||||
|  */ | ||||
| @ -1615,8 +2229,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { | ||||
| // Alarm | ||||
| // ArchPrctl | ||||
| // Brk | ||||
| // Capget | ||||
| // Capset | ||||
| // ClockNanosleep | ||||
| // ClockSettime | ||||
| // Clone | ||||
| @ -1704,7 +2316,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { | ||||
| // TimerGetoverrun | ||||
| // TimerGettime | ||||
| // TimerSettime | ||||
| // Timerfd | ||||
| // Tkill (obsolete) | ||||
| // Tuxcall | ||||
| // Umount2 | ||||
|  | ||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -49,7 +49,7 @@ func Pipe2(p []int, flags int) (err error) { | ||||
| 
 | ||||
| // 64-bit file system and 32-bit uid calls | ||||
| // (386 default is 32-bit file system and 16-bit uid). | ||||
| //sys	Dup2(oldfd int, newfd int) (err error) | ||||
| //sys	dup2(oldfd int, newfd int) (err error) | ||||
| //sysnb	EpollCreate(size int) (fd int, err error) | ||||
| //sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) | ||||
| //sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64 | ||||
| @ -70,8 +70,8 @@ func Pipe2(p []int, flags int) (err error) { | ||||
| //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	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 | ||||
| //sys	Setfsgid(gid int) (err error) = SYS_SETFSGID32 | ||||
| //sys	Setfsuid(uid int) (err error) = SYS_SETFSUID32 | ||||
| //sys	setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32 | ||||
| //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 | ||||
| @ -372,6 +372,10 @@ func (msghdr *Msghdr) SetControllen(length int) { | ||||
| 	msghdr.Controllen = uint32(length) | ||||
| } | ||||
| 
 | ||||
| func (msghdr *Msghdr) SetIovlen(length int) { | ||||
| 	msghdr.Iovlen = uint32(length) | ||||
| } | ||||
| 
 | ||||
| func (cmsg *Cmsghdr) SetLen(length int) { | ||||
| 	cmsg.Len = uint32(length) | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -6,7 +6,7 @@ | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| //sys	Dup2(oldfd int, newfd int) (err error) | ||||
| //sys	dup2(oldfd int, newfd int) (err error) | ||||
| //sysnb	EpollCreate(size int) (fd int, err error) | ||||
| //sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) | ||||
| //sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 | ||||
| @ -55,8 +55,8 @@ 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	Setfsgid(gid int) (err error) | ||||
| //sys	Setfsuid(uid int) (err error) | ||||
| //sys	setfsgid(gid 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) | ||||
| @ -163,6 +163,10 @@ 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) | ||||
| } | ||||
|  | ||||
							
								
								
									
										34
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -7,7 +7,6 @@ | ||||
| package unix | ||||
| 
 | ||||
| import ( | ||||
| 	"syscall" | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| @ -19,12 +18,18 @@ func setTimeval(sec, usec int64) Timeval { | ||||
| 	return Timeval{Sec: int32(sec), Usec: int32(usec)} | ||||
| } | ||||
| 
 | ||||
| //sysnb	pipe(p *[2]_C_int) (err error) | ||||
| 
 | ||||
| func Pipe(p []int) (err error) { | ||||
| 	if len(p) != 2 { | ||||
| 		return EINVAL | ||||
| 	} | ||||
| 	var pp [2]_C_int | ||||
| 	// Try pipe2 first for Android O, then try pipe for kernel 2.6.23. | ||||
| 	err = pipe2(&pp, 0) | ||||
| 	if err == ENOSYS { | ||||
| 		err = pipe(&pp) | ||||
| 	} | ||||
| 	p[0] = int(pp[0]) | ||||
| 	p[1] = int(pp[1]) | ||||
| 	return | ||||
| @ -43,10 +48,6 @@ func Pipe2(p []int, flags int) (err error) { | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Underlying system call writes to newoffset via pointer. | ||||
| // Implemented in assembly to avoid allocation. | ||||
| func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) | ||||
| 
 | ||||
| func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { | ||||
| 	newoffset, errno := seek(fd, offset, whence) | ||||
| 	if errno != 0 { | ||||
| @ -74,7 +75,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { | ||||
| 
 | ||||
| // 64-bit file system and 32-bit uid calls | ||||
| // (16-bit uid calls are not always supported in newer kernels) | ||||
| //sys	Dup2(oldfd int, newfd int) (err error) | ||||
| //sys	dup2(oldfd int, newfd int) (err error) | ||||
| //sysnb	EpollCreate(size int) (fd int, err error) | ||||
| //sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) | ||||
| //sys	Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 | ||||
| @ -92,8 +93,8 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, 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	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT | ||||
| //sys	Setfsgid(gid int) (err error) = SYS_SETFSGID32 | ||||
| //sys	Setfsuid(uid int) (err error) = SYS_SETFSUID32 | ||||
| //sys	setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32 | ||||
| //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 | ||||
| @ -246,6 +247,10 @@ func (msghdr *Msghdr) SetControllen(length int) { | ||||
| 	msghdr.Controllen = uint32(length) | ||||
| } | ||||
| 
 | ||||
| func (msghdr *Msghdr) SetIovlen(length int) { | ||||
| 	msghdr.Iovlen = uint32(length) | ||||
| } | ||||
| 
 | ||||
| func (cmsg *Cmsghdr) SetLen(length int) { | ||||
| 	cmsg.Len = uint32(length) | ||||
| } | ||||
| @ -266,3 +271,16 @@ func SyncFileRange(fd int, off int64, n int64, flags int) error { | ||||
| 	// order of their arguments. | ||||
| 	return armSyncFileRange(fd, flags, off, n) | ||||
| } | ||||
| 
 | ||||
| //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) | ||||
| } | ||||
|  | ||||
							
								
								
									
										49
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										49
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -25,7 +25,7 @@ func EpollCreate(size int) (fd int, err error) { | ||||
| //sysnb	Getegid() (egid int) | ||||
| //sysnb	Geteuid() (euid int) | ||||
| //sysnb	Getgid() (gid int) | ||||
| //sysnb	Getrlimit(resource int, rlim *Rlimit) (err error) | ||||
| //sysnb	getrlimit(resource int, rlim *Rlimit) (err error) | ||||
| //sysnb	Getuid() (uid int) | ||||
| //sys	Listen(s int, n int) (err error) | ||||
| //sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 | ||||
| @ -42,12 +42,12 @@ 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	Setfsgid(gid int) (err error) | ||||
| //sys	Setfsuid(uid int) (err error) | ||||
| //sys	setfsgid(gid 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	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) | ||||
| @ -168,6 +168,24 @@ func Pipe2(p []int, flags int) (err error) { | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Getrlimit prefers the prlimit64 system call. See issue 38604. | ||||
| func Getrlimit(resource int, rlim *Rlimit) error { | ||||
| 	err := prlimit(0, resource, nil, rlim) | ||||
| 	if err != ENOSYS { | ||||
| 		return err | ||||
| 	} | ||||
| 	return getrlimit(resource, rlim) | ||||
| } | ||||
| 
 | ||||
| // Setrlimit prefers the prlimit64 system call. See issue 38604. | ||||
| func Setrlimit(resource int, rlim *Rlimit) error { | ||||
| 	err := prlimit(0, resource, rlim, nil) | ||||
| 	if err != ENOSYS { | ||||
| 		return err | ||||
| 	} | ||||
| 	return setrlimit(resource, rlim) | ||||
| } | ||||
| 
 | ||||
| func (r *PtraceRegs) PC() uint64 { return r.Pc } | ||||
| 
 | ||||
| func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } | ||||
| @ -180,6 +198,10 @@ 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) | ||||
| } | ||||
| @ -188,9 +210,9 @@ func InotifyInit() (fd int, err error) { | ||||
| 	return InotifyInit1(0) | ||||
| } | ||||
| 
 | ||||
| func Dup2(oldfd int, newfd int) (err error) { | ||||
| 	return Dup3(oldfd, newfd, 0) | ||||
| } | ||||
| // dup2 exists because func Dup3 in syscall_linux.go references | ||||
| // it in an unreachable path. dup2 isn't available on arm64. | ||||
| func dup2(oldfd int, newfd int) error | ||||
| 
 | ||||
| func Pause() error { | ||||
| 	_, err := ppoll(nil, 0, nil, nil) | ||||
| @ -208,3 +230,16 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { | ||||
| 	} | ||||
| 	return ppoll(&fds[0], len(fds), ts, nil) | ||||
| } | ||||
| 
 | ||||
| //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) | ||||
| } | ||||
|  | ||||
							
								
								
									
										13
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| // Copyright 2009 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build arm,!gccgo,linux | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import "syscall" | ||||
| 
 | ||||
| // Underlying system call writes to newoffset via pointer. | ||||
| // Implemented in assembly to avoid allocation. | ||||
| func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) | ||||
							
								
								
									
										14
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -7,7 +7,7 @@ | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| //sys	Dup2(oldfd int, newfd int) (err error) | ||||
| //sys	dup2(oldfd int, newfd int) (err error) | ||||
| //sysnb	EpollCreate(size int) (fd int, err error) | ||||
| //sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) | ||||
| //sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 | ||||
| @ -36,8 +36,8 @@ 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	Setfsgid(gid int) (err error) | ||||
| //sys	Setfsuid(uid int) (err error) | ||||
| //sys	setfsgid(gid 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) | ||||
| @ -208,10 +208,18 @@ 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 InotifyInit() (fd int, err error) { | ||||
| 	return InotifyInit1(0) | ||||
| } | ||||
| 
 | ||||
| //sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error) | ||||
| 
 | ||||
| func Poll(fds []PollFd, timeout int) (n int, err error) { | ||||
|  | ||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -14,7 +14,7 @@ import ( | ||||
| 
 | ||||
| func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) | ||||
| 
 | ||||
| //sys	Dup2(oldfd int, newfd int) (err error) | ||||
| //sys	dup2(oldfd int, newfd int) (err error) | ||||
| //sysnb	EpollCreate(size int) (fd int, err error) | ||||
| //sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) | ||||
| //sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 | ||||
| @ -31,8 +31,8 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, | ||||
| //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	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 | ||||
| //sys	Setfsgid(gid int) (err error) | ||||
| //sys	Setfsuid(uid int) (err error) | ||||
| //sys	setfsgid(gid 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) | ||||
| @ -220,6 +220,10 @@ func (msghdr *Msghdr) SetControllen(length int) { | ||||
| 	msghdr.Controllen = uint32(length) | ||||
| } | ||||
| 
 | ||||
| func (msghdr *Msghdr) SetIovlen(length int) { | ||||
| 	msghdr.Iovlen = uint32(length) | ||||
| } | ||||
| 
 | ||||
| func (cmsg *Cmsghdr) SetLen(length int) { | ||||
| 	cmsg.Len = uint32(length) | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -7,7 +7,7 @@ | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| //sys	Dup2(oldfd int, newfd int) (err error) | ||||
| //sys	dup2(oldfd int, newfd int) (err error) | ||||
| //sysnb	EpollCreate(size int) (fd int, err error) | ||||
| //sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) | ||||
| //sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 | ||||
| @ -34,8 +34,8 @@ package unix | ||||
| //sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK | ||||
| //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT | ||||
| //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) | ||||
| //sys	Setfsgid(gid int) (err error) | ||||
| //sys	Setfsuid(uid int) (err error) | ||||
| //sys	setfsgid(gid 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) | ||||
| @ -91,6 +91,10 @@ 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) | ||||
| } | ||||
|  | ||||
							
								
								
									
										29
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -41,8 +41,8 @@ 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	Setfsgid(gid int) (err error) | ||||
| //sys	Setfsuid(uid int) (err error) | ||||
| //sys	setfsgid(gid 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) | ||||
| @ -179,6 +179,10 @@ 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) | ||||
| } | ||||
| @ -187,10 +191,6 @@ func InotifyInit() (fd int, err error) { | ||||
| 	return InotifyInit1(0) | ||||
| } | ||||
| 
 | ||||
| func Dup2(oldfd int, newfd int) (err error) { | ||||
| 	return Dup3(oldfd, newfd, 0) | ||||
| } | ||||
| 
 | ||||
| func Pause() error { | ||||
| 	_, err := ppoll(nil, 0, nil, nil) | ||||
| 	return err | ||||
| @ -211,3 +211,20 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { | ||||
| 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) | ||||
| } | ||||
| 
 | ||||
| // dup2 exists because func Dup3 in syscall_linux.go references | ||||
| // it in an unreachable path. dup2 isn't available on arm64. | ||||
| func dup2(oldfd int, newfd int) error | ||||
|  | ||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -10,7 +10,7 @@ import ( | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| //sys	Dup2(oldfd int, newfd int) (err error) | ||||
| //sys	dup2(oldfd int, newfd int) (err error) | ||||
| //sysnb	EpollCreate(size int) (fd int, err error) | ||||
| //sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) | ||||
| //sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 | ||||
| @ -34,8 +34,8 @@ import ( | ||||
| //sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK | ||||
| //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) | ||||
| //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) | ||||
| //sys	Setfsgid(gid int) (err error) | ||||
| //sys	Setfsuid(uid int) (err error) | ||||
| //sys	setfsgid(gid 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) | ||||
| @ -120,6 +120,10 @@ 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) | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -8,7 +8,7 @@ package unix | ||||
| 
 | ||||
| //sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) | ||||
| //sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 | ||||
| //sys	Dup2(oldfd int, newfd int) (err error) | ||||
| //sys	dup2(oldfd int, newfd int) (err error) | ||||
| //sys	Fchown(fd int, uid int, gid int) (err error) | ||||
| //sys	Fstat(fd int, stat *Stat_t) (err error) | ||||
| //sys	Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 | ||||
| @ -30,8 +30,8 @@ package unix | ||||
| //sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK | ||||
| //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) | ||||
| //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) | ||||
| //sys	Setfsgid(gid int) (err error) | ||||
| //sys	Setfsuid(uid int) (err error) | ||||
| //sys	setfsgid(gid 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) | ||||
| @ -107,6 +107,10 @@ 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) | ||||
| } | ||||
|  | ||||
							
								
								
									
										113
									
								
								vendor/golang.org/x/sys/unix/syscall_netbsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										113
									
								
								vendor/golang.org/x/sys/unix/syscall_netbsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -94,21 +94,16 @@ func nametomib(name string) (mib []_C_int, err error) { | ||||
| 	return mib, nil | ||||
| } | ||||
| 
 | ||||
| func SysctlClockinfo(name string) (*Clockinfo, error) { | ||||
| 	mib, err := sysctlmib(name) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| func direntIno(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) | ||||
| } | ||||
| 
 | ||||
| 	n := uintptr(SizeofClockinfo) | ||||
| 	var ci Clockinfo | ||||
| 	if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if n != SizeofClockinfo { | ||||
| 		return nil, EIO | ||||
| 	} | ||||
| 	return &ci, nil | ||||
| func direntReclen(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) | ||||
| } | ||||
| 
 | ||||
| func direntNamlen(buf []byte) (uint64, bool) { | ||||
| 	return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) | ||||
| } | ||||
| 
 | ||||
| //sysnb pipe() (fd1 int, fd2 int, err error) | ||||
| @ -120,28 +115,34 @@ func Pipe(p []int) (err error) { | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| //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) { | ||||
| 	return getdents(fd, buf) | ||||
| } | ||||
| 	n, err = Getdents(fd, buf) | ||||
| 	if err != nil || basep == nil { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| const ImplementsGetwd = true | ||||
| 	var off int64 | ||||
| 	off, err = Seek(fd, 0, 1 /* SEEK_CUR */) | ||||
| 	if err != nil { | ||||
| 		*basep = ^uintptr(0) | ||||
| 		return | ||||
| 	} | ||||
| 	*basep = uintptr(off) | ||||
| 	if unsafe.Sizeof(*basep) == 8 { | ||||
| 		return | ||||
| 	} | ||||
| 	if off>>32 != 0 { | ||||
| 		// We can't stuff the offset back into a uintptr, so any | ||||
| 		// future calls would be suspect. Generate an error. | ||||
| 		// EIO is allowed by getdirentries. | ||||
| 		err = EIO | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| //sys	Getcwd(buf []byte) (n int, err error) = SYS___GETCWD | ||||
| 
 | ||||
| func Getwd() (string, error) { | ||||
| 	var buf [PathMax]byte | ||||
| 	_, err := Getcwd(buf[0:]) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	n := clen(buf[:]) | ||||
| 	if n < 1 { | ||||
| 		return "", EINVAL | ||||
| 	} | ||||
| 	return string(buf[:n]), nil | ||||
| } | ||||
| 
 | ||||
| // TODO | ||||
| func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { | ||||
| 	return -1, ENOSYS | ||||
| @ -154,42 +155,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { | ||||
| 
 | ||||
| //sys	ioctl(fd int, req uint, arg uintptr) (err error) | ||||
| 
 | ||||
| // ioctl itself should not be exposed directly, but additional get/set | ||||
| // functions for specific types are permissible. | ||||
| 
 | ||||
| // IoctlSetInt performs an ioctl operation which sets an integer value | ||||
| // on fd, using the specified request number. | ||||
| func IoctlSetInt(fd int, req uint, value int) error { | ||||
| 	return ioctl(fd, req, uintptr(value)) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetWinsize(fd int, req uint, value *Winsize) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| func ioctlSetTermios(fd int, req uint, value *Termios) error { | ||||
| 	return ioctl(fd, req, uintptr(unsafe.Pointer(value))) | ||||
| } | ||||
| 
 | ||||
| // IoctlGetInt performs an ioctl operation which gets an integer value | ||||
| // from fd, using the specified request number. | ||||
| func IoctlGetInt(fd int, req uint) (int, error) { | ||||
| 	var value int | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { | ||||
| 	var value Winsize | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| 
 | ||||
| func IoctlGetTermios(fd int, req uint) (*Termios, error) { | ||||
| 	var value Termios | ||||
| 	err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) | ||||
| 	return &value, err | ||||
| } | ||||
| //sys   sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL | ||||
| 
 | ||||
| func IoctlGetPtmget(fd int, req uint) (*Ptmget, error) { | ||||
| 	var value Ptmget | ||||
| @ -251,6 +217,14 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| 	return sendfile(outfd, infd, offset, count) | ||||
| } | ||||
| 
 | ||||
| func Fstatvfs(fd int, buf *Statvfs_t) (err error) { | ||||
| 	return Fstatvfs1(fd, buf, ST_WAIT) | ||||
| } | ||||
| 
 | ||||
| func Statvfs(path string, buf *Statvfs_t) (err error) { | ||||
| 	return Statvfs1(path, buf, ST_WAIT) | ||||
| } | ||||
| 
 | ||||
| /* | ||||
|  * Exposed directly | ||||
|  */ | ||||
| @ -264,6 +238,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Close(fd int) (err error) | ||||
| //sys	Dup(fd int) (nfd int, err error) | ||||
| //sys	Dup2(from int, to int) (err error) | ||||
| //sys	Dup3(from int, to int, flags int) (err error) | ||||
| //sys	Exit(code int) | ||||
| //sys	ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) | ||||
| //sys	ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) | ||||
| @ -289,6 +264,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Fpathconf(fd int, name int) (val int, err error) | ||||
| //sys	Fstat(fd int, stat *Stat_t) (err error) | ||||
| //sys	Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) | ||||
| //sys	Fstatvfs1(fd int, buf *Statvfs_t, flags int) (err error) = SYS_FSTATVFS1 | ||||
| //sys	Fsync(fd int) (err error) | ||||
| //sys	Ftruncate(fd int, length int64) (err error) | ||||
| //sysnb	Getegid() (egid int) | ||||
| @ -332,7 +308,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sys	Revoke(path string) (err error) | ||||
| //sys	Rmdir(path string) (err error) | ||||
| //sys	Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK | ||||
| //sys	Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) | ||||
| //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) | ||||
| //sysnb	Setegid(egid int) (err error) | ||||
| //sysnb	Seteuid(euid int) (err error) | ||||
| //sysnb	Setgid(gid int) (err error) | ||||
| @ -345,6 +321,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||
| //sysnb	Settimeofday(tp *Timeval) (err error) | ||||
| //sysnb	Setuid(uid int) (err error) | ||||
| //sys	Stat(path string, stat *Stat_t) (err error) | ||||
| //sys	Statvfs1(path string, buf *Statvfs_t, flags int) (err error) = SYS_STATVFS1 | ||||
| //sys	Symlink(path string, link string) (err error) | ||||
| //sys	Symlinkat(oldpath string, newdirfd int, newpath string) (err error) | ||||
| //sys	Sync() (err error) | ||||
|  | ||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_netbsd_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_netbsd_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -28,6 +28,10 @@ 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) | ||||
| } | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user