diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 7fe3b97..32b3744 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -1,7 +1,7 @@ name: push on: push: - branches: ["*"] + branches: tags: ["*"] jobs: release: @@ -20,4 +20,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: push - run: docker push docker.pkg.github.com/convox/convox/convox:${VERSION} \ No newline at end of file + run: docker push docker.pkg.github.com/convox/convox/convox:${VERSION} diff --git a/Dockerfile b/Dockerfile index 60ce8f2..79784cd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,8 @@ ## development ################################################################# -FROM golang:1.12 AS development +FROM golang:1.13 AS development + +RUN apt-get update && apt-get -y install postgresql-client RUN curl -s https://download.docker.com/linux/static/stable/x86_64/docker-18.03.1-ce.tgz | \ tar -C /usr/bin --strip-components 1 -xz diff --git a/Makefile b/Makefile index fdd590c..4fcbe55 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: all build clean clean-package compress generate mocks package release test +.PHONY: all build clean clean-package compress generate generate-k8s generate-provider mocks package release test commands = api atom build router @@ -18,16 +18,23 @@ clean-package: compress: $(binaries) upx-ucl -1 $^ -generate: - go run cmd/generate/main.go controllers > pkg/api/controllers.go - go run cmd/generate/main.go routes > pkg/api/routes.go - go run cmd/generate/main.go sdk > sdk/methods.go +generate: generate-provider generate-k8s + +generate-k8s: make -C pkg/atom generate make -C provider/k8s generate -mocks: generate +generate-provider: + go run cmd/generate/main.go controllers > pkg/api/controllers.go + go run cmd/generate/main.go routes > pkg/api/routes.go + go run cmd/generate/main.go sdk > sdk/methods.go + +mocks: generate-provider make -C pkg/atom mocks make -C pkg/structs mocks + mockery -case underscore -dir pkg/start -outpkg sdk -output pkg/mock/start -name Interface + mockery -case underscore -dir sdk -outpkg sdk -output pkg/mock/sdk -name Interface + mockery -case underscore -dir vendor/github.com/convox/stdcli -outpkg stdcli -output pkg/mock/stdcli -name Executor package: $(GOPATH)/bin/packr diff --git a/cmd/convox/Makefile b/cmd/convox/Makefile new file mode 100644 index 0000000..38f4cdc --- /dev/null +++ b/cmd/convox/Makefile @@ -0,0 +1,21 @@ +.PHONY: all build clean release release-gopath + +all: build + +build: + go install ./... + +clean: + rm -f pkg/convox-* + +release: release-gopath + go get -u github.com/karalabe/xgo + $(GOPATH)/bin/xgo -branch $(shell git rev-parse HEAD) -out pkg/convox -targets 'darwin/amd64,linux/amd64,windows/amd64' -ldflags "-X main.version=$(VERSION)" . + mkdir -p pkg && docker run -v $(GOPATH):/gopath -i ubuntu tar czv /gopath/src/github.com/convox/convox/cmd/convox/pkg | tar xzv -C pkg --strip-components 8 + aws s3 cp pkg/convox-darwin-10.6-amd64 s3://convox/release/$(VERSION)/cli/darwin/convox --acl public-read + aws s3 cp pkg/convox-linux-amd64 s3://convox/release/$(VERSION)/cli/linux/convox --acl public-read + aws s3 cp pkg/convox-windows-4.0-amd64.exe s3://convox/release/$(VERSION)/cli/windows/convox.exe --acl public-read + +# set up gopath in docker volume if running inside a container +release-gopath: + if [ -f /.dockerenv ]; then tar cz $(GOPATH) | docker run -v $(GOPATH):/gopath -i ubuntu tar xz -C /gopath --strip-components 2; fi diff --git a/cmd/convox/main.go b/cmd/convox/main.go new file mode 100644 index 0000000..9caa3da --- /dev/null +++ b/cmd/convox/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "os" + + "github.com/convox/convox/pkg/cli" +) + +var ( + version = "dev" +) + +func main() { + c := cli.New("convox", version) + + os.Exit(c.Execute(os.Args[1:])) +} diff --git a/go.mod b/go.mod index 1930428..54515a5 100644 --- a/go.mod +++ b/go.mod @@ -7,10 +7,17 @@ require ( github.com/Microsoft/hcsshim v0.8.7-0.20190801035247-8694eade7dd3 // indirect github.com/PuerkitoBio/goquery v1.5.0 github.com/aws/aws-sdk-go v1.21.10 + github.com/convox/changes v0.0.0-20191105034405-8c0df759a3b3 github.com/convox/exec v0.0.0-20180905012044-cc13d277f897 + github.com/convox/hid v0.0.0-20180912192857-c67381b7ffff github.com/convox/logger v0.0.0-20180522214415-e39179955b52 + github.com/convox/rack v0.0.0-20191023140332-e19fce33f6c3 // indirect github.com/convox/stdapi v0.0.0-20190708203955-b81b71b6a680 + github.com/convox/stdcli v0.0.0-20190326115454-b78bee159e98 github.com/convox/stdsdk v0.0.0-20190422120437-3e80a397e377 + github.com/convox/u2f v0.0.0-20180912192910-a73404142726 + github.com/convox/version v0.0.0-20160822184233-ffefa0d565d2 + github.com/creack/pty v1.1.9 github.com/docker/docker v1.4.2-0.20190710153559-aa8249ae1b8b github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 // indirect github.com/dustin/go-humanize v1.0.0 @@ -21,11 +28,13 @@ require ( github.com/gobuffalo/packr v1.30.1 github.com/gobwas/glob v0.2.3 github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 // indirect + github.com/gorilla/mux v1.7.3 github.com/gorilla/websocket v1.4.0 github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7 // indirect github.com/headzoo/surf v1.0.0 github.com/headzoo/ut v0.0.0-20181013193318-a13b5a7a02ca // indirect github.com/imdario/mergo v0.3.7 // indirect + github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/miekg/dns v1.1.15 github.com/onsi/ginkgo v1.8.0 // indirect @@ -35,6 +44,7 @@ require ( github.com/stretchr/testify v1.3.0 golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf golang.org/x/net v0.0.0-20191101175033-0deb6923b6d9 // indirect + golang.org/x/sys v0.0.0-20191104094858-e8c54fb511f6 // indirect golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect google.golang.org/api v0.9.0 gopkg.in/inf.v0 v0.9.0 // indirect diff --git a/go.sum b/go.sum index 61f7728..f7e12bd 100644 --- a/go.sum +++ b/go.sum @@ -44,18 +44,34 @@ github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/ttrpc v0.0.0-20180920185216-2a805f718635/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/convox/changes v0.0.0-20191105034405-8c0df759a3b3 h1:S0AiQtEXMb5jBw4N6TaIPMcnCLV91Se+HEOpMmYyt+o= +github.com/convox/changes v0.0.0-20191105034405-8c0df759a3b3/go.mod h1:RpXN2RCcOkPSccYY3xrmKPQzJNrGq+9+kbtFcAQpEv8= github.com/convox/exec v0.0.0-20180905012044-cc13d277f897 h1:8SnSpocZ8I5RlRo8NFKYrAa6pQYZp+4T/pWyD3GrwIk= github.com/convox/exec v0.0.0-20180905012044-cc13d277f897/go.mod h1:GAxysqvg1ZSl42aLnvLXmFkXkacF4AGql5ZKT7s1DGc= +github.com/convox/hid v0.0.0-20180912192857-c67381b7ffff h1:B+2WWcb+QM8yJL6HyUsYhnazUOBbvKv8kKS7WTmhyRU= +github.com/convox/hid v0.0.0-20180912192857-c67381b7ffff/go.mod h1:yBM17eJdl/WBU/dv5Ojnu63mNqOlv+tWazdcFIalph4= +github.com/convox/inotify v0.0.0-20170313035821-b56f5149b5c6 h1:bigLg74wAp2d11vaK4/IkTbN95D5mlSqZ/+/O6YBgtQ= +github.com/convox/inotify v0.0.0-20170313035821-b56f5149b5c6/go.mod h1:JOi7Az72uBLT9D2Qv/6FbUbC9W420st0MMIUgVYUyd0= github.com/convox/logger v0.0.0-20180522214415-e39179955b52 h1:HTaloo6by+4NE1A1mRYprWzsOy1PGH2tPGfgZ60dyHU= github.com/convox/logger v0.0.0-20180522214415-e39179955b52/go.mod h1:IcbSD+Pq+bQV2z/otiMCHLAYBrDR/jPFopFatrWjlMM= +github.com/convox/rack v0.0.0-20191023140332-e19fce33f6c3 h1:ldQHJVSEAMKwYQ8GEFNJ/HJRDi+Z3ZF8CU8cD4fZCM0= +github.com/convox/rack v0.0.0-20191023140332-e19fce33f6c3/go.mod h1:2dMGMyJnGzN0JlFFyaXzm+hK47fzNAhBvU9uqJy47jg= github.com/convox/stdapi v0.0.0-20190708203955-b81b71b6a680 h1:IRgaDO4+YanUYcvBlXkzJrgwFh/3BcQOYoI5gEUz2wQ= github.com/convox/stdapi v0.0.0-20190708203955-b81b71b6a680/go.mod h1:NkUGoKf5tAaHq7MW02AF9mSXSIHCZJ0ZG8+NqRI5t38= +github.com/convox/stdcli v0.0.0-20190326115454-b78bee159e98 h1:jSUPA5xGpERhDUevVwj8YPXhIbKq+YJPXpF8U9M4p1o= +github.com/convox/stdcli v0.0.0-20190326115454-b78bee159e98/go.mod h1:D+mhXWLSLHQ+I2zZzYfrSzONMlE6FnPFw9hM4oDcN8Y= github.com/convox/stdsdk v0.0.0-20190422120437-3e80a397e377 h1:PuSJ72MD0mYsMCTvTQ1YydIbQUWtEykNHyweI/vA0PY= github.com/convox/stdsdk v0.0.0-20190422120437-3e80a397e377/go.mod h1:y1vtmkDKBkWSQ6e2gPXAyz1NCuWZ2x3vrP/SFeDDNco= +github.com/convox/u2f v0.0.0-20180912192910-a73404142726 h1:FY8dxqTRVj4lRmNoAkOeYxSnxZ40s64P/yxyVf8NBlo= +github.com/convox/u2f v0.0.0-20180912192910-a73404142726/go.mod h1:Gw2uoNinY/uxw7+krj5aloiVD0asEaGSwfutlwip/sU= +github.com/convox/version v0.0.0-20160822184233-ffefa0d565d2 h1:tdp/1KHBnbne0yT1yuKnAdOTBHRue9yQ4oON8rzGgZc= +github.com/convox/version v0.0.0-20160822184233-ffefa0d565d2/go.mod h1:s8HHEf4LLsmPppeubX/A5bz1JpLYkDXbu+ciuYMTk8A= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -65,6 +81,8 @@ github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BU github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20190710153559-aa8249ae1b8b h1:+Ga+YpCDpcY1fln6GI0fiiirpqHGcob5/Vk3oKNuGdU= github.com/docker/docker v1.4.2-0.20190710153559-aa8249ae1b8b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/engine v1.4.2-0.20190717161051-705d9623b7c1 h1:HjO0YFIGk26fADKDJYuAoGneX9nrVVotZJ1Ctn15Vv4= +github.com/docker/engine v1.4.2-0.20190717161051-705d9623b7c1/go.mod h1:3CPr2caMgTHxxIAZgEMd3uLYPDlRvPqCpyeRf6ncPcY= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= @@ -349,6 +367,8 @@ github.com/ijc/Gotty v0.0.0-20170406111628-a8b993ba6abd h1:anPrsicrIi2ColgWTVPk+ github.com/ijc/Gotty v0.0.0-20170406111628-a8b993ba6abd/go.mod h1:3LVOLeyx9XVvwPgrt2be44XgSqndprz1G18rSk8KD84= github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf h1:WfD7VjIE6z8dIvMsI4/s+1qr5EL+zoIGev1BQj1eoJ8= +github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf/go.mod h1:hyb9oH7vZsitZCiBt0ZvifOrB+qc8PS5IiilCIb87rg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= @@ -623,6 +643,8 @@ golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 h1:6ZQFf1D2YYDDI7eSwW8adlkkavTB9sw5I24FVtEvNUQ= golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191104094858-e8c54fb511f6 h1:ZJUmhYTp8GbGC0ViZRc2U+MIYQ8xx9MscsdXnclfIhw= +golang.org/x/sys v0.0.0-20191104094858-e8c54fb511f6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/pkg/api/controllers.go b/pkg/api/controllers.go index d8bdbcc..be06855 100644 --- a/pkg/api/controllers.go +++ b/pkg/api/controllers.go @@ -1035,6 +1035,56 @@ func (s *Server) ReleasePromote(c *stdapi.Context) error { return c.RenderOK() } +func (s *Server) ResourceConsole(c *stdapi.Context) error { + if err := s.hook("ResourceConsoleValidate", c); err != nil { + return err + } + + app := c.Var("app") + name := c.Var("name") + rw := c + + var opts structs.ResourceConsoleOptions + if err := stdapi.UnmarshalOptions(c.Request(), &opts); err != nil { + return err + } + + err := s.provider(c).WithContext(c.Context()).ResourceConsole(app, name, rw, opts) + if err != nil { + return err + } + + return nil +} + +func (s *Server) ResourceExport(c *stdapi.Context) error { + if err := s.hook("ResourceExportValidate", c); err != nil { + return err + } + + app := c.Var("app") + name := c.Var("name") + + v, err := s.provider(c).WithContext(c.Context()).ResourceExport(app, name) + if err != nil { + return err + } + + if c, ok := interface{}(v).(io.Closer); ok { + defer c.Close() + } + + if _, err := io.Copy(c, v); err != nil { + return err + } + + if vs, ok := interface{}(v).(Sortable); ok { + sort.Slice(v, vs.Less) + } + + return nil +} + func (s *Server) ResourceGet(c *stdapi.Context) error { if err := s.hook("ResourceGetValidate", c); err != nil { return err @@ -1055,6 +1105,23 @@ func (s *Server) ResourceGet(c *stdapi.Context) error { return c.RenderJSON(v) } +func (s *Server) ResourceImport(c *stdapi.Context) error { + if err := s.hook("ResourceImportValidate", c); err != nil { + return err + } + + app := c.Var("app") + name := c.Var("name") + r := c + + err := s.provider(c).WithContext(c.Context()).ResourceImport(app, name, r) + if err != nil { + return err + } + + return c.RenderOK() +} + func (s *Server) ResourceList(c *stdapi.Context) error { if err := s.hook("ResourceListValidate", c); err != nil { return err diff --git a/pkg/api/routes.go b/pkg/api/routes.go index 5ab3e46..17846d4 100644 --- a/pkg/api/routes.go +++ b/pkg/api/routes.go @@ -52,7 +52,10 @@ func (s *Server) setupRoutes(r stdapi.Router) { r.Route("GET", "/apps/{app}/releases/{id}", s.ReleaseGet) r.Route("GET", "/apps/{app}/releases", s.ReleaseList) r.Route("POST", "/apps/{app}/releases/{id}/promote", s.ReleasePromote) + r.Route("SOCKET", "/apps/{app}/resources/{name}/console", s.ResourceConsole) + r.Route("GET", "/apps/{app}/resources/{name}/data", s.ResourceExport) r.Route("GET", "/apps/{app}/resources/{name}", s.ResourceGet) + r.Route("PUT", "/apps/{app}/resources/{name}/data", s.ResourceImport) r.Route("GET", "/apps/{app}/resources", s.ResourceList) r.Route("GET", "/apps/{app}/services", s.ServiceList) r.Route("POST", "/apps/{app}/services/{name}/restart", s.ServiceRestart) diff --git a/pkg/cli/api.go b/pkg/cli/api.go new file mode 100644 index 0000000..1c7708a --- /dev/null +++ b/pkg/cli/api.go @@ -0,0 +1,32 @@ +package cli + +import ( + "encoding/json" + + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" + "github.com/convox/stdsdk" +) + +func init() { + register("api get", "query the rack api", Api, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Usage: "", + Validate: stdcli.Args(1), + }) +} + +func Api(rack sdk.Interface, c *stdcli.Context) error { + var v interface{} + + if err := rack.Get(c.Arg(0), stdsdk.RequestOptions{}, &v); err != nil { + return err + } + + data, err := json.MarshalIndent(v, "", " ") + if err != nil { + return err + } + + return c.Writef("%s\n", string(data)) +} diff --git a/pkg/cli/api_test.go b/pkg/cli/api_test.go new file mode 100644 index 0000000..8111e20 --- /dev/null +++ b/pkg/cli/api_test.go @@ -0,0 +1,40 @@ +package cli_test + +import ( + "encoding/json" + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/stdsdk" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestApi(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("Get", "/apps", stdsdk.RequestOptions{}, mock.Anything).Return(nil).Run(func(args mock.Arguments) { + err := json.Unmarshal([]byte(`[{"name":"app1"}]`), args.Get(2)) + require.NoError(t, err) + }) + + res, err := testExecute(e, "api get /apps", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + require.Equal(t, "[\n {\n \"name\": \"app1\"\n }\n]\n", res.Stdout) + require.Equal(t, "", res.Stderr) + }) +} + +func TestApiError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("Get", "/apps", stdsdk.RequestOptions{}, mock.Anything).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "api get /apps", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + require.Equal(t, "", res.Stdout) + require.Equal(t, "ERROR: err1\n", res.Stderr) + }) +} diff --git a/pkg/cli/apps.go b/pkg/cli/apps.go new file mode 100644 index 0000000..2294b0a --- /dev/null +++ b/pkg/cli/apps.go @@ -0,0 +1,581 @@ +package cli + +import ( + "compress/gzip" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "sort" + "strings" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("apps", "list apps", Apps, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.Args(0), + }) + + register("apps cancel", "cancel an app update", AppsCancel, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Usage: "[app]", + Validate: stdcli.ArgsMax(1), + }) + + register("apps create", "create an app", AppsCreate, stdcli.CommandOptions{ + Flags: append(stdcli.OptionFlags(structs.AppCreateOptions{}), flagRack, flagWait), + Usage: "[name]", + Validate: stdcli.ArgsMax(1), + }) + + register("apps delete", "delete an app", AppsDelete, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagWait}, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("apps export", "export an app", AppsExport, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagApp, + flagRack, + stdcli.StringFlag("file", "f", "export to file"), + }, + Usage: "[app]", + Validate: stdcli.ArgsMax(1), + }) + + register("apps import", "import an app", AppsImport, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagApp, + flagRack, + stdcli.StringFlag("file", "f", "import from file"), + }, + Usage: "[app]", + Validate: stdcli.ArgsMax(1), + }) + + register("apps info", "get information about an app", AppsInfo, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Usage: "[app]", + Validate: stdcli.ArgsMax(1), + }) + + register("apps lock", "enable termination protection", AppsLock, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Usage: "[app]", + Validate: stdcli.ArgsMax(1), + }) + + register("apps params", "display app parameters", AppsParams, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Usage: "[app]", + Validate: stdcli.ArgsMax(1), + }) + + register("apps params set", "set app parameters", AppsParamsSet, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack, flagWait}, + Usage: " [Key=Value]...", + Validate: stdcli.ArgsMin(1), + }) + + register("apps unlock", "disable termination protection", AppsUnlock, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Usage: "[app]", + Validate: stdcli.ArgsMax(1), + }) + + register("apps wait", "wait for an app to finish updating", AppsWait, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Usage: "[app]", + Validate: stdcli.ArgsMax(1), + }) +} + +func Apps(rack sdk.Interface, c *stdcli.Context) error { + as, err := rack.AppList() + if err != nil { + return err + } + + t := c.Table("APP", "STATUS", "RELEASE") + + for _, a := range as { + t.AddRow(a.Name, a.Status, a.Release) + } + + return t.Print() +} + +func AppsCancel(rack sdk.Interface, c *stdcli.Context) error { + app := coalesce(c.Arg(0), app(c)) + + c.Startf("Cancelling %s", app) + + if err := rack.AppCancel(app); err != nil { + return err + } + + return c.OK() +} + +func AppsCreate(rack sdk.Interface, c *stdcli.Context) error { + app := coalesce(c.Arg(0), app(c)) + + var opts structs.AppCreateOptions + + if err := c.Options(&opts); err != nil { + return err + } + + c.Startf("Creating %s", app) + + if _, err := rack.AppCreate(app, opts); err != nil { + return err + } + + if c.Bool("wait") { + if err := common.WaitForAppRunning(rack, app); err != nil { + return err + } + } + + return c.OK() +} + +func AppsDelete(rack sdk.Interface, c *stdcli.Context) error { + app := c.Args[0] + + c.Startf("Deleting %s", app) + + if err := rack.AppDelete(app); err != nil { + return err + } + + if c.Bool("wait") { + if err := common.WaitForAppDeleted(rack, c, app); err != nil { + return err + } + } + + return c.OK() +} + +func AppsExport(rack sdk.Interface, c *stdcli.Context) error { + app := coalesce(c.Arg(0), app(c)) + + var w io.Writer + + if file := c.String("file"); file != "" { + f, err := os.Create(file) + if err != nil { + return err + } + defer f.Close() + w = f + } else { + if c.Writer().IsTerminal() { + return fmt.Errorf("pipe this command into a file or specify --file") + } + w = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + if err := appExport(rack, c, app, w); err != nil { + return err + } + + return nil +} + +func AppsImport(rack sdk.Interface, c *stdcli.Context) error { + app := coalesce(c.Arg(0), app(c)) + + var r io.ReadCloser + + if file := c.String("file"); file != "" { + f, err := os.Open(file) + if err != nil { + return err + } + r = f + } else { + if c.Reader().IsTerminal() { + return fmt.Errorf("pipe a file into this command or specify --file") + } + r = ioutil.NopCloser(c.Reader()) + } + + defer r.Close() + + if err := appImport(rack, c, app, r); err != nil { + return err + } + + return nil +} + +func AppsInfo(rack sdk.Interface, c *stdcli.Context) error { + a, err := rack.AppGet(coalesce(c.Arg(0), app(c))) + if err != nil { + return err + } + + i := c.Info() + + i.Add("Name", a.Name) + i.Add("Status", a.Status) + + i.Add("Generation", a.Generation) + i.Add("Locked", fmt.Sprintf("%t", a.Locked)) + i.Add("Release", a.Release) + + if a.Router != "" { + i.Add("Router", a.Router) + } + + return i.Print() +} + +func AppsLock(rack sdk.Interface, c *stdcli.Context) error { + app := coalesce(c.Arg(0), app(c)) + + c.Startf("Locking %s", app) + + if err := rack.AppUpdate(app, structs.AppUpdateOptions{Lock: options.Bool(true)}); err != nil { + return err + } + + return c.OK() +} + +func AppsParams(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + var params map[string]string + + app := coalesce(c.Arg(0), app(c)) + + if s.Version <= "20180708231844" { + params, err = rack.AppParametersGet(app) + if err != nil { + return err + } + } else { + a, err := rack.AppGet(app) + if err != nil { + return err + } + params = a.Parameters + } + + keys := []string{} + + for k := range params { + keys = append(keys, k) + } + + sort.Strings(keys) + + i := c.Info() + + for _, k := range keys { + i.Add(k, params[k]) + } + + return i.Print() +} + +func AppsParamsSet(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + opts := structs.AppUpdateOptions{ + Parameters: map[string]string{}, + } + + for _, arg := range c.Args { + parts := strings.SplitN(arg, "=", 2) + + if len(parts) != 2 { + return fmt.Errorf("Key=Value expected: %s", arg) + } + + opts.Parameters[parts[0]] = parts[1] + } + + c.Startf("Updating parameters") + + if s.Version <= "20180708231844" { + if err := rack.AppParametersSet(app(c), opts.Parameters); err != nil { + return err + } + } else { + if err := rack.AppUpdate(app(c), opts); err != nil { + return err + } + } + + if c.Bool("wait") { + c.Writef("\n") + + if err := common.WaitForAppWithLogs(rack, c, app(c)); err != nil { + return err + } + + a, err := rack.AppGet(app(c)) + if err != nil { + return err + } + + for k, v := range opts.Parameters { + if a.Parameters[k] != v { + return fmt.Errorf("rollback") + } + } + } + + return c.OK() +} + +func AppsUnlock(rack sdk.Interface, c *stdcli.Context) error { + app := coalesce(c.Arg(0), app(c)) + + c.Startf("Unlocking %s", app) + + if err := rack.AppUpdate(app, structs.AppUpdateOptions{Lock: options.Bool(false)}); err != nil { + return err + } + + return c.OK() +} + +func AppsWait(rack sdk.Interface, c *stdcli.Context) error { + app := coalesce(c.Arg(0), app(c)) + + c.Startf("Waiting for app") + + c.Writef("\n") + + if err := common.WaitForAppWithLogs(rack, c, app); err != nil { + return err + } + + return c.OK() +} + +func appExport(rack sdk.Interface, c *stdcli.Context, app string, w io.Writer) error { + tmp, err := ioutil.TempDir("", "") + if err != nil { + return err + } + defer os.RemoveAll(tmp) + + c.Startf("Exporting app %s", app) + + a, err := rack.AppGet(app) + if err != nil { + return err + } + + for k, v := range a.Parameters { + if v == "****" { + delete(a.Parameters, k) + } + } + + data, err := json.Marshal(a) + if err != nil { + return err + } + + if err := ioutil.WriteFile(filepath.Join(tmp, "app.json"), data, 0600); err != nil { + return err + } + + c.OK() + + if a.Release != "" { + c.Startf("Exporting env") + + _, r, err := common.AppManifest(rack, app) + if err != nil { + return err + } + + if err := ioutil.WriteFile(filepath.Join(tmp, "env"), []byte(r.Env), 0600); err != nil { + return err + } + + c.OK() + + if r.Build != "" { + c.Startf("Exporting build %s", r.Build) + + fd, err := os.OpenFile(filepath.Join(tmp, "build.tgz"), os.O_CREATE|os.O_WRONLY, 0600) + if err != nil { + return err + } + defer fd.Close() + + if err := rack.BuildExport(app, r.Build, fd); err != nil { + return err + } + + c.OK() + } + } + + c.Startf("Packaging export") + + tgz, err := common.Tarball(tmp) + if err != nil { + return err + } + + if _, err := w.Write(tgz); err != nil { + return err + } + + c.OK() + + return nil +} + +func appImport(rack sdk.Interface, c *stdcli.Context, app string, r io.Reader) error { + tmp, err := ioutil.TempDir("", "") + if err != nil { + return err + } + defer os.RemoveAll(tmp) + + gz, err := gzip.NewReader(r) + if err != nil { + return err + } + + if err := common.Unarchive(gz, tmp); err != nil { + return err + } + + var a structs.App + + data, err := ioutil.ReadFile(filepath.Join(tmp, "app.json")) + if err != nil { + return err + } + + if err := json.Unmarshal(data, &a); err != nil { + return err + } + + c.Startf("Creating app %s", app) + + if _, err := rack.AppCreate(app, structs.AppCreateOptions{Generation: options.String(a.Generation)}); err != nil { + return err + } + + if err := common.WaitForAppRunning(rack, app); err != nil { + return err + } + + c.OK() + + build := filepath.Join(tmp, "build.tgz") + env := filepath.Join(tmp, "env") + release := "" + + if _, err := os.Stat(build); !os.IsNotExist(err) { + fd, err := os.Open(build) + if err != nil { + return err + } + + c.Startf("Importing build") + + b, err := rack.BuildImport(app, fd) + if err != nil { + return err + } + + c.OK(b.Release) + + release = b.Release + } + + if _, err := os.Stat(env); !os.IsNotExist(err) { + data, err := ioutil.ReadFile(env) + if err != nil { + return err + } + + c.Startf("Importing env") + + r, err := rack.ReleaseCreate(app, structs.ReleaseCreateOptions{Env: options.String(string(data))}) + if err != nil { + return err + } + + c.OK(r.Id) + + release = r.Id + } + + if release != "" { + c.Startf("Promoting %s", release) + + if err := rack.ReleasePromote(app, release, structs.ReleasePromoteOptions{}); err != nil { + return err + } + + if err := common.WaitForAppRunning(rack, app); err != nil { + return err + } + + c.OK() + } + + if len(a.Parameters) > 0 { + ae, err := rack.AppGet(app) + if err != nil { + return err + } + + change := false + + for k, v := range a.Parameters { + if v != ae.Parameters[k] { + change = true + break + } + } + + if change { + c.Startf("Updating parameters") + + if err := rack.AppUpdate(app, structs.AppUpdateOptions{Parameters: a.Parameters}); err != nil { + return err + } + + if err := common.WaitForAppRunning(rack, app); err != nil { + return err + } + + c.OK() + } + } + + return nil +} diff --git a/pkg/cli/apps_test.go b/pkg/cli/apps_test.go new file mode 100644 index 0000000..671d7d1 --- /dev/null +++ b/pkg/cli/apps_test.go @@ -0,0 +1,634 @@ +package cli_test + +import ( + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/convox/convox/pkg/cli" + "github.com/convox/convox/pkg/common" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestApps(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + a1 := structs.Apps{ + *fxApp(), + *fxAppGeneration1(), + structs.App{ + Name: "app2", + Generation: "1", + Status: "creating", + }, + } + i.On("AppList").Return(a1, nil) + + res, err := testExecute(e, "apps", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "APP STATUS RELEASE ", + "app1 running release1", + "app1 running release1", + "app2 creating ", + }) + }) +} + +func TestAppsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppList").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "apps", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestAppsCancel(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppCancel", "app1").Return(nil) + + res, err := testExecute(e, "apps cancel app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Cancelling app1... OK", + }) + + res, err = testExecute(e, "apps cancel -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Cancelling app1... OK", + }) + }) +} + +func TestAppsCancelError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppCancel", "app1").Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "apps cancel app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{ + "Cancelling app1... ", + }) + }) +} + +func TestAppsCreate(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.AppCreateOptions{} + i.On("AppCreate", "app1", opts).Return(fxApp(), nil) + + res, err := testExecute(e, "apps create app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Creating app1... OK", + }) + }) +} + +func TestAppsCreateError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.AppCreateOptions{} + i.On("AppCreate", "app1", opts).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "apps create app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Creating app1... "}) + }) +} + +func TestAppsCreateGeneration1(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.AppCreateOptions{ + Generation: options.String("1"), + } + i.On("AppCreate", "app1", opts).Return(fxApp(), nil) + + res, err := testExecute(e, "apps create app1 -g 1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Creating app1... OK", + }) + }) +} + +func TestAppsCreateWait(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.AppCreateOptions{} + i.On("AppCreate", "app1", opts).Return(fxApp(), nil) + i.On("AppGet", "app1").Return(&structs.App{Status: "creating"}, nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil) + + res, err := testExecute(e, "apps create app1 --wait", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Creating app1... OK", + }) + }) +} + +func TestAppsDelete(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppDelete", "app1").Return(nil) + + res, err := testExecute(e, "apps delete app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Deleting app1... OK", + }) + }) +} + +func TestAppsDeleteError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppDelete", "app1").Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "apps delete app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Deleting app1... "}) + }) +} + +func TestAppsDeleteWait(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppDelete", "app1").Return(nil) + i.On("AppGet", "app1").Return(&structs.App{Status: "deleting"}, nil).Twice() + i.On("AppGet", "app1").Return(nil, fmt.Errorf("no such app: app1")) + + res, err := testExecute(e, "apps delete app1 --wait", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Deleting app1... OK", + }) + }) +} + +func TestAppsExport(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxApp(), nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + bdata, err := ioutil.ReadFile("testdata/build.tgz") + require.NoError(t, err) + i.On("BuildExport", "app1", "build1", mock.Anything).Return(nil).Run(func(args mock.Arguments) { + args.Get(2).(io.Writer).Write(bdata) + }) + + tmp, err := ioutil.TempDir("", "") + require.NoError(t, err) + defer os.RemoveAll(tmp) + + res, err := testExecute(e, fmt.Sprintf("apps export -a app1 -f %s/app.tgz", tmp), nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Exporting app app1... OK", + "Exporting env... OK", + "Exporting build build1... OK", + "Packaging export... OK", + }) + + fd, err := os.Open(filepath.Join(tmp, "app.tgz")) + require.NoError(t, err) + defer fd.Close() + + gz, err := gzip.NewReader(fd) + require.NoError(t, err) + + err = common.Unarchive(gz, tmp) + require.NoError(t, err) + + data, err := ioutil.ReadFile(filepath.Join(tmp, "app.json")) + require.NoError(t, err) + require.Equal(t, "{\"generation\":\"2\",\"locked\":false,\"name\":\"app1\",\"release\":\"release1\",\"router\":\"\",\"status\":\"running\",\"parameters\":{\"ParamFoo\":\"value1\",\"ParamOther\":\"value2\"}}", string(data)) + + data, err = ioutil.ReadFile(filepath.Join(tmp, "env")) + require.NoError(t, err) + require.Equal(t, "FOO=bar\nBAZ=quux", string(data)) + + data, err = ioutil.ReadFile(filepath.Join(tmp, "build.tgz")) + require.NoError(t, err) + require.Equal(t, bdata, data) + }) +} + +func TestAppsImport(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppCreate", "app1", structs.AppCreateOptions{Generation: options.String("2")}).Return(fxApp(), nil) + i.On("AppGet", "app1").Return(&structs.App{Status: "creating"}, nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil).Twice() + bdata, err := ioutil.ReadFile("testdata/build.tgz") + require.NoError(t, err) + i.On("BuildImport", "app1", mock.Anything).Return(fxBuild(), nil).Run(func(args mock.Arguments) { + rdata, err := ioutil.ReadAll(args.Get(1).(io.Reader)) + require.NoError(t, err) + require.Equal(t, bdata, rdata) + }) + i.On("ReleaseCreate", "app1", structs.ReleaseCreateOptions{Env: options.String("ALPHA=one\nBRAVO=two\n")}).Return(fxRelease(), nil) + i.On("ReleasePromote", "app1", "release1", structs.ReleasePromoteOptions{}).Return(nil) + i.On("AppGet", "app1").Return(&structs.App{Status: "creating"}, nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil).Twice() + i.On("AppUpdate", "app1", structs.AppUpdateOptions{Parameters: map[string]string{"Foo": "bar", "Baz": "qux"}}).Return(nil) + i.On("AppGet", "app1").Return(&structs.App{Status: "creating"}, nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil).Twice() + + res, err := testExecute(e, "apps import -a app1 -f testdata/app.tgz", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Creating app app1... OK", + "Importing build... OK, release1", + "Importing env... OK, release1", + "Promoting release1... OK", + "Updating parameters... OK", + }) + }) +} + +func TestAppsImportNoBuild(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppCreate", "app1", structs.AppCreateOptions{Generation: options.String("2")}).Return(fxApp(), nil) + i.On("AppGet", "app1").Return(&structs.App{Status: "creating"}, nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil).Twice() + i.On("AppUpdate", "app1", structs.AppUpdateOptions{Parameters: map[string]string{"Foo": "bar", "Baz": "qux"}}).Return(nil) + i.On("AppGet", "app1").Return(&structs.App{Status: "creating"}, nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil).Twice() + + res, err := testExecute(e, "apps import -a app1 -f testdata/app.nobuild.tgz", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Creating app app1... OK", + "Updating parameters... OK", + }) + }) +} + +func TestAppsImportNoParams(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppCreate", "app1", structs.AppCreateOptions{Generation: options.String("2")}).Return(fxApp(), nil) + i.On("AppGet", "app1").Return(&structs.App{Status: "creating"}, nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil).Twice() + bdata, err := ioutil.ReadFile("testdata/build.tgz") + require.NoError(t, err) + i.On("BuildImport", "app1", mock.Anything).Return(fxBuild(), nil).Run(func(args mock.Arguments) { + rdata, err := ioutil.ReadAll(args.Get(1).(io.Reader)) + require.NoError(t, err) + require.Equal(t, bdata, rdata) + }) + i.On("ReleaseCreate", "app1", structs.ReleaseCreateOptions{Env: options.String("ALPHA=one\nBRAVO=two\n")}).Return(fxRelease(), nil) + i.On("ReleasePromote", "app1", "release1", structs.ReleasePromoteOptions{}).Return(nil) + i.On("AppGet", "app1").Return(&structs.App{Status: "creating"}, nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil).Twice() + + res, err := testExecute(e, "apps import -a app1 -f testdata/app.noparams.tgz", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Creating app app1... OK", + "Importing build... OK, release1", + "Importing env... OK, release1", + "Promoting release1... OK", + }) + }) +} + +func TestAppsImportSameParams(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppCreate", "app1", structs.AppCreateOptions{Generation: options.String("2")}).Return(fxApp(), nil) + i.On("AppGet", "app1").Return(fxApp(), nil).Twice() + bdata, err := ioutil.ReadFile("testdata/build.tgz") + require.NoError(t, err) + i.On("BuildImport", "app1", mock.Anything).Return(fxBuild(), nil).Run(func(args mock.Arguments) { + rdata, err := ioutil.ReadAll(args.Get(1).(io.Reader)) + require.NoError(t, err) + require.Equal(t, bdata, rdata) + }) + i.On("ReleaseCreate", "app1", structs.ReleaseCreateOptions{Env: options.String("ALPHA=one\nBRAVO=two\n")}).Return(fxRelease(), nil) + i.On("ReleasePromote", "app1", "release1", structs.ReleasePromoteOptions{}).Return(nil) + i.On("AppGet", "app1").Return(fxApp(), nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil).Once() + + res, err := testExecute(e, "apps import -a app1 -f testdata/app.sameparams.tgz", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Creating app app1... OK", + "Importing build... OK, release1", + "Importing env... OK, release1", + "Promoting release1... OK", + }) + }) +} + +func TestAppsInfo(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxAppRouter(), nil) + + res, err := testExecute(e, "apps info app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Name app1", + "Status running", + "Generation 2", + "Locked false", + "Release release1", + "Router router1", + }) + + res, err = testExecute(e, "apps info -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Name app1", + "Status running", + "Generation 2", + "Locked false", + "Release release1", + "Router router1", + }) + }) +} + +func TestAppsInfoRouter(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxApp(), nil) + + res, err := testExecute(e, "apps info app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Name app1", + "Status running", + "Generation 2", + "Locked false", + "Release release1", + }) + + res, err = testExecute(e, "apps info -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Name app1", + "Status running", + "Generation 2", + "Locked false", + "Release release1", + }) + }) +} + +func TestAppsInfoError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "apps info app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) + +} + +func TestAppsParams(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("AppGet", "app1").Return(fxApp(), nil) + + res, err := testExecute(e, "apps params app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ParamFoo value1", + "ParamOther value2", + "ParamPassword ****", + }) + + res, err = testExecute(e, "apps params -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ParamFoo value1", + "ParamOther value2", + "ParamPassword ****", + }) + }) +} + +func TestAppsParamsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("AppGet", "app1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "apps params app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestAppsParamsClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("AppParametersGet", "app1").Return(fxParameters(), nil) + + res, err := testExecute(e, "apps params app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ParamFoo value1", + "ParamOther value2", + "ParamPassword ****", + }) + }) +} + +func TestAppsParamsSet(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.AppUpdateOptions{ + Parameters: map[string]string{ + "Foo": "bar", + "Baz": "qux", + }, + } + i.On("AppUpdate", "app1", opts).Return(nil) + + res, err := testExecute(e, "apps params set Foo=bar Baz=qux -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Updating parameters... OK"}) + }) +} + +func TestAppsParamsSetError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.AppUpdateOptions{ + Parameters: map[string]string{ + "Foo": "bar", + "Baz": "qux", + }, + } + i.On("AppUpdate", "app1", opts).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "apps params set Foo=bar Baz=qux -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Updating parameters... "}) + }) +} + +func TestAppsParamsSetClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("AppParametersSet", "app1", map[string]string{"Foo": "bar", "Baz": "qux"}).Return(nil) + + res, err := testExecute(e, "apps params set Foo=bar Baz=qux -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Updating parameters... OK"}) + }) +} + +func TestAppsWait(t *testing.T) { + testClientWait(t, 100*time.Millisecond, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.LogsOptions{ + Prefix: options.Bool(true), + Since: options.Duration(5 * time.Second), + } + i.On("AppGet", "app1").Return(&structs.App{Status: "creating"}, nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil) + i.On("AppLogs", "app1", opts).Return(testLogs(fxLogsSystem()), nil).Once() + + res, err := testExecute(e, "apps wait app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Waiting for app... ", + fxLogsSystem()[0], + fxLogsSystem()[1], + "OK", + }) + + i.On("AppLogs", "app1", opts).Return(testLogs(fxLogsSystem()), nil).Once() + + res, err = testExecute(e, "apps wait -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Waiting for app... ", + fxLogsSystem()[0], + fxLogsSystem()[1], + "OK", + }) + }) +} + +func TestAppsWaitError(t *testing.T) { + testClientWait(t, 100*time.Millisecond, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.LogsOptions{ + Prefix: options.Bool(true), + Since: options.Duration(5 * time.Second), + } + i.On("AppGet", "app1").Return(nil, fmt.Errorf("err1")) + i.On("AppLogs", "app1", opts).Return(nil, fmt.Errorf("err2")) + + res, err := testExecute(e, "apps wait app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Waiting for app... "}) + }) +} + +func TestAppsRollback(t *testing.T) { + testClientWait(t, 100*time.Millisecond, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.LogsOptions{ + Prefix: options.Bool(true), + Since: options.Duration(5 * time.Second), + } + i.On("AppGet", "app1").Return(&structs.App{Status: "updating"}, nil).Once() + i.On("AppGet", "app1").Return(&structs.App{Status: "rollback"}, nil).Once() + i.On("AppGet", "app1").Return(fxApp(), nil).Once() + i.On("AppLogs", "app1", opts).Return(testLogs(fxLogsSystem()), nil).Once() + + res, err := testExecute(e, "apps wait app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: rollback"}) + res.RequireStdout(t, []string{ + "Waiting for app... ", + fxLogsSystem()[0], + fxLogsSystem()[1], + }) + + i.On("AppGet", "app1").Return(&structs.App{Status: "updating"}, nil).Once() + i.On("AppGet", "app1").Return(&structs.App{Status: "rollback"}, nil).Once() + i.On("AppGet", "app1").Return(fxApp(), nil).Once() + i.On("AppLogs", "app1", opts).Return(testLogs(fxLogsSystem()), nil).Once() + + res, err = testExecute(e, "apps wait -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: rollback"}) + res.RequireStdout(t, []string{ + "Waiting for app... ", + fxLogsSystem()[0], + fxLogsSystem()[1], + }) + }) +} diff --git a/pkg/cli/auth.go b/pkg/cli/auth.go new file mode 100644 index 0000000..1604a4b --- /dev/null +++ b/pkg/cli/auth.go @@ -0,0 +1,97 @@ +package cli + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "regexp" + + "github.com/convox/convox/pkg/token" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" + "github.com/convox/stdsdk" +) + +var reSessionAuthentication = regexp.MustCompile(`^Session path="([^"]+)" token="([^"]+)"$`) + +type AuthenticationError struct { + error +} + +func (ae AuthenticationError) AuthenticationError() error { + return ae.error +} + +type session struct { + Id string `json:"id"` +} + +func authenticator(c *stdcli.Context) stdsdk.Authenticator { + return func(cl *stdsdk.Client, res *http.Response) (http.Header, error) { + m := reSessionAuthentication.FindStringSubmatch(res.Header.Get("WWW-Authenticate")) + if len(m) < 3 { + return nil, nil + } + + body := []byte{} + headers := map[string]string{} + + if m[2] == "true" { + ares, err := cl.GetStream(m[1], stdsdk.RequestOptions{}) + if err != nil { + return nil, err + } + defer ares.Body.Close() + + dres, err := ioutil.ReadAll(ares.Body) + if err != nil { + return nil, err + } + + c.Writef("Waiting for security token... ") + + data, err := token.Authenticate(dres) + if err != nil { + return nil, AuthenticationError{err} + } + + c.Writef("OK\n") + + body = data + headers["Challenge"] = ares.Header.Get("Challenge") + } + + var s session + + ro := stdsdk.RequestOptions{ + Body: bytes.NewReader(body), + Headers: stdsdk.Headers(headers), + } + + if err := cl.Post(m[1], ro, &s); err != nil { + return nil, err + } + + if s.Id == "" { + return nil, fmt.Errorf("invalid session") + } + + if err := c.SettingWriteKey("session", cl.Endpoint.Host, s.Id); err != nil { + return nil, err + } + + h := http.Header{} + + h.Set("Session", s.Id) + + return h, nil + } +} + +func currentSession(c *stdcli.Context) sdk.SessionFunc { + return func(cl *sdk.Client) string { + sid, _ := c.SettingReadKey("session", cl.Endpoint.Host) + return sid + } +} diff --git a/pkg/cli/builds.go b/pkg/cli/builds.go new file mode 100644 index 0000000..d0c14db --- /dev/null +++ b/pkg/cli/builds.go @@ -0,0 +1,342 @@ +package cli + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "strings" + "time" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("build", "create a build", Build, stdcli.CommandOptions{ + Flags: append(stdcli.OptionFlags(structs.BuildCreateOptions{}), flagRack, flagApp, flagId), + Usage: "[dir]", + Validate: stdcli.ArgsMax(1), + }) + + register("builds", "list builds", Builds, stdcli.CommandOptions{ + Flags: append(stdcli.OptionFlags(structs.BuildListOptions{}), flagRack, flagApp), + Validate: stdcli.Args(0), + }) + + register("builds export", "export a build", BuildsExport, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagRack, + flagApp, + stdcli.StringFlag("file", "f", "import from file"), + }, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("builds import", "import a build", BuildsImport, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagRack, + flagApp, + flagId, + stdcli.StringFlag("file", "f", "import from file"), + }, + Validate: stdcli.Args(0), + }) + + register("builds info", "get information about a build", BuildsInfo, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("builds logs", "get logs for a build", BuildsLogs, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Usage: "", + Validate: stdcli.Args(1), + }) +} + +func Build(rack sdk.Interface, c *stdcli.Context) error { + var stdout io.Writer + + if c.Bool("id") { + stdout = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + b, err := build(rack, c, c.Bool("development")) + if err != nil { + return err + } + + c.Writef("Build: %s\n", b.Id) + c.Writef("Release: %s\n", b.Release) + + if c.Bool("id") { + fmt.Fprintf(stdout, b.Release) + } + + return nil +} + +func build(rack sdk.Interface, c *stdcli.Context, development bool) (*structs.Build, error) { + var opts structs.BuildCreateOptions + + if development { + opts.Development = options.Bool(true) + } + + if err := c.Options(&opts); err != nil { + return nil, err + } + + if opts.Description == nil { + if err := exec.Command("git", "diff", "--quiet").Run(); err == nil { + if data, err := exec.Command("git", "log", "-n", "1", "--pretty=%h %s", "--abbrev=10").CombinedOutput(); err == nil { + opts.Description = options.String(fmt.Sprintf("build %s", strings.TrimSpace(string(data)))) + } + } + } + + c.Startf("Packaging source") + + data, err := common.Tarball(coalesce(c.Arg(0), ".")) + if err != nil { + return nil, err + } + + c.OK() + + s, err := rack.SystemGet() + if err != nil { + return nil, err + } + + var b *structs.Build + + if s.Version < "20180708231844" { + c.Startf("Starting build") + + b, err = rack.BuildCreateUpload(app(c), bytes.NewReader(data), opts) + if err != nil { + return nil, err + } + } else { + tmp, err := generateTempKey() + if err != nil { + return nil, err + } + + tmp += ".tgz" + + c.Startf("Uploading source") + + o, err := rack.ObjectStore(app(c), tmp, bytes.NewReader(data), structs.ObjectStoreOptions{}) + if err != nil { + return nil, err + } + + c.OK() + + c.Startf("Starting build") + + b, err = rack.BuildCreate(app(c), o.Url, opts) + if err != nil { + return nil, err + } + } + + c.OK() + + r, err := rack.BuildLogs(app(c), b.Id, structs.LogsOptions{}) + if err != nil { + return nil, err + } + + count, _ := io.Copy(c, r) + defer finalizeBuildLogs(rack, c, b, count) + + for { + b, err = rack.BuildGet(app(c), b.Id) + if err != nil { + return nil, err + } + + if b.Status == "failed" { + return nil, fmt.Errorf("build failed") + } + + if b.Status != "running" { + break + } + + time.Sleep(1 * time.Second) + } + + return b, nil +} + +func finalizeBuildLogs(rack structs.Provider, c *stdcli.Context, b *structs.Build, count int64) error { + r, err := rack.BuildLogs(b.App, b.Id, structs.LogsOptions{}) + if err != nil { + return err + } + defer r.Close() + + data, err := ioutil.ReadAll(r) + if err != nil { + return err + } + + if int64(len(data)) > count { + c.Write(data[count:]) + } + + return nil +} + +func Builds(rack sdk.Interface, c *stdcli.Context) error { + var opts structs.BuildListOptions + + if err := c.Options(&opts); err != nil { + return err + } + + bs, err := rack.BuildList(app(c), opts) + if err != nil { + return err + } + + t := c.Table("ID", "STATUS", "RELEASE", "STARTED", "ELAPSED", "DESCRIPTION") + + for _, b := range bs { + started := common.Ago(b.Started) + elapsed := common.Duration(b.Started, b.Ended) + + t.AddRow(b.Id, b.Status, b.Release, started, elapsed, b.Description) + } + + return t.Print() +} + +func BuildsExport(rack sdk.Interface, c *stdcli.Context) error { + var w io.Writer + + if file := c.String("file"); file != "" { + f, err := os.Create(file) + if err != nil { + return err + } + defer f.Close() + w = f + } else { + if c.Writer().IsTerminal() { + return fmt.Errorf("pipe this command into a file or specify --file") + } + w = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + c.Startf("Exporting build") + + if err := rack.BuildExport(app(c), c.Arg(0), w); err != nil { + return err + } + + return c.OK() +} + +func BuildsImport(rack sdk.Interface, c *stdcli.Context) error { + var stdout io.Writer + + if c.Bool("id") { + stdout = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + var r io.ReadCloser + + if file := c.String("file"); file != "" { + f, err := os.Open(file) + if err != nil { + return err + } + r = f + } else { + if c.Reader().IsTerminal() { + return fmt.Errorf("pipe a file into this command or specify --file") + } + r = ioutil.NopCloser(c.Reader()) + } + + defer r.Close() + + s, err := rack.SystemGet() + if err != nil { + return err + } + + c.Startf("Importing build") + + var b *structs.Build + + if s.Version <= "20180416200237" { + b, err = rack.BuildImportMultipart(app(c), r) + } else if s.Version <= "20180708231844" { + b, err = rack.BuildImportUrl(app(c), r) + } else { + b, err = rack.BuildImport(app(c), r) + } + if err != nil { + return err + } + + c.OK(b.Release) + + if c.Bool("id") { + fmt.Fprintf(stdout, b.Release) + } + + return nil +} + +func BuildsInfo(rack sdk.Interface, c *stdcli.Context) error { + b, err := rack.BuildGet(app(c), c.Arg(0)) + if err != nil { + return err + } + + i := c.Info() + + i.Add("Id", b.Id) + i.Add("Status", b.Status) + i.Add("Release", b.Release) + i.Add("Description", b.Description) + i.Add("Started", common.Ago(b.Started)) + i.Add("Elapsed", common.Duration(b.Started, b.Ended)) + + return i.Print() +} + +func BuildsLogs(rack sdk.Interface, c *stdcli.Context) error { + var opts structs.LogsOptions + + if err := c.Options(&opts); err != nil { + return err + } + + r, err := rack.BuildLogs(app(c), c.Arg(0), opts) + if err != nil { + return err + } + + io.Copy(c, r) + + return nil +} diff --git a/pkg/cli/builds_test.go b/pkg/cli/builds_test.go new file mode 100644 index 0000000..54a4ba9 --- /dev/null +++ b/pkg/cli/builds_test.go @@ -0,0 +1,311 @@ +package cli_test + +import ( + "fmt" + "io" + "io/ioutil" + "path/filepath" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestBuild(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ObjectStore", "app1", mock.AnythingOfType("string"), mock.Anything, structs.ObjectStoreOptions{}).Return(&fxObject, nil).Run(func(args mock.Arguments) { + require.Regexp(t, `tmp/[0-9a-f]{30}\.tgz`, args.Get(1).(string)) + }) + i.On("BuildCreate", "app1", "object://test", structs.BuildCreateOptions{Description: options.String("foo")}).Return(fxBuild(), nil) + i.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(testLogs(fxLogs()), nil).Once() + i.On("BuildGet", "app1", "build1").Return(fxBuildRunning(), nil).Once() + i.On("BuildGet", "app1", "build4").Return(fxBuild(), nil) + i.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(testLogs(fxLogs()), nil) + + res, err := testExecute(e, "build ./testdata/httpd -a app1 -d foo", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Packaging source... OK", + "Uploading source... OK", + "Starting build... OK", + "log1", + "log2", + "Build: build1", + "Release: release1", + }) + }) +} + +func TestBuildFinalizeLogs(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ObjectStore", "app1", mock.AnythingOfType("string"), mock.Anything, structs.ObjectStoreOptions{}).Return(&fxObject, nil).Run(func(args mock.Arguments) { + require.Regexp(t, `tmp/[0-9a-f]{30}\.tgz`, args.Get(1).(string)) + }) + i.On("BuildCreate", "app1", "object://test", structs.BuildCreateOptions{Description: options.String("foo")}).Return(fxBuild(), nil) + i.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(testLogs(fxLogs()), nil).Once() + i.On("BuildGet", "app1", "build1").Return(fxBuildRunning(), nil).Once() + i.On("BuildGet", "app1", "build4").Return(fxBuild(), nil) + i.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(testLogs(fxLogsLonger()), nil) + + res, err := testExecute(e, "build ./testdata/httpd -a app1 -d foo", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Packaging source... OK", + "Uploading source... OK", + "Starting build... OK", + "log1", + "log2", + "log3", + "Build: build1", + "Release: release1", + }) + }) +} + +func TestBuildError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ObjectStore", "app1", mock.AnythingOfType("string"), mock.Anything, structs.ObjectStoreOptions{}).Return(&fxObject, nil).Run(func(args mock.Arguments) { + require.Regexp(t, `tmp/[0-9a-f]{30}\.tgz`, args.Get(1).(string)) + }) + i.On("BuildCreate", "app1", "object://test", structs.BuildCreateOptions{Description: options.String("foo")}).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "build ./testdata/httpd -a app1 -d foo", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{ + "Packaging source... OK", + "Uploading source... OK", + "Starting build... ", + }) + }) +} + +func TestBuildClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("BuildCreateUpload", "app1", mock.Anything, structs.BuildCreateOptions{Description: options.String("foo")}).Return(fxBuild(), nil) + i.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(testLogs(fxLogs()), nil) + i.On("BuildGet", "app1", "build1").Return(fxBuildRunning(), nil).Once() + i.On("BuildGet", "app1", "build4").Return(fxBuild(), nil) + + res, err := testExecute(e, "build ./testdata/httpd -a app1 -d foo", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Packaging source... OK", + "Starting build... OK", + "log1", + "log2", + "Build: build1", + "Release: release1", + }) + }) +} + +func TestBuilds(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + b1 := structs.Builds{ + *fxBuild(), + *fxBuildRunning(), + *fxBuildFailed(), + } + i.On("BuildList", "app1", structs.BuildListOptions{}).Return(b1, nil) + + res, err := testExecute(e, "builds -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ID STATUS RELEASE STARTED ELAPSED DESCRIPTION", + "build1 complete release1 2 days ago 2m0s desc ", + "build4 running 2 days ago ", + "build3 failed 2 days ago ", + }) + }) +} + +func TestBuildsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("BuildList", "app1", structs.BuildListOptions{}).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "builds -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestBuildsExport(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + data, err := ioutil.ReadFile("testdata/build.tgz") + require.NoError(t, err) + i.On("BuildExport", "app1", "build1", mock.Anything).Return(nil).Run(func(args mock.Arguments) { + args.Get(2).(io.Writer).Write(data) + }) + tmpd, err := ioutil.TempDir("", "") + require.NoError(t, err) + tmpf := filepath.Join(tmpd, "export.tgz") + + res, err := testExecute(e, fmt.Sprintf("builds export build1 -a app1 -f %s", tmpf), nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Exporting build... OK"}) + tdata, err := ioutil.ReadFile(tmpf) + require.NoError(t, err) + require.Equal(t, data, tdata) + }) +} + +func TestBuildsExportStdout(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + data, err := ioutil.ReadFile("testdata/build.tgz") + require.NoError(t, err) + i.On("BuildExport", "app1", "build1", mock.Anything).Return(nil).Run(func(args mock.Arguments) { + args.Get(2).(io.Writer).Write(data) + }) + + res, err := testExecute(e, "builds export build1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{"Exporting build... OK"}) + require.Equal(t, data, []byte(res.Stdout)) + }) +} + +func TestBuildsExportError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("BuildExport", "app1", "build1", mock.Anything).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "builds export build1 -a app1 -f /dev/null", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Exporting build... "}) + }) +} + +func TestBuildsImport(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + data, err := ioutil.ReadFile("testdata/build.tgz") + require.NoError(t, err) + i.On("SystemGet").Return(fxSystem(), nil) + i.On("BuildImport", "app1", mock.Anything).Return(fxBuild(), nil).Run(func(args mock.Arguments) { + rdata, err := ioutil.ReadAll(args.Get(1).(io.Reader)) + require.NoError(t, err) + require.Equal(t, data, rdata) + }) + + res, err := testExecute(e, "builds import -a app1 -f testdata/build.tgz", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Importing build... OK, release1"}) + }) +} + +func TestBuildsImportError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("BuildImport", "app1", mock.Anything).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "builds import -a app1 -f testdata/build.tgz", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Importing build... "}) + }) +} + +func TestBuildsImportClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + data, err := ioutil.ReadFile("testdata/build.tgz") + require.NoError(t, err) + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("BuildImportMultipart", "app1", mock.Anything).Return(fxBuild(), nil).Run(func(args mock.Arguments) { + rdata, err := ioutil.ReadAll(args.Get(1).(io.Reader)) + require.NoError(t, err) + require.Equal(t, data, rdata) + }) + + res, err := testExecute(e, "builds import -a app1 -f testdata/build.tgz", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Importing build... OK, release1"}) + }) +} + +func TestBuildsInfo(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("BuildGet", "app1", "build1").Return(fxBuild(), nil) + + res, err := testExecute(e, "builds info build1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Id build1", + "Status complete", + "Release release1", + "Description desc", + "Started 2 days ago", + "Elapsed 2m0s", + }) + }) +} + +func TestBuildsInfoError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("BuildGet", "app1", "build1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "builds info build1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestBuildsLogs(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.LogsOptions{} + i.On("BuildLogs", "app1", "build1", opts).Return(testLogs(fxLogs()), nil) + + res, err := testExecute(e, "builds logs build1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + fxLogs()[0], + fxLogs()[1], + }) + }) +} + +func TestBuildsLogsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.LogsOptions{} + i.On("BuildLogs", "app1", "build1", opts).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "builds logs build1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} diff --git a/pkg/cli/certs.go b/pkg/cli/certs.go new file mode 100644 index 0000000..eb239f9 --- /dev/null +++ b/pkg/cli/certs.go @@ -0,0 +1,152 @@ +package cli + +import ( + "fmt" + "io" + "io/ioutil" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("certs", "list certificates", Certs, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.Args(0), + }) + + register("certs delete", "delete a certificate", CertsDelete, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("certs generate", "generate a certificate", CertsGenerate, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagId, flagRack}, + Usage: " [domain...]", + Validate: stdcli.ArgsMin(1), + }) + + register("certs import", "import a certificate", CertsImport, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagId, + flagRack, + stdcli.StringFlag("chain", "", "intermediate certificate chain"), + }, + Usage: " ", + Validate: stdcli.Args(2), + }) +} + +func Certs(rack sdk.Interface, c *stdcli.Context) error { + cs, err := rack.CertificateList() + if err != nil { + return err + } + + t := c.Table("ID", "DOMAIN", "EXPIRES") + + for _, c := range cs { + t.AddRow(c.Id, c.Domain, common.Ago(c.Expiration)) + } + + return t.Print() +} + +func CertsDelete(rack sdk.Interface, c *stdcli.Context) error { + cert := c.Arg(0) + + c.Startf("Deleting certificate %s", cert) + + if err := rack.CertificateDelete(cert); err != nil { + return err + } + + return c.OK() +} + +func CertsGenerate(rack sdk.Interface, c *stdcli.Context) error { + var stdout io.Writer + + if c.Bool("id") { + stdout = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + c.Startf("Generating certificate") + + cr, err := rack.CertificateGenerate(c.Args) + if err != nil { + return err + } + + c.OK(cr.Id) + + if c.Bool("id") { + fmt.Fprintf(stdout, cr.Id) + } + + return nil +} + +func CertsImport(rack sdk.Interface, c *stdcli.Context) error { + var stdout io.Writer + + if c.Bool("id") { + stdout = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + s, err := rack.SystemGet() + if err != nil { + return err + } + + pub, err := ioutil.ReadFile(c.Arg(0)) + if err != nil { + return err + } + + key, err := ioutil.ReadFile(c.Arg(1)) + if err != nil { + return err + } + + var opts structs.CertificateCreateOptions + + if cf := c.String("chain"); cf != "" { + chain, err := ioutil.ReadFile(cf) + if err != nil { + return err + } + + opts.Chain = options.String(string(chain)) + } + + c.Startf("Importing certificate") + + var cr *structs.Certificate + + if s.Version <= "20180708231844" { + cr, err = rack.CertificateCreateClassic(string(pub), string(key), opts) + if err != nil { + return err + } + } else { + cr, err = rack.CertificateCreate(string(pub), string(key), opts) + if err != nil { + return err + } + } + + c.OK(cr.Id) + + if c.Bool("id") { + fmt.Fprintf(stdout, cr.Id) + } + + return nil +} diff --git a/pkg/cli/certs_test.go b/pkg/cli/certs_test.go new file mode 100644 index 0000000..09784a5 --- /dev/null +++ b/pkg/cli/certs_test.go @@ -0,0 +1,130 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/require" +) + +func TestCerts(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("CertificateList").Return(structs.Certificates{*fxCertificate(), *fxCertificate()}, nil) + + res, err := testExecute(e, "certs", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ID DOMAIN EXPIRES ", + "cert1 example.org 2 days from now", + "cert1 example.org 2 days from now", + }) + }) +} + +func TestCertsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("CertificateList").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "certs", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestCertsDelete(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("CertificateDelete", "cert1").Return(nil) + + res, err := testExecute(e, "certs delete cert1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Deleting certificate cert1... OK"}) + }) +} + +func TestCertsDeleteError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("CertificateDelete", "cert1").Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "certs delete cert1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Deleting certificate cert1... "}) + }) +} + +func TestCertsGenerate(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("CertificateGenerate", []string{"test.example.org", "other.example.org"}).Return(fxCertificate(), nil) + + res, err := testExecute(e, "certs generate test.example.org other.example.org", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Generating certificate... OK, cert1"}) + }) +} + +func TestCertsGenerateError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("CertificateGenerate", []string{"test.example.org", "other.example.org"}).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "certs generate test.example.org other.example.org", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Generating certificate... "}) + }) +} + +func TestCertsImport(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.CertificateCreateOptions{Chain: options.String("chain\n")} + i.On("CertificateCreate", "cert\n", "key\n", opts).Return(fxCertificate(), nil) + + res, err := testExecute(e, "certs import testdata/cert.pem testdata/key.pem --chain testdata/chain.pem", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Importing certificate... OK, cert1"}) + }) +} + +func TestCertsImportError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.CertificateCreateOptions{Chain: options.String("chain\n")} + i.On("CertificateCreate", "cert\n", "key\n", opts).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "certs import testdata/cert.pem testdata/key.pem --chain testdata/chain.pem", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Importing certificate... "}) + }) +} + +func TestCertsImportClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + opts := structs.CertificateCreateOptions{Chain: options.String("chain\n")} + i.On("CertificateCreateClassic", "cert\n", "key\n", opts).Return(fxCertificate(), nil) + + res, err := testExecute(e, "certs import testdata/cert.pem testdata/key.pem --chain testdata/chain.pem", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Importing certificate... OK, cert1"}) + }) +} diff --git a/pkg/cli/cli.go b/pkg/cli/cli.go new file mode 100644 index 0000000..202a95b --- /dev/null +++ b/pkg/cli/cli.go @@ -0,0 +1,56 @@ +package cli + +import ( + "fmt" + "os" + "time" + + "github.com/convox/convox/pkg/start" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +type HandlerFunc func(sdk.Interface, *stdcli.Context) error + +var ( + Starter = start.New() + WaitDuration = 5 * time.Second +) + +var ( + flagApp = stdcli.StringFlag("app", "a", "app name") + flagId = stdcli.BoolFlag("id", "", "put logs on stderr, release id on stdout") + flagNoFollow = stdcli.BoolFlag("no-follow", "", "do not follow logs") + flagRack = stdcli.StringFlag("rack", "r", "rack name") + flagWait = stdcli.BoolFlag("wait", "w", "wait for completion") +) + +func New(name, version string) *Engine { + e := &Engine{ + Engine: stdcli.New(name, version), + } + + e.Writer.Tags["app"] = stdcli.RenderColors(39) + e.Writer.Tags["command"] = stdcli.RenderColors(244) + e.Writer.Tags["dir"] = stdcli.RenderColors(246) + e.Writer.Tags["build"] = stdcli.RenderColors(23) + e.Writer.Tags["fail"] = stdcli.RenderColors(160) + e.Writer.Tags["rack"] = stdcli.RenderColors(26) + e.Writer.Tags["process"] = stdcli.RenderColors(27) + e.Writer.Tags["release"] = stdcli.RenderColors(24) + e.Writer.Tags["service"] = stdcli.RenderColors(33) + e.Writer.Tags["setting"] = stdcli.RenderColors(246) + e.Writer.Tags["system"] = stdcli.RenderColors(15) + + for i := 0; i < 18; i++ { + e.Writer.Tags[fmt.Sprintf("color%d", i)] = stdcli.RenderColors(237 + i) + } + + if dir := os.Getenv("CONVOX_CONFIG"); dir != "" { + e.Settings = dir + } + + e.RegisterCommands() + + return e +} diff --git a/pkg/cli/cli_test.go b/pkg/cli/cli_test.go new file mode 100644 index 0000000..42556d7 --- /dev/null +++ b/pkg/cli/cli_test.go @@ -0,0 +1,116 @@ +package cli_test + +import ( + "bytes" + "context" + "fmt" + "io" + "io/ioutil" + "os" + "strings" + "testing" + "time" + + "github.com/convox/convox/pkg/cli" + "github.com/convox/convox/pkg/common" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/structs" + shellquote "github.com/kballard/go-shellquote" + "github.com/stretchr/testify/require" +) + +var ( + fxObject = structs.Object{ + Url: "object://test", + } +) + +var ( + fxStarted = time.Now().UTC().Add(-48 * time.Hour) +) + +func testClient(t *testing.T, fn func(*cli.Engine, *mocksdk.Interface)) { + testClientWait(t, 1, fn) +} + +func testClientWait(t *testing.T, wait time.Duration, fn func(*cli.Engine, *mocksdk.Interface)) { + os.Unsetenv("CONVOX_HOST") + os.Unsetenv("CONVOX_PASSWORD") + os.Unsetenv("CONVOX_RACK") + os.Unsetenv("RACK_URL") + + i := &mocksdk.Interface{} + + cli.WaitDuration = wait + common.ProviderWaitDuration = wait + + e := cli.New("convox", "test") + + e.Client = i + + tmp, err := ioutil.TempDir("", "") + require.NoError(t, err) + e.Settings = tmp + // defer os.RemoveAll(tmp) + + fn(e, i) + + i.AssertExpectations(t) +} + +func testExecute(e *cli.Engine, cmd string, stdin io.Reader) (*result, error) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + return testExecuteContext(ctx, e, cmd, stdin) +} + +func testExecuteContext(ctx context.Context, e *cli.Engine, cmd string, stdin io.Reader) (*result, error) { + if stdin == nil { + stdin = &bytes.Buffer{} + } + + stdout := bytes.Buffer{} + stderr := bytes.Buffer{} + + e.Reader.Reader = stdin + + e.Writer.Color = false + e.Writer.Stdout = &stdout + e.Writer.Stderr = &stderr + + cp, err := shellquote.Split(cmd) + if err != nil { + return nil, err + } + + code := e.ExecuteContext(ctx, cp) + + res := &result{ + Code: code, + Stdout: stdout.String(), + Stderr: stderr.String(), + } + + return res, nil +} + +func testLogs(logs []string) io.ReadCloser { + return ioutil.NopCloser(strings.NewReader(fmt.Sprintf("%s\n", strings.Join(logs, "\n")))) +} + +type result struct { + Code int + Stdout string + Stderr string +} + +func (r *result) RequireStderr(t *testing.T, lines []string) { + stderr := strings.Split(strings.TrimSuffix(r.Stderr, "\n"), "\n") + require.Equal(t, lines, stderr) +} + +func (r *result) RequireStdout(t *testing.T, lines []string) { + stdout := strings.Split(strings.TrimSuffix(r.Stdout, "\n"), "\n") + require.Equal(t, lines, stdout) +} diff --git a/pkg/cli/cp.go b/pkg/cli/cp.go new file mode 100644 index 0000000..6fcb9ad --- /dev/null +++ b/pkg/cli/cp.go @@ -0,0 +1,100 @@ +package cli + +import ( + "fmt" + "io" + "path/filepath" + "strings" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("cp", "copy files", Cp, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Usage: "<[pid:]src> <[pid:]dst>", + Validate: stdcli.Args(2), + }) +} + +func Cp(rack sdk.Interface, c *stdcli.Context) error { + src := c.Arg(0) + dst := c.Arg(1) + + r, err := cpSource(rack, c, src) + if err != nil { + return err + } + + if err := cpDestination(rack, c, r, dst); err != nil { + return err + } + + return nil +} + +func cpDestination(rack sdk.Interface, c *stdcli.Context, r io.Reader, dst string) error { + parts := strings.SplitN(dst, ":", 2) + + switch len(parts) { + case 1: + abs, err := filepath.Abs(parts[0]) + if err != nil { + return err + } + + rr, err := common.RebaseArchive(r, "/base", abs) + if err != nil { + return err + } + + return common.Unarchive(rr, "/") + case 2: + if !strings.HasPrefix(parts[1], "/") { + return fmt.Errorf("must specify absolute paths for processes") + } + + rr, err := common.RebaseArchive(r, "/base", parts[1]) + if err != nil { + return err + } + + return rack.FilesUpload(app(c), parts[0], rr) + default: + return fmt.Errorf("unknown destination: %s", dst) + } +} + +func cpSource(rack sdk.Interface, c *stdcli.Context, src string) (io.Reader, error) { + parts := strings.SplitN(src, ":", 2) + + switch len(parts) { + case 1: + abs, err := filepath.Abs(parts[0]) + if err != nil { + return nil, err + } + + r, err := common.Archive(abs) + if err != nil { + return nil, err + } + + return common.RebaseArchive(r, abs, "/base") + case 2: + if !strings.HasPrefix(parts[1], "/") { + return nil, fmt.Errorf("must specify absolute paths for processes") + } + + r, err := rack.FilesDownload(app(c), parts[0], parts[1]) + if err != nil { + return nil, err + } + + return common.RebaseArchive(r, parts[1], "/base") + default: + return nil, fmt.Errorf("unknown source: %s", src) + } +} diff --git a/pkg/cli/cp_test.go b/pkg/cli/cp_test.go new file mode 100644 index 0000000..e4060a2 --- /dev/null +++ b/pkg/cli/cp_test.go @@ -0,0 +1,75 @@ +package cli_test + +import ( + "bytes" + "fmt" + "io/ioutil" + "path/filepath" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestCpUpload(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("FilesUpload", "app1", "0123456789", mock.Anything).Return(nil) + + res, err := testExecute(e, "cp -a app1 testdata/file 0123456789:/tmp/", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestCpUploadError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("FilesUpload", "app1", "0123456789", mock.Anything).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "cp -a app1 testdata/file 0123456789:/tmp/", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestCpDownload(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + tmpd, err := ioutil.TempDir("", "") + require.NoError(t, err) + tmpf := filepath.Join(tmpd, "file") + data, err := ioutil.ReadFile("testdata/file.tar") + require.NoError(t, err) + i.On("FilesDownload", "app1", "0123456789", "/tmp/file").Return(bytes.NewReader(data), nil) + + res, err := testExecute(e, fmt.Sprintf("cp -a app1 0123456789:/tmp/file %s", tmpf), nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{""}) + odata, err := ioutil.ReadFile("testdata/file") + require.NoError(t, err) + ddata, err := ioutil.ReadFile(tmpf) + require.NoError(t, err) + require.Equal(t, odata, ddata) + }) +} + +func TestCpDownloadError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + tmpd, err := ioutil.TempDir("", "") + require.NoError(t, err) + tmpf := filepath.Join(tmpd, "file") + i.On("FilesDownload", "app1", "0123456789", "/tmp/file").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, fmt.Sprintf("cp -a app1 0123456789:/tmp/file %s", tmpf), nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} diff --git a/pkg/cli/deploy.go b/pkg/cli/deploy.go new file mode 100644 index 0000000..956455c --- /dev/null +++ b/pkg/cli/deploy.go @@ -0,0 +1,42 @@ +package cli + +import ( + "fmt" + "io" + + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("deploy", "create and promote a build", Deploy, stdcli.CommandOptions{ + Flags: append(stdcli.OptionFlags(structs.BuildCreateOptions{}), flagApp, flagId, flagRack, flagWait), + Usage: "[dir]", + Validate: stdcli.ArgsMax(1), + }) +} + +func Deploy(rack sdk.Interface, c *stdcli.Context) error { + var stdout io.Writer + + if c.Bool("id") { + stdout = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + b, err := build(rack, c, false) + if err != nil { + return err + } + + if err := releasePromote(rack, c, app(c), b.Release); err != nil { + return err + } + + if c.Bool("id") { + fmt.Fprintf(stdout, b.Release) + } + + return nil +} diff --git a/pkg/cli/deploy_test.go b/pkg/cli/deploy_test.go new file mode 100644 index 0000000..67e97db --- /dev/null +++ b/pkg/cli/deploy_test.go @@ -0,0 +1,105 @@ +package cli_test + +import ( + "fmt" + "testing" + "time" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestDeploy(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ObjectStore", "app1", mock.AnythingOfType("string"), mock.Anything, structs.ObjectStoreOptions{}).Return(&fxObject, nil).Run(func(args mock.Arguments) { + require.Regexp(t, `tmp/[0-9a-f]{30}\.tgz`, args.Get(1).(string)) + }) + i.On("BuildCreate", "app1", "object://test", structs.BuildCreateOptions{Description: options.String("foo")}).Return(fxBuild(), nil) + i.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(testLogs(fxLogs()), nil) + i.On("BuildGet", "app1", "build1").Return(fxBuildRunning(), nil).Once() + i.On("BuildGet", "app1", "build4").Return(fxBuild(), nil) + i.On("AppGet", "app1").Return(fxApp(), nil) + i.On("ReleasePromote", "app1", "release1", structs.ReleasePromoteOptions{}).Return(nil) + + res, err := testExecute(e, "deploy ./testdata/httpd -a app1 -d foo", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Packaging source... OK", + "Uploading source... OK", + "Starting build... OK", + "log1", + "log2", + "Promoting release1... OK", + }) + }) +} + +func TestDeployError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ObjectStore", "app1", mock.AnythingOfType("string"), mock.Anything, structs.ObjectStoreOptions{}).Return(&fxObject, nil).Run(func(args mock.Arguments) { + require.Regexp(t, `tmp/[0-9a-f]{30}\.tgz`, args.Get(1).(string)) + }) + i.On("BuildCreate", "app1", "object://test", structs.BuildCreateOptions{Description: options.String("foo")}).Return(fxBuild(), nil) + i.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(testLogs(fxLogs()), nil) + i.On("BuildGet", "app1", "build1").Return(fxBuildRunning(), nil).Once() + i.On("BuildGet", "app1", "build4").Return(fxBuild(), nil) + i.On("AppGet", "app1").Return(fxApp(), nil) + i.On("ReleasePromote", "app1", "release1", structs.ReleasePromoteOptions{}).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "deploy ./testdata/httpd -a app1 -d foo", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{ + "Packaging source... OK", + "Uploading source... OK", + "Starting build... OK", + "log1", + "log2", + "Promoting release1... ", + }) + }) +} + +func TestDeployWait(t *testing.T) { + testClientWait(t, 100*time.Millisecond, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ObjectStore", "app1", mock.AnythingOfType("string"), mock.Anything, structs.ObjectStoreOptions{}).Return(&fxObject, nil).Run(func(args mock.Arguments) { + require.Regexp(t, `tmp/[0-9a-f]{30}\.tgz`, args.Get(1).(string)) + }) + i.On("BuildCreate", "app1", "object://test", structs.BuildCreateOptions{Description: options.String("foo")}).Return(fxBuild(), nil) + i.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(testLogs(fxLogs()), nil) + i.On("BuildGet", "app1", "build1").Return(fxBuildRunning(), nil).Once() + i.On("BuildGet", "app1", "build4").Return(fxBuild(), nil) + i.On("AppGet", "app1").Return(fxApp(), nil).Once() + i.On("ReleasePromote", "app1", "release1", structs.ReleasePromoteOptions{}).Return(nil) + i.On("AppGet", "app1").Return(fxAppUpdating(), nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil) + opts := structs.LogsOptions{Prefix: options.Bool(true), Since: options.Duration(5 * time.Second)} + i.On("AppLogs", "app1", opts).Return(testLogs(fxLogsSystem()), nil) + + res, err := testExecute(e, "deploy ./testdata/httpd -a app1 -d foo --wait", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Packaging source... OK", + "Uploading source... OK", + "Starting build... OK", + "log1", + "log2", + "Promoting release1... ", + fxLogsSystem()[0], + fxLogsSystem()[1], + "OK", + }) + }) +} diff --git a/pkg/cli/engine.go b/pkg/cli/engine.go new file mode 100644 index 0000000..29d0ab1 --- /dev/null +++ b/pkg/cli/engine.go @@ -0,0 +1,96 @@ +package cli + +import ( + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +type Engine struct { + *stdcli.Engine + Client sdk.Interface +} + +func (e *Engine) Command(command, description string, fn HandlerFunc, opts stdcli.CommandOptions) { + wfn := func(c *stdcli.Context) error { + return fn(e.currentClient(c), c) + } + + e.Engine.Command(command, description, wfn, opts) +} + +func (e *Engine) CommandWithoutProvider(command, description string, fn HandlerFunc, opts stdcli.CommandOptions) { + wfn := func(c *stdcli.Context) error { + return fn(nil, c) + } + + e.Engine.Command(command, description, wfn, opts) +} + +func (e *Engine) RegisterCommands() { + for _, c := range commands { + if c.Rack { + e.Command(c.Command, c.Description, c.Handler, c.Opts) + } else { + e.CommandWithoutProvider(c.Command, c.Description, c.Handler, c.Opts) + } + } +} + +func (e *Engine) currentClient(c *stdcli.Context) sdk.Interface { + if e.Client != nil { + return e.Client + } + + host, err := currentHost(c) + if err != nil { + c.Fail(err) + } + + r := currentRack(c, host) + + endpoint, err := currentEndpoint(c, r) + if err != nil { + c.Fail(err) + } + + sc, err := sdk.New(endpoint) + if err != nil { + c.Fail(err) + } + + sc.Authenticator = authenticator(c) + sc.Rack = r + sc.Session = currentSession(c) + + return sc +} + +var commands = []command{} + +type command struct { + Command string + Description string + Handler HandlerFunc + Opts stdcli.CommandOptions + Rack bool +} + +func register(cmd, description string, fn HandlerFunc, opts stdcli.CommandOptions) { + commands = append(commands, command{ + Command: cmd, + Description: description, + Handler: fn, + Opts: opts, + Rack: true, + }) +} + +func registerWithoutProvider(cmd, description string, fn HandlerFunc, opts stdcli.CommandOptions) { + commands = append(commands, command{ + Command: cmd, + Description: description, + Handler: fn, + Opts: opts, + Rack: false, + }) +} diff --git a/pkg/cli/env.go b/pkg/cli/env.go new file mode 100644 index 0000000..ea00389 --- /dev/null +++ b/pkg/cli/env.go @@ -0,0 +1,320 @@ +package cli + +import ( + "bufio" + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "sort" + "strings" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("env", "list env vars", Env, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Validate: stdcli.Args(0), + }) + + register("env edit", "edit env interactively", EnvEdit, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagApp, + flagRack, + flagWait, + stdcli.BoolFlag("promote", "p", "promote the release"), + }, + Validate: stdcli.Args(0), + }) + + register("env get", "get an env var", EnvGet, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("env set", "set env var(s)", EnvSet, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagApp, + flagId, + flagRack, + flagWait, + stdcli.BoolFlag("replace", "", "replace all environment variables with given ones"), + stdcli.BoolFlag("promote", "p", "promote the release"), + }, + Usage: " [key=value]...", + }) + + register("env unset", "unset env var(s)", EnvUnset, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagApp, + flagId, + flagRack, + flagWait, + stdcli.BoolFlag("promote", "p", "promote the release"), + }, + Usage: " [key]...", + Validate: stdcli.ArgsMin(1), + }) +} + +func Env(rack sdk.Interface, c *stdcli.Context) error { + env, err := common.AppEnvironment(rack, app(c)) + if err != nil { + return err + } + + c.Writef("%s\n", env.String()) + + return nil +} + +func EnvEdit(rack sdk.Interface, c *stdcli.Context) error { + env, err := common.AppEnvironment(rack, app(c)) + if err != nil { + return err + } + + tmp, err := ioutil.TempDir("", "") + if err != nil { + return err + } + + file := filepath.Join(tmp, fmt.Sprintf("%s.env", app(c))) + + fd, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY, 0600) + if err != nil { + return err + } + + if _, err := fd.Write([]byte(env.String())); err != nil { + return err + } + + fd.Close() + + editor := "vi" + + if e := os.Getenv("EDITOR"); e != "" { + editor = e + } + + if err := c.Terminal(editor, file); err != nil { + return err + } + + data, err := ioutil.ReadFile(file) + if err != nil { + return err + } + + nenv := structs.Environment{} + + if err := nenv.Load(bytes.TrimSpace(data)); err != nil { + return err + } + + nks := []string{} + + for k := range nenv { + nks = append(nks, fmt.Sprintf("%s", k)) + } + + sort.Strings(nks) + + c.Startf(fmt.Sprintf("Setting %s", strings.Join(nks, ", "))) + + var r *structs.Release + + s, err := rack.SystemGet() + if err != nil { + return err + } + + if s.Version <= "20180708231844" { + r, err = rack.EnvironmentSet(app(c), []byte(nenv.String())) + if err != nil { + return err + } + } else { + r, err = rack.ReleaseCreate(app(c), structs.ReleaseCreateOptions{Env: options.String(nenv.String())}) + if err != nil { + return err + } + } + + c.OK() + + c.Writef("Release: %s\n", r.Id) + + if c.Bool("promote") { + if err := releasePromote(rack, c, app(c), r.Id); err != nil { + return err + } + } + + return nil +} + +func EnvGet(rack sdk.Interface, c *stdcli.Context) error { + env, err := common.AppEnvironment(rack, app(c)) + if err != nil { + return err + } + + k := c.Arg(0) + + v, ok := env[k] + if !ok { + return fmt.Errorf("env not found: %s", k) + } + + c.Writef("%s\n", v) + + return nil +} + +func EnvSet(rack sdk.Interface, c *stdcli.Context) error { + var stdout io.Writer + + if c.Bool("id") { + stdout = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + env := structs.Environment{} + var err error + + if !c.Bool("replace") { + env, err = common.AppEnvironment(rack, app(c)) + if err != nil { + return err + } + } + + args := []string(c.Args) + keys := []string{} + + if !c.Reader().IsTerminal() { + s := bufio.NewScanner(c.Reader()) + for s.Scan() { + args = append(args, s.Text()) + } + } + + for _, arg := range args { + parts := strings.SplitN(arg, "=", 2) + if len(parts) == 2 { + keys = append(keys, fmt.Sprintf("%s", parts[0])) + env[parts[0]] = parts[1] + } + } + + sort.Strings(keys) + + c.Startf(fmt.Sprintf("Setting %s", strings.Join(keys, ", "))) + + var r *structs.Release + + s, err := rack.SystemGet() + if err != nil { + return err + } + + if s.Version <= "20180708231844" { + r, err = rack.EnvironmentSet(app(c), []byte(env.String())) + if err != nil { + return err + } + } else { + r, err = rack.ReleaseCreate(app(c), structs.ReleaseCreateOptions{Env: options.String(env.String())}) + if err != nil { + return err + } + } + + c.OK() + + c.Writef("Release: %s\n", r.Id) + + if c.Bool("promote") { + if err := releasePromote(rack, c, app(c), r.Id); err != nil { + return err + } + } + + if c.Bool("id") { + fmt.Fprintf(stdout, r.Id) + } + + return nil +} + +func EnvUnset(rack sdk.Interface, c *stdcli.Context) error { + var stdout io.Writer + + if c.Bool("id") { + stdout = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + env, err := common.AppEnvironment(rack, app(c)) + if err != nil { + return err + } + + keys := []string{} + + for _, arg := range c.Args { + keys = append(keys, fmt.Sprintf("%s", arg)) + delete(env, arg) + } + + sort.Strings(keys) + + c.Startf(fmt.Sprintf("Unsetting %s", strings.Join(keys, ", "))) + + var r *structs.Release + + s, err := rack.SystemGet() + if err != nil { + return err + } + + if s.Version <= "20180708231844" { + for _, e := range c.Args { + r, err = rack.EnvironmentUnset(app(c), e) + if err != nil { + return err + } + } + } else { + r, err = rack.ReleaseCreate(app(c), structs.ReleaseCreateOptions{Env: options.String(env.String())}) + if err != nil { + return err + } + } + + c.OK() + + c.Writef("Release: %s\n", r.Id) + + if c.Bool("promote") { + if err := releasePromote(rack, c, app(c), r.Id); err != nil { + return err + } + } + + if c.Bool("id") { + fmt.Fprintf(stdout, r.Id) + } + + return nil +} diff --git a/pkg/cli/env_test.go b/pkg/cli/env_test.go new file mode 100644 index 0000000..b4f5911 --- /dev/null +++ b/pkg/cli/env_test.go @@ -0,0 +1,228 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/require" +) + +func TestEnv(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + + res, err := testExecute(e, "env -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "BAZ=quux", + "FOO=bar", + }) + }) +} + +func TestEnvError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "env -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestEnvGet(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + + res, err := testExecute(e, "env get FOO -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"bar"}) + }) +} + +func TestEnvGetError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "env get FOO -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestEnvGetMissing(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + + res, err := testExecute(e, "env get FOOO -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: env not found: FOOO"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestEnvSet(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + ropts := structs.ReleaseCreateOptions{Env: options.String("AAA=bbb\nBAZ=quux\nCCC=ddd\nFOO=bar")} + i.On("ReleaseCreate", "app1", ropts).Return(fxRelease(), nil) + + res, err := testExecute(e, "env set AAA=bbb CCC=ddd -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Setting AAA, CCC... OK", + "Release: release1", + }) + }) +} + +func TestEnvSetError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + ropts := structs.ReleaseCreateOptions{Env: options.String("AAA=bbb\nBAZ=quux\nCCC=ddd\nFOO=bar")} + i.On("ReleaseCreate", "app1", ropts).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "env set AAA=bbb CCC=ddd -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Setting AAA, CCC... "}) + }) +} + +func TestEnvSetClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + i.On("EnvironmentSet", "app1", []byte("AAA=bbb\nBAZ=quux\nCCC=ddd\nFOO=bar")).Return(fxRelease(), nil) + + res, err := testExecute(e, "env set AAA=bbb CCC=ddd -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Setting AAA, CCC... OK", + "Release: release1", + }) + }) +} + +func TestEnvSetReplace(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + ropts := structs.ReleaseCreateOptions{Env: options.String("AAA=bbb\nCCC=ddd")} + i.On("ReleaseCreate", "app1", ropts).Return(fxRelease(), nil) + + res, err := testExecute(e, "env set AAA=bbb CCC=ddd -a app1 --replace", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Setting AAA, CCC... OK", + "Release: release1", + }) + }) +} + +func TestEnvSetReplaceError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + ropts := structs.ReleaseCreateOptions{Env: options.String("AAA=bbb\nCCC=ddd")} + i.On("ReleaseCreate", "app1", ropts).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "env set AAA=bbb CCC=ddd -a app1 --replace", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Setting AAA, CCC... "}) + }) +} + +func TestEnvUnset(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + ropts := structs.ReleaseCreateOptions{Env: options.String("BAZ=quux")} + i.On("ReleaseCreate", "app1", ropts).Return(fxRelease(), nil) + + res, err := testExecute(e, "env unset FOO -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Unsetting FOO... OK", + "Release: release1", + }) + }) +} + +func TestEnvUnsetError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + ropts := structs.ReleaseCreateOptions{Env: options.String("BAZ=quux")} + i.On("ReleaseCreate", "app1", ropts).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "env unset FOO -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Unsetting FOO... "}) + }) +} + +func TestEnvUnsetClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + opts := structs.ReleaseListOptions{Limit: options.Int(1)} + i.On("ReleaseList", "app1", opts).Return(structs.Releases{*fxRelease()}, nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + i.On("EnvironmentUnset", "app1", "FOO").Return(fxRelease(), nil) + + res, err := testExecute(e, "env unset FOO -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Unsetting FOO... OK", + "Release: release1", + }) + }) +} diff --git a/pkg/cli/exec.go b/pkg/cli/exec.go new file mode 100644 index 0000000..e206e48 --- /dev/null +++ b/pkg/cli/exec.go @@ -0,0 +1,45 @@ +package cli + +import ( + "os" + "strings" + + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("exec", "execute a command in a running process", Exec, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Usage: " ", + Validate: stdcli.ArgsMin(2), + }) +} + +func Exec(rack sdk.Interface, c *stdcli.Context) error { + pid := c.Arg(0) + command := strings.Join(c.Args[1:], " ") + + opts := structs.ProcessExecOptions{} + + if w, h, err := c.TerminalSize(); err == nil { + opts.Height = options.Int(h) + opts.Width = options.Int(w) + } + + if !stdcli.IsTerminal(os.Stdin) { + opts.Tty = options.Bool(false) + } + + restore := c.TerminalRaw() + defer restore() + + code, err := rack.ProcessExec(app(c), pid, command, c, opts) + if err != nil { + return err + } + + return stdcli.Exit(code) +} diff --git a/pkg/cli/exec_test.go b/pkg/cli/exec_test.go new file mode 100644 index 0000000..22cd349 --- /dev/null +++ b/pkg/cli/exec_test.go @@ -0,0 +1,47 @@ +package cli_test + +import ( + "fmt" + "io" + "io/ioutil" + "strings" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestExec(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.ProcessExecOptions{Tty: options.Bool(false)} + i.On("ProcessExec", "app1", "0123456789", "bash", mock.Anything, opts).Return(4, nil).Run(func(args mock.Arguments) { + data, err := ioutil.ReadAll(args.Get(3).(io.Reader)) + require.NoError(t, err) + require.Equal(t, "in", string(data)) + args.Get(3).(io.Writer).Write([]byte("out")) + }) + + res, err := testExecute(e, "exec 0123456789 bash -a app1", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 4, res.Code) + res.RequireStderr(t, []string{""}) + require.Equal(t, "out", res.Stdout) + }) +} + +func TestExecError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.ProcessExecOptions{Tty: options.Bool(false)} + i.On("ProcessExec", "app1", "0123456789", "bash", mock.Anything, opts).Return(0, fmt.Errorf("err1")) + + res, err := testExecute(e, "exec 0123456789 bash -a app1", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} diff --git a/pkg/cli/fixtures_test.go b/pkg/cli/fixtures_test.go new file mode 100644 index 0000000..0c586c2 --- /dev/null +++ b/pkg/cli/fixtures_test.go @@ -0,0 +1,304 @@ +package cli_test + +import ( + "time" + + "github.com/convox/convox/pkg/structs" +) + +func fxApp() *structs.App { + return &structs.App{ + Name: "app1", + Generation: "2", + Parameters: fxParameters(), + Release: "release1", + Status: "running", + } +} + +func fxAppGeneration1() *structs.App { + return &structs.App{ + Name: "app1", + Generation: "1", + Parameters: fxParameters(), + Release: "release1", + Status: "running", + } +} + +func fxAppRouter() *structs.App { + return &structs.App{ + Name: "app1", + Generation: "2", + Parameters: fxParameters(), + Release: "release1", + Router: "router1", + Status: "running", + } +} + +func fxAppUpdating() *structs.App { + return &structs.App{ + Name: "app1", + Generation: "2", + Parameters: fxParameters(), + Release: "release1", + Status: "updating", + } +} + +func fxBuild() *structs.Build { + return &structs.Build{ + App: "app1", + Id: "build1", + Description: "desc", + Ended: fxStarted.Add(2 * time.Minute), + Manifest: "manifest1\nmanifest2\n", + Release: "release1", + Started: fxStarted, + Status: "complete", + } +} + +func fxBuildCreated() *structs.Build { + return &structs.Build{ + Id: "build2", + Status: "running", + } +} + +func fxBuildFailed() *structs.Build { + return &structs.Build{ + Id: "build3", + Started: fxStarted, + Status: "failed", + } +} + +func fxBuildRunning() *structs.Build { + return &structs.Build{ + Id: "build4", + Started: fxStarted, + Status: "running", + } +} + +func fxCertificate() *structs.Certificate { + return &structs.Certificate{ + Id: "cert1", + Domain: "example.org", + Domains: []string{"example.net", "example.com"}, + Expiration: time.Now().Add(49 * time.Hour).UTC(), + } +} + +func fxInstance() *structs.Instance { + return &structs.Instance{ + Agent: true, + Cpu: 0.423, + Id: "instance1", + Memory: 0.718, + PrivateIp: "private", + Processes: 3, + PublicIp: "public", + Status: "status", + Started: time.Now().UTC().Add(-48 * time.Hour), + } +} + +func fxLogs() []string { + return []string{ + "log1", + "log2", + } +} + +func fxLogsLonger() []string { + return []string{ + "log1", + "log2", + "log3", + } +} + +func fxLogsSystem() []string { + return []string{ + "TIME system/aws/component log1", + "TIME system/aws/component log2", + } +} + +func fxParameters() map[string]string { + return map[string]string{ + "ParamFoo": "value1", + "ParamOther": "value2", + "ParamPassword": "****", + } +} + +func fxProcess() *structs.Process { + return &structs.Process{ + Id: "pid1", + App: "app1", + Command: "command", + Cpu: 1.0, + Host: "host", + Image: "image", + Instance: "instance", + Memory: 2.0, + Name: "name", + Ports: []string{"1000", "2000"}, + Release: "release1", + Started: time.Now().UTC().Add(-49 * time.Hour), + Status: "running", + } +} + +func fxProcessPending() *structs.Process { + return &structs.Process{ + Id: "pid1", + App: "app1", + Command: "command", + Cpu: 1.0, + Host: "host", + Image: "image", + Instance: "instance", + Memory: 2.0, + Name: "name", + Ports: []string{"1000", "2000"}, + Release: "release1", + Started: time.Now().UTC().Add(-49 * time.Hour), + Status: "pending", + } +} + +func fxRegistry() *structs.Registry { + return &structs.Registry{ + Server: "registry1", + Username: "username", + Password: "password", + } +} + +func fxRelease() *structs.Release { + return &structs.Release{ + Id: "release1", + App: "app1", + Build: "build1", + Env: "FOO=bar\nBAZ=quux", + Manifest: "services:\n web:\n build: .\n test: make test", + Created: time.Now().UTC().Add(-49 * time.Hour), + Description: "description1", + } +} + +func fxRelease2() *structs.Release { + return &structs.Release{ + Id: "release2", + App: "app1", + Build: "build1", + Env: "FOO=bar\nBAZ=quux", + Manifest: "manifest", + Created: time.Now().UTC().Add(-49 * time.Hour), + } +} + +func fxRelease3() *structs.Release { + return &structs.Release{ + Id: "release3", + App: "app1", + Build: "build1", + Env: "FOO=bar\nBAZ=quux", + Manifest: "manifest", + Created: time.Now().UTC().Add(-49 * time.Hour), + } +} + +func fxResource() *structs.Resource { + return &structs.Resource{ + Name: "resource1", + Parameters: map[string]string{"k1": "v1", "k2": "v2", "Url": "https://other.example.org/path"}, + Status: "status", + Type: "type", + Url: "https://example.org/path", + Apps: structs.Apps{*fxApp(), *fxApp()}, + } +} + +func fxResourceType() structs.ResourceType { + return structs.ResourceType{ + Name: "type1", + Parameters: structs.ResourceParameters{ + {Default: "def1", Description: "desc1", Name: "Param1"}, + {Default: "def2", Description: "desc2", Name: "Param2"}, + }, + } +} + +func fxService() *structs.Service { + return &structs.Service{ + Name: "service1", + Count: 1, + Cpu: 2, + Domain: "domain", + Memory: 3, + Ports: []structs.ServicePort{ + {Balancer: 1, Certificate: "cert1", Container: 2}, + {Balancer: 1, Certificate: "cert1", Container: 2}, + }, + } +} + +func fxSystem() *structs.System { + return &structs.System{ + Count: 1, + Domain: "domain", + Name: "name", + Outputs: map[string]string{"k1": "v1", "k2": "v2"}, + Parameters: map[string]string{"Autoscale": "Yes", "ParamFoo": "value1", "ParamOther": "value2"}, + Provider: "provider", + Region: "region", + Status: "running", + Type: "type", + Version: "21000101000000", + } +} + +func fxSystemClassic() *structs.System { + return &structs.System{ + Count: 1, + Domain: "domain", + Name: "name", + Outputs: map[string]string{"k1": "v1", "k2": "v2"}, + Parameters: map[string]string{"ParamFoo": "value1", "ParamOther": "value2"}, + Provider: "provider", + Region: "region", + Status: "running", + Type: "type", + Version: "20180101000000", + } +} + +func fxSystemLocal() *structs.System { + return &structs.System{ + Name: "convox", + Provider: "local", + Status: "running", + Version: "dev", + } +} + +func fxSystemInternal() *structs.System { + return &structs.System{ + Count: 1, + Domain: "domain", + Name: "name", + Outputs: map[string]string{"DomainInternal": "domain-internal"}, + Parameters: map[string]string{"Autoscale": "Yes", "ParamFoo": "value1", "ParamOther": "value2"}, + Provider: "provider", + Region: "region", + Status: "running", + Type: "type", + Version: "20180901000000", + } +} diff --git a/pkg/cli/helpers.go b/pkg/cli/helpers.go new file mode 100644 index 0000000..cccb13e --- /dev/null +++ b/pkg/cli/helpers.go @@ -0,0 +1,369 @@ +package cli + +import ( + "crypto/rand" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "net/url" + "os" + "path/filepath" + "runtime" + "sort" + "strings" + "time" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" + "github.com/convox/stdsdk" +) + +type rack struct { + Name string + Status string +} + +func app(c *stdcli.Context) string { + wd, err := os.Getwd() + if err != nil { + panic(err) + } + + return coalesce(c.String("app"), c.LocalSetting("app"), filepath.Base(wd)) +} + +func coalesce(ss ...string) string { + for _, s := range ss { + if s != "" { + return s + } + } + + return "" +} + +func currentHost(c *stdcli.Context) (string, error) { + if h := os.Getenv("CONVOX_HOST"); h != "" { + return h, nil + } + + if h, _ := c.SettingRead("host"); h != "" { + return h, nil + } + + return "", nil +} + +func currentPassword(c *stdcli.Context, host string) (string, error) { + if pw := os.Getenv("CONVOX_PASSWORD"); pw != "" { + return pw, nil + } + + return c.SettingReadKey("auth", host) +} + +func currentEndpoint(c *stdcli.Context, rack_ string) (string, error) { + if e := os.Getenv("RACK_URL"); e != "" { + return e, nil + } + + if strings.HasPrefix(rack_, "local/") { + return fmt.Sprintf("https://rack.%s", strings.SplitN(rack_, "/", 2)[1]), nil + } + + host, err := currentHost(c) + if err != nil { + return "", err + } + + if host == "" { + if !localRackRunning(c) { + return "", fmt.Errorf("no racks found, try `convox login`") + } + + var r *rack + + if cr := currentRack(c, ""); cr != "" { + r, err = matchRack(c, cr) + if err != nil { + return "", err + } + } else { + r, err = matchRack(c, "local/") + if err != nil { + return "", err + } + } + + if r == nil { + return "", fmt.Errorf("no racks found, try `convox login`") + } + + return fmt.Sprintf("https://rack.%s", strings.SplitN(r.Name, "/", 2)[1]), nil + } + + pw, err := currentPassword(c, host) + if err != nil { + return "", err + } + + return fmt.Sprintf("https://convox:%s@%s", url.QueryEscape(pw), host), nil +} + +func currentRack(c *stdcli.Context, host string) string { + if r := c.String("rack"); r != "" { + return r + } + + if r := os.Getenv("CONVOX_RACK"); r != "" { + return r + } + + if r := c.LocalSetting("rack"); r != "" { + return r + } + + if r := hostRacks(c)[host]; r != "" { + return r + } + + if r, _ := c.SettingRead("rack"); r != "" { + return r + } + + return "" +} + +func executableName() string { + switch runtime.GOOS { + case "windows": + return "convox.exe" + default: + return "convox" + } +} + +func generateTempKey() (string, error) { + data := make([]byte, 1024) + + if _, err := rand.Read(data); err != nil { + return "", err + } + + hash := sha256.Sum256(data) + + return fmt.Sprintf("tmp/%s", hex.EncodeToString(hash[:])[0:30]), nil +} + +func hostRacks(c *stdcli.Context) map[string]string { + data, err := c.SettingRead("racks") + if err != nil { + return map[string]string{} + } + + var rs map[string]string + + if err := json.Unmarshal([]byte(data), &rs); err != nil { + return map[string]string{} + } + + return rs +} + +func localRackRunning(c *stdcli.Context) bool { + rs, err := localRacks(c) + if err != nil { + return false + } + + return len(rs) > 0 +} + +func localRacks(c *stdcli.Context) ([]rack, error) { + if os.Getenv("CONVOX_LOCAL") == "disable" { + return []rack{}, nil + } + + racks := []rack{} + + data, err := c.Execute("kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name") + if err == nil { + nsrs := strings.Split(strings.TrimSpace(string(data)), "\n") + + for _, nsr := range nsrs { + if strings.HasPrefix(nsr, "namespace/") { + racks = append(racks, rack{ + Name: fmt.Sprintf("local/%s", strings.TrimPrefix(nsr, "namespace/")), + Status: "running", + }) + } + } + } + + return racks, nil +} + +func matchRack(c *stdcli.Context, name string) (*rack, error) { + rs, err := racks(c) + if err != nil { + return nil, err + } + + matches := []rack{} + + for _, r := range rs { + if r.Name == name { + return &r, nil + } + + if strings.Index(r.Name, name) != -1 { + matches = append(matches, r) + } + } + + if len(matches) > 1 { + return nil, fmt.Errorf("ambiguous rack name: %s", name) + } + + if len(matches) == 1 { + return &matches[0], nil + } + + return nil, fmt.Errorf("could not find rack: %s", name) +} + +func racks(c *stdcli.Context) ([]rack, error) { + rs := []rack{} + + rrs, err := remoteRacks(c) + if err != nil { + return nil, err + } + + rs = append(rs, rrs...) + + lrs, err := localRacks(c) + if err != nil { + return nil, err + } + + rs = append(rs, lrs...) + + sort.Slice(rs, func(i, j int) bool { + return rs[i].Name < rs[j].Name + }) + + return rs, nil +} + +func remoteRacks(c *stdcli.Context) ([]rack, error) { + h, err := currentHost(c) + if err != nil { + return nil, err + } + + if h == "" { + return []rack{}, nil + } + + racks := []rack{} + + var rs []struct { + Name string + Organization struct { + Name string + } + Status string + } + + // override local rack to get remote rack list + endpoint, err := currentEndpoint(c, "") + if err != nil { + return nil, err + } + + p, err := sdk.New(endpoint) + if err != nil { + return nil, err + } + + p.Authenticator = authenticator(c) + p.Session = currentSession(c) + + if err := p.Get("/racks", stdsdk.RequestOptions{}, &rs); err != nil { + if _, ok := err.(AuthenticationError); ok { + return nil, err + } + } + + if rs != nil { + for _, r := range rs { + racks = append(racks, rack{ + Name: fmt.Sprintf("%s/%s", r.Organization.Name, r.Name), + Status: r.Status, + }) + } + } + + return racks, nil +} + +func tag(name, value string) string { + return fmt.Sprintf("<%s>%s", name, value, name) +} + +func waitForResourceDeleted(rack sdk.Interface, c *stdcli.Context, resource string) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + time.Sleep(WaitDuration) // give the stack time to start updating + + return common.Wait(WaitDuration, 30*time.Minute, 2, func() (bool, error) { + var err error + if s.Version <= "20190111211123" { + _, err = rack.SystemResourceGetClassic(resource) + } else { + _, err = rack.SystemResourceGet(resource) + } + if err == nil { + return false, nil + } + if strings.Contains(err.Error(), "no such resource") { + return true, nil + } + if strings.Contains(err.Error(), "does not exist") { + return true, nil + } + return false, err + }) +} + +func waitForResourceRunning(rack sdk.Interface, c *stdcli.Context, resource string) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + time.Sleep(WaitDuration) // give the stack time to start updating + + return common.Wait(WaitDuration, 30*time.Minute, 2, func() (bool, error) { + var r *structs.Resource + var err error + + if s.Version <= "20190111211123" { + r, err = rack.SystemResourceGetClassic(resource) + } else { + r, err = rack.SystemResourceGet(resource) + } + if err != nil { + return false, err + } + + return r.Status == "running", nil + }) +} diff --git a/pkg/cli/instances.go b/pkg/cli/instances.go new file mode 100644 index 0000000..cc3114f --- /dev/null +++ b/pkg/cli/instances.go @@ -0,0 +1,116 @@ +package cli + +import ( + "fmt" + "strings" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("instances", "list instances", Instances, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.Args(0), + }) + + register("instances keyroll", "roll ssh key on instances", InstancesKeyroll, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagWait}, + Validate: stdcli.Args(0), + }) + + register("instances ssh", "run a shell on an instance", InstancesSsh, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.ArgsMin(1), + }) + + register("instances terminate", "terminate an instance", InstancesTerminate, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.ArgsMin(1), + }) +} + +func Instances(rack sdk.Interface, c *stdcli.Context) error { + is, err := rack.InstanceList() + if err != nil { + return err + } + + t := c.Table("ID", "STATUS", "STARTED", "PS", "CPU", "MEM", "PUBLIC", "PRIVATE") + + for _, i := range is { + t.AddRow(i.Id, i.Status, common.Ago(i.Started), fmt.Sprintf("%d", i.Processes), common.Percent(i.Cpu), common.Percent(i.Memory), i.PublicIp, i.PrivateIp) + } + + return t.Print() +} + +func InstancesKeyroll(rack sdk.Interface, c *stdcli.Context) error { + c.Startf("Rolling instance key") + + if err := rack.InstanceKeyroll(); err != nil { + return err + } + + if c.Bool("wait") { + c.Writef("\n") + + if err := common.WaitForRackWithLogs(rack, c); err != nil { + return err + } + } + + return c.OK() +} + +func InstancesSsh(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + opts := structs.InstanceShellOptions{} + + if w, h, err := c.TerminalSize(); err == nil { + opts.Height = options.Int(h) + opts.Width = options.Int(w) + } + + restore := c.TerminalRaw() + defer restore() + + command := strings.Join(c.Args[1:], " ") + + if command != "" { + opts.Command = options.String(command) + } + + if s.Version <= "20180708231844" { + code, err := rack.InstanceShellClassic(c.Arg(0), c, opts) + if err != nil { + return err + } + + return stdcli.Exit(code) + } + + code, err := rack.InstanceShell(c.Arg(0), c, opts) + if err != nil { + return err + } + + return stdcli.Exit(code) +} + +func InstancesTerminate(rack sdk.Interface, c *stdcli.Context) error { + c.Startf("Terminating instance") + + if err := rack.InstanceTerminate(c.Arg(0)); err != nil { + return err + } + + return c.OK() +} diff --git a/pkg/cli/instances_test.go b/pkg/cli/instances_test.go new file mode 100644 index 0000000..0754150 --- /dev/null +++ b/pkg/cli/instances_test.go @@ -0,0 +1,143 @@ +package cli_test + +import ( + "fmt" + "io" + "io/ioutil" + "strings" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestInstances(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("InstanceList").Return(structs.Instances{*fxInstance(), *fxInstance()}, nil) + + res, err := testExecute(e, "instances", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ID STATUS STARTED PS CPU MEM PUBLIC PRIVATE", + "instance1 status 2 days ago 3 42.30% 71.80% public private", + "instance1 status 2 days ago 3 42.30% 71.80% public private", + }) + }) +} + +func TestInstancesError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("InstanceList").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "instances", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestInstancesKeyroll(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("InstanceKeyroll").Return(nil) + + res, err := testExecute(e, "instances keyroll", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Rolling instance key... OK"}) + }) +} + +func TestInstancesKeyrollError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("InstanceKeyroll").Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "instances keyroll", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Rolling instance key... "}) + }) +} + +func TestInstancesSsh(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.InstanceShellOptions{} + i.On("InstanceShell", "instance1", mock.Anything, opts).Return(4, nil).Run(func(args mock.Arguments) { + data, err := ioutil.ReadAll(args.Get(1).(io.Reader)) + require.NoError(t, err) + require.Equal(t, "in", string(data)) + args.Get(1).(io.Writer).Write([]byte("out")) + }) + + res, err := testExecute(e, "instances ssh instance1", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 4, res.Code) + res.RequireStderr(t, []string{""}) + require.Equal(t, "out", res.Stdout) + }) +} + +func TestInstancesSshError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.InstanceShellOptions{} + i.On("InstanceShell", "instance1", mock.Anything, opts).Return(0, fmt.Errorf("err1")) + + res, err := testExecute(e, "instances ssh instance1", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestInstancesSshClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + opts := structs.InstanceShellOptions{} + i.On("InstanceShellClassic", "instance1", mock.Anything, opts).Return(4, nil).Run(func(args mock.Arguments) { + data, err := ioutil.ReadAll(args.Get(1).(io.Reader)) + require.NoError(t, err) + require.Equal(t, "in", string(data)) + args.Get(1).(io.Writer).Write([]byte("out")) + }) + + res, err := testExecute(e, "instances ssh instance1", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 4, res.Code) + res.RequireStderr(t, []string{""}) + require.Equal(t, "out", res.Stdout) + }) +} + +func TestInstancesTerminate(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("InstanceTerminate", "instance1").Return(nil) + + res, err := testExecute(e, "instances terminate instance1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Terminating instance... OK"}) + }) +} + +func TestInstancesTerminateError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("InstanceTerminate", "instance1").Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "instances terminate instance1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Terminating instance... "}) + }) +} diff --git a/pkg/cli/login.go b/pkg/cli/login.go new file mode 100644 index 0000000..adf0edc --- /dev/null +++ b/pkg/cli/login.go @@ -0,0 +1,74 @@ +package cli + +import ( + "fmt" + "net/url" + "os" + + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + registerWithoutProvider("login", "authenticate with a rack", Login, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + stdcli.StringFlag("password", "p", "password"), + }, + Usage: "[hostname]", + Validate: stdcli.ArgsMax(1), + }) +} + +func Login(rack sdk.Interface, c *stdcli.Context) error { + hostname := coalesce(c.Arg(0), "console.convox.com") + + auth, err := c.SettingReadKey("auth", hostname) + if err != nil { + return err + } + + password := coalesce(c.String("password"), os.Getenv("CONVOX_PASSWORD"), auth) + + if password == "" { + c.Writef("Password: ") + + password, err = c.ReadSecret() + if err != nil { + return err + } + + c.Writef("\n") + } + + c.Startf("Authenticating with %s", hostname) + + cl, err := sdk.New(fmt.Sprintf("https://convox:%s@%s", url.QueryEscape(password), hostname)) + if err != nil { + return err + } + + id, err := cl.Auth() + if err != nil { + return fmt.Errorf("invalid login") + } + + if err := c.SettingWriteKey("auth", hostname, password); err != nil { + return err + } + + if err := c.SettingWrite("host", hostname); err != nil { + return err + } + + if id != "" { + if err := c.SettingWrite("id", id); err != nil { + return err + } + } + + if err := c.SettingDelete("rack"); err != nil { + return err + } + + return c.OK() +} diff --git a/pkg/cli/login_test.go b/pkg/cli/login_test.go new file mode 100644 index 0000000..741b0d9 --- /dev/null +++ b/pkg/cli/login_test.go @@ -0,0 +1,60 @@ +package cli_test + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "net/url" + "path/filepath" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/stretchr/testify/require" +) + +func TestLogin(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/auth", r.URL.Path) + user, pass, _ := r.BasicAuth() + require.Equal(t, "convox", user) + require.Equal(t, "password", pass) + })) + + tsu, err := url.Parse(ts.URL) + require.NoError(t, err) + + res, err := testExecute(e, fmt.Sprintf("login %s -p password", tsu.Host), nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{fmt.Sprintf("Authenticating with %s... OK", tsu.Host)}) + + data, err := ioutil.ReadFile(filepath.Join(e.Settings, "auth")) + require.NoError(t, err) + require.Equal(t, fmt.Sprintf("{\n \"%s\": \"password\"\n}", tsu.Host), string(data)) + + data, err = ioutil.ReadFile(filepath.Join(e.Settings, "host")) + require.NoError(t, err) + require.Equal(t, tsu.Host, string(data)) + }) +} + +func TestLoginError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(401) + })) + + tsu, err := url.Parse(ts.URL) + require.NoError(t, err) + + res, err := testExecute(e, fmt.Sprintf("login %s -p password", tsu.Host), nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: invalid login"}) + res.RequireStdout(t, []string{fmt.Sprintf("Authenticating with %s... ", tsu.Host)}) + }) +} diff --git a/pkg/cli/logs.go b/pkg/cli/logs.go new file mode 100644 index 0000000..3684c23 --- /dev/null +++ b/pkg/cli/logs.go @@ -0,0 +1,40 @@ +package cli + +import ( + "io" + + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("logs", "get logs for an app", Logs, stdcli.CommandOptions{ + Flags: append(stdcli.OptionFlags(structs.LogsOptions{}), flagApp, flagNoFollow, flagRack), + Validate: stdcli.Args(0), + }) +} + +func Logs(rack sdk.Interface, c *stdcli.Context) error { + var opts structs.LogsOptions + + if err := c.Options(&opts); err != nil { + return err + } + + if c.Bool("no-follow") { + opts.Follow = options.Bool(false) + } + + opts.Prefix = options.Bool(true) + + r, err := rack.AppLogs(app(c), opts) + if err != nil { + return err + } + + _, err = io.Copy(c, r) + + return nil +} diff --git a/pkg/cli/logs_test.go b/pkg/cli/logs_test.go new file mode 100644 index 0000000..ab2188e --- /dev/null +++ b/pkg/cli/logs_test.go @@ -0,0 +1,39 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/require" +) + +func TestLogs(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppLogs", "app1", structs.LogsOptions{Prefix: options.Bool(true)}).Return(testLogs(fxLogs()), nil) + + res, err := testExecute(e, "logs -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + fxLogs()[0], + fxLogs()[1], + }) + }) +} + +func TestLogsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppLogs", "app1", structs.LogsOptions{Prefix: options.Bool(true)}).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "logs -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} diff --git a/pkg/cli/proxy.go b/pkg/cli/proxy.go new file mode 100644 index 0000000..cbbe6f0 --- /dev/null +++ b/pkg/cli/proxy.go @@ -0,0 +1,125 @@ +package cli + +import ( + "fmt" + "net" + "strconv" + "strings" + + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("proxy", "proxy a connection inside the rack", Proxy, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagRack, + stdcli.BoolFlag("tls", "t", "wrap connection in tls"), + }, + Usage: "<[port:]host:hostport> [[port:]host:hostport]...", + Validate: stdcli.ArgsMin(1), + }) +} + +// var ProxyCloser = make(chan error) + +func Proxy(rack sdk.Interface, c *stdcli.Context) error { + for _, arg := range c.Args { + parts := strings.SplitN(arg, ":", 3) + + var host string + var port, hostport int + + switch len(parts) { + case 2: + host = parts[0] + + p, err := strconv.Atoi(parts[1]) + if err != nil { + return err + } + + port = p + hostport = p + case 3: + host = parts[1] + + p, err := strconv.Atoi(parts[0]) + if err != nil { + return err + } + + port = p + + p, err = strconv.Atoi(parts[2]) + + if err != nil { + return err + } + + hostport = p + default: + return fmt.Errorf("invalid argument: %s", arg) + } + + go proxy(rack, c, port, host, hostport, c.Bool("tls")) + } + + <-c.Done() + + return nil +} + +func proxy(rack sdk.Interface, c *stdcli.Context, localport int, remotehost string, remoteport int, secure bool) { + c.Writef("proxying localhost:%d to %s:%d\n", localport, remotehost, remoteport) + + lc := &net.ListenConfig{} + + ln, err := lc.Listen(c.Context, "tcp4", fmt.Sprintf("127.0.0.1:%d", localport)) + if err != nil { + c.Error(err) + return + } + defer ln.Close() + + ch := make(chan net.Conn) + + go proxyAccept(c, ln, ch) + + for { + select { + case <-c.Done(): + return + case cn := <-ch: + c.Writef("connect: %d\n", localport) + go proxyConnection(c, cn, rack, remotehost, remoteport, secure) + } + } +} + +func proxyAccept(c *stdcli.Context, ln net.Listener, ch chan net.Conn) { + for { + select { + case <-c.Done(): + return + default: + if cn, _ := ln.Accept(); cn != nil { + ch <- cn + } + } + } +} + +func proxyConnection(c *stdcli.Context, cn net.Conn, rack sdk.Interface, remotehost string, remoteport int, secure bool) { + defer cn.Close() + + opts := structs.ProxyOptions{ + TLS: options.Bool(secure), + } + + if err := rack.WithContext(c.Context).Proxy(remotehost, remoteport, cn, opts); err != nil { + c.Error(err) + } +} diff --git a/pkg/cli/proxy_test.go b/pkg/cli/proxy_test.go new file mode 100644 index 0000000..116da30 --- /dev/null +++ b/pkg/cli/proxy_test.go @@ -0,0 +1,122 @@ +package cli_test + +import ( + "context" + "fmt" + "io" + "io/ioutil" + "math/rand" + "net" + "testing" + "time" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestProxy(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + i.On("WithContext", ctx).Return(i) + opts := structs.ProxyOptions{ + TLS: options.Bool(false), + } + i.On("Proxy", "test.example.org", 5000, mock.Anything, opts).Return(nil).Run(func(args mock.Arguments) { + buf := make([]byte, 2) + rwc := args.Get(2).(io.ReadWriteCloser) + n, err := rwc.Read(buf) + require.NoError(t, err) + require.Equal(t, 2, n) + require.Equal(t, "in", string(buf)) + n, err = rwc.Write([]byte("out")) + require.NoError(t, err) + require.Equal(t, 3, n) + rwc.Close() + }) + + port := rand.Intn(30000) + 10000 + + ch := make(chan *result) + + go func() { + res, err := testExecuteContext(ctx, e, fmt.Sprintf("proxy %d:test.example.org:5000", port), nil) + require.NoError(t, err) + ch <- res + }() + + time.Sleep(500 * time.Millisecond) + + cn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port)) + require.NoError(t, err) + + cn.Write([]byte("in")) + + data, err := ioutil.ReadAll(cn) + require.NoError(t, err) + require.Equal(t, "out", string(data)) + + cancel() + + res := <-ch + + require.NotNil(t, res) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + fmt.Sprintf("proxying localhost:%d to test.example.org:5000", port), + fmt.Sprintf("connect: %d", port), + }) + }) +} + +func TestProxyError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + i.On("WithContext", ctx).Return(i) + opts := structs.ProxyOptions{ + TLS: options.Bool(false), + } + i.On("Proxy", "test.example.org", 5000, mock.Anything, opts).Return(fmt.Errorf("err1")) + + port := rand.Intn(30000) + 10000 + + ch := make(chan *result) + + go func() { + res, err := testExecuteContext(ctx, e, fmt.Sprintf("proxy %d:test.example.org:5000", port), nil) + require.NoError(t, err) + ch <- res + }() + + time.Sleep(500 * time.Millisecond) + + cn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port)) + require.NoError(t, err) + + cn.Write([]byte("in")) + + data, _ := ioutil.ReadAll(cn) + require.Len(t, data, 0) + + cancel() + // cli.ProxyCloser <- nil + + res := <-ch + + require.NotNil(t, res) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{ + fmt.Sprintf("proxying localhost:%d to test.example.org:5000", port), + fmt.Sprintf("connect: %d", port), + }) + }) +} diff --git a/pkg/cli/ps.go b/pkg/cli/ps.go new file mode 100644 index 0000000..843da28 --- /dev/null +++ b/pkg/cli/ps.go @@ -0,0 +1,76 @@ +package cli + +import ( + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("ps", "list app processes", Ps, stdcli.CommandOptions{ + Flags: append(stdcli.OptionFlags(structs.ProcessListOptions{}), flagApp, flagRack), + Validate: stdcli.Args(0), + }) + + register("ps info", "get information about a process", PsInfo, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Validate: stdcli.Args(1), + }) + + register("ps stop", "stop a process", PsStop, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Validate: stdcli.Args(1), + }) +} + +func Ps(rack sdk.Interface, c *stdcli.Context) error { + var opts structs.ProcessListOptions + + if err := c.Options(&opts); err != nil { + return err + } + + ps, err := rack.ProcessList(app(c), opts) + if err != nil { + return err + } + + t := c.Table("ID", "SERVICE", "STATUS", "RELEASE", "STARTED", "COMMAND") + + for _, p := range ps { + t.AddRow(p.Id, p.Name, p.Status, p.Release, common.Ago(p.Started), p.Command) + } + + return t.Print() +} + +func PsInfo(rack sdk.Interface, c *stdcli.Context) error { + i := c.Info() + + ps, err := rack.ProcessGet(app(c), c.Arg(0)) + if err != nil { + return err + } + + i.Add("Id", ps.Id) + i.Add("App", ps.App) + i.Add("Command", ps.Command) + i.Add("Instance", ps.Instance) + i.Add("Release", ps.Release) + i.Add("Service", ps.Name) + i.Add("Started", common.Ago(ps.Started)) + i.Add("Status", ps.Status) + + return i.Print() +} + +func PsStop(rack sdk.Interface, c *stdcli.Context) error { + c.Startf("Stopping %s", c.Arg(0)) + + if err := rack.ProcessStop(app(c), c.Arg(0)); err != nil { + return err + } + + return c.OK() +} diff --git a/pkg/cli/ps_test.go b/pkg/cli/ps_test.go new file mode 100644 index 0000000..c648949 --- /dev/null +++ b/pkg/cli/ps_test.go @@ -0,0 +1,96 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/require" +) + +func TestPs(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ProcessList", "app1", structs.ProcessListOptions{}).Return(structs.Processes{*fxProcess(), *fxProcessPending()}, nil) + + res, err := testExecute(e, "ps -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ID SERVICE STATUS RELEASE STARTED COMMAND", + "pid1 name running release1 2 days ago command", + "pid1 name pending release1 2 days ago command", + }) + }) +} + +func TestPsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ProcessList", "app1", structs.ProcessListOptions{}).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "ps -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestPsInfo(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ProcessGet", "app1", "pid1").Return(fxProcess(), nil) + + res, err := testExecute(e, "ps info pid1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Id pid1", + "App app1", + "Command command", + "Instance instance", + "Release release1", + "Service name", + "Started 2 days ago", + "Status running", + }) + }) +} + +func TestPsInfoError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ProcessGet", "app1", "pid1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "ps info pid1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestPsStop(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ProcessStop", "app1", "pid1").Return(nil) + + res, err := testExecute(e, "ps stop pid1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Stopping pid1... OK"}) + }) +} + +func TestPsStopError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ProcessStop", "app1", "pid1").Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "ps stop pid1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Stopping pid1... "}) + }) +} diff --git a/pkg/cli/rack.go b/pkg/cli/rack.go new file mode 100644 index 0000000..854f5e4 --- /dev/null +++ b/pkg/cli/rack.go @@ -0,0 +1,312 @@ +package cli + +import ( + "fmt" + "io" + "sort" + "strings" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" + + cv "github.com/convox/version" +) + +func init() { + register("rack", "get information about the rack", Rack, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.Args(0), + }) + + register("rack logs", "get logs for the rack", RackLogs, stdcli.CommandOptions{ + Flags: append(stdcli.OptionFlags(structs.LogsOptions{}), flagNoFollow, flagRack), + Validate: stdcli.Args(0), + }) + + register("rack params", "display rack parameters", RackParams, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.Args(0), + }) + + register("rack params set", "set rack parameters", RackParamsSet, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagWait}, + Usage: " [Key=Value]...", + Validate: stdcli.ArgsMin(1), + }) + + register("rack ps", "list rack processes", RackPs, stdcli.CommandOptions{ + Flags: append(stdcli.OptionFlags(structs.SystemProcessesOptions{}), flagRack), + Validate: stdcli.Args(0), + }) + + register("rack releases", "list rack version history", RackReleases, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.Args(0), + }) + + register("rack scale", "scale the rack", RackScale, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagRack, + stdcli.IntFlag("count", "c", "instance count"), + stdcli.StringFlag("type", "t", "instance type"), + }, + Validate: stdcli.Args(0), + }) + + register("rack update", "update the rack", RackUpdate, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagWait}, + Validate: stdcli.ArgsMax(1), + }) + + register("rack wait", "wait for rack to finish updating", RackWait, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.Args(0), + }) +} + +func Rack(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + i := c.Info() + + i.Add("Name", s.Name) + i.Add("Provider", s.Provider) + + if s.Region != "" { + i.Add("Region", s.Region) + } + + if s.Domain != "" { + if ri := s.Outputs["DomainInternal"]; ri != "" { + i.Add("Router", fmt.Sprintf("%s (external)\n%s (internal)", s.Domain, ri)) + } else { + i.Add("Router", s.Domain) + } + } + + i.Add("Status", s.Status) + i.Add("Version", s.Version) + + return i.Print() +} + +func RackLogs(rack sdk.Interface, c *stdcli.Context) error { + var opts structs.LogsOptions + + if err := c.Options(&opts); err != nil { + return err + } + + if c.Bool("no-follow") { + opts.Follow = options.Bool(false) + } + + opts.Prefix = options.Bool(true) + + r, err := rack.SystemLogs(opts) + if err != nil { + return err + } + + io.Copy(c, r) + + return nil +} + +func RackParams(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + keys := []string{} + + for k := range s.Parameters { + keys = append(keys, k) + } + + sort.Strings(keys) + + i := c.Info() + + for _, k := range keys { + i.Add(k, s.Parameters[k]) + } + + return i.Print() +} + +func RackParamsSet(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + opts := structs.SystemUpdateOptions{ + Parameters: map[string]string{}, + } + + for _, arg := range c.Args { + parts := strings.SplitN(arg, "=", 2) + + if len(parts) != 2 { + return fmt.Errorf("Key=Value expected: %s", arg) + } + + opts.Parameters[parts[0]] = parts[1] + } + + c.Startf("Updating parameters") + + if s.Version <= "20180708231844" { + if err := rack.AppParametersSet(s.Name, opts.Parameters); err != nil { + return err + } + } else { + if err := rack.SystemUpdate(opts); err != nil { + return err + } + } + + if c.Bool("wait") { + c.Writef("\n") + + if err := common.WaitForRackWithLogs(rack, c); err != nil { + return err + } + } + + return c.OK() +} + +func RackPs(rack sdk.Interface, c *stdcli.Context) error { + var opts structs.SystemProcessesOptions + + if err := c.Options(&opts); err != nil { + return err + } + + ps, err := rack.SystemProcesses(opts) + if err != nil { + return err + } + + t := c.Table("ID", "APP", "SERVICE", "STATUS", "RELEASE", "STARTED", "COMMAND") + + for _, p := range ps { + t.AddRow(p.Id, p.App, p.Name, p.Status, p.Release, common.Ago(p.Started), p.Command) + } + + return t.Print() +} + +func RackReleases(rack sdk.Interface, c *stdcli.Context) error { + rs, err := rack.SystemReleases() + if err != nil { + return err + } + + t := c.Table("VERSION", "UPDATED") + + for _, r := range rs { + t.AddRow(r.Id, common.Ago(r.Created)) + } + + return t.Print() +} + +func RackScale(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + var opts structs.SystemUpdateOptions + update := false + + if v, ok := c.Value("count").(int); ok { + opts.Count = options.Int(v) + update = true + } + + if v, ok := c.Value("type").(string); ok { + opts.Type = options.String(v) + update = true + } + + if update { + c.Startf("Scaling rack") + + if err := rack.SystemUpdate(opts); err != nil { + return err + } + + return c.OK() + } + + i := c.Info() + + i.Add("Autoscale", s.Parameters["Autoscale"]) + i.Add("Count", fmt.Sprintf("%d", s.Count)) + i.Add("Status", s.Status) + i.Add("Type", s.Type) + + return i.Print() +} + +func RackUpdate(rack sdk.Interface, c *stdcli.Context) error { + target := c.Arg(0) + + // if no version specified, find the next version + if target == "" { + s, err := rack.SystemGet() + if err != nil { + return err + } + + if s.Version == "dev" { + target = "dev" + } else { + v, err := cv.Next(s.Version) + if err != nil { + return err + } + + target = v + } + } + + c.Startf("Updating to %s", target) + + if err := rack.SystemUpdate(structs.SystemUpdateOptions{Version: options.String(target)}); err != nil { + return err + } + + if c.Bool("wait") { + c.Writef("\n") + + if err := common.WaitForRackWithLogs(rack, c); err != nil { + return err + } + } + + return c.OK() +} + +func RackWait(rack sdk.Interface, c *stdcli.Context) error { + c.Startf("Waiting for rack") + + c.Writef("\n") + + if err := common.WaitForRackWithLogs(rack, c); err != nil { + return err + } + + return c.OK() +} diff --git a/pkg/cli/rack_test.go b/pkg/cli/rack_test.go new file mode 100644 index 0000000..5310e1e --- /dev/null +++ b/pkg/cli/rack_test.go @@ -0,0 +1,492 @@ +package cli_test + +import ( + "fmt" + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "net/url" + "path/filepath" + "testing" + "time" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/provider" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestRack(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + + res, err := testExecute(e, "rack", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Name name", + "Provider provider", + "Region region", + "Router domain", + "Status running", + "Version 21000101000000", + }) + }) +} + +func TestRackError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackInternal(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemInternal(), nil) + + res, err := testExecute(e, "rack", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Name name", + "Provider provider", + "Region region", + "Router domain (external)", + " domain-internal (internal)", + "Status running", + "Version 20180901000000", + }) + }) +} + +func TestRackInstall(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/auth", r.URL.Path) + user, pass, _ := r.BasicAuth() + require.Equal(t, "convox", user) + require.Equal(t, "password", pass) + })) + + tsu, err := url.Parse(ts.URL) + require.NoError(t, err) + + opts := structs.SystemInstallOptions{ + Name: options.String("foo"), + Parameters: map[string]string{}, + Version: options.String("bar"), + } + provider.Mock.On("SystemInstall", mock.Anything, opts).Once().Return(fmt.Sprintf("https://convox:password@%s", tsu.Host), nil).Run(func(args mock.Arguments) { + w := args.Get(0).(io.Writer) + fmt.Fprintf(w, "line1\n") + fmt.Fprintf(w, "line2\n") + }) + + res, err := testExecute(e, "rack install test -n foo -v bar", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "line1", + "line2", + }) + + data, err := ioutil.ReadFile(filepath.Join(e.Settings, "auth")) + require.NoError(t, err) + require.Equal(t, fmt.Sprintf("{\n \"%s\": \"password\"\n}", tsu.Host), string(data)) + + data, err = ioutil.ReadFile(filepath.Join(e.Settings, "host")) + require.NoError(t, err) + require.Equal(t, tsu.Host, string(data)) + }) +} + +func TestRackInstallError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.SystemInstallOptions{ + Name: options.String("foo"), + Parameters: map[string]string{}, + Version: options.String("bar"), + } + provider.Mock.On("SystemInstall", mock.Anything, opts).Return("", fmt.Errorf("err1")) + + res, err := testExecute(e, "rack install test -n foo -v bar", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackLogs(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemLogs", structs.LogsOptions{Prefix: options.Bool(true)}).Return(testLogs(fxLogs()), nil) + + res, err := testExecute(e, "rack logs", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + fxLogs()[0], + fxLogs()[1], + }) + }) +} + +func TestRackLogsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemLogs", structs.LogsOptions{Prefix: options.Bool(true)}).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack logs", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackParams(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + + res, err := testExecute(e, "rack params", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Autoscale Yes", + "ParamFoo value1", + "ParamOther value2", + }) + }) +} + +func TestRackParamsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack params", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackParamsSet(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.SystemUpdateOptions{ + Parameters: map[string]string{ + "Foo": "bar", + "Baz": "qux", + }, + } + i.On("SystemUpdate", opts).Return(nil) + + res, err := testExecute(e, "rack params set Foo=bar Baz=qux", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Updating parameters... OK"}) + }) +} + +func TestRackParamsSetError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.SystemUpdateOptions{ + Parameters: map[string]string{ + "Foo": "bar", + "Baz": "qux", + }, + } + i.On("SystemUpdate", opts).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "rack params set Foo=bar Baz=qux", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Updating parameters... "}) + }) +} + +func TestRackParamsSetClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("AppParametersSet", "name", map[string]string{"Foo": "bar", "Baz": "qux"}).Return(nil) + + res, err := testExecute(e, "rack params set Foo=bar Baz=qux", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Updating parameters... OK"}) + }) +} + +func TestRackParamsSetClassicError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("AppParametersSet", "name", map[string]string{"Foo": "bar", "Baz": "qux"}).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "rack params set Foo=bar Baz=qux", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Updating parameters... "}) + }) +} + +func TestRackPs(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemProcesses", structs.SystemProcessesOptions{}).Return(structs.Processes{*fxProcess(), *fxProcessPending()}, nil) + + res, err := testExecute(e, "rack ps", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ID APP SERVICE STATUS RELEASE STARTED COMMAND", + "pid1 app1 name running release1 2 days ago command", + "pid1 app1 name pending release1 2 days ago command", + }) + }) +} + +func TestRackPsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemProcesses", structs.SystemProcessesOptions{}).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack ps", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackPsAll(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemProcesses", structs.SystemProcessesOptions{All: options.Bool(true)}).Return(structs.Processes{*fxProcess(), *fxProcessPending()}, nil) + + res, err := testExecute(e, "rack ps -a", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ID APP SERVICE STATUS RELEASE STARTED COMMAND", + "pid1 app1 name running release1 2 days ago command", + "pid1 app1 name pending release1 2 days ago command", + }) + }) +} + +func TestRackReleases(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemReleases").Return(structs.Releases{*fxRelease(), *fxRelease()}, nil) + + res, err := testExecute(e, "rack releases", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "VERSION UPDATED ", + "release1 2 days ago", + "release1 2 days ago", + }) + }) +} + +func TestRackReleasesError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemReleases").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack releases", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackScale(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + + res, err := testExecute(e, "rack scale", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Autoscale Yes", + "Count 1", + "Status running", + "Type type", + }) + }) +} + +func TestRackScaleError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack scale", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackScaleUpdate(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemUpdate", structs.SystemUpdateOptions{Count: options.Int(5), Type: options.String("type1")}).Return(nil) + + res, err := testExecute(e, "rack scale -c 5 -t type1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Scaling rack... OK"}) + }) +} + +func TestRackScaleUpdateError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemUpdate", structs.SystemUpdateOptions{Count: options.Int(5), Type: options.String("type1")}).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "rack scale -c 5 -t type1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Scaling rack... "}) + }) +} + +func TestRackUninstall(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.SystemUninstallOptions{ + Force: options.Bool(true), + } + provider.Mock.On("SystemUninstall", "foo", mock.Anything, opts).Once().Return(nil).Run(func(args mock.Arguments) { + w := args.Get(1).(io.Writer) + fmt.Fprintf(w, "line1\n") + fmt.Fprintf(w, "line2\n") + }) + + res, err := testExecute(e, "rack uninstall test foo --force", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "line1", + "line2", + }) + }) +} + +func TestRackUninstallError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.SystemUninstallOptions{ + Force: options.Bool(true), + } + provider.Mock.On("SystemUninstall", "foo", mock.Anything, opts).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "rack uninstall test foo --force", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackUninstallWithoutForce(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + res, err := testExecute(e, "rack uninstall test foo", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: must use --force for non-interactive uninstall"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackUpdate(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemUpdate", structs.SystemUpdateOptions{Version: options.String("version1")}).Return(nil) + + res, err := testExecute(e, "rack update version1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Updating to version1... OK"}) + }) +} + +func TestRackUpdateError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemUpdate", structs.SystemUpdateOptions{Version: options.String("version1")}).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "rack update version1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Updating to version1... "}) + }) +} + +func TestRackWait(t *testing.T) { + testClientWait(t, 100*time.Millisecond, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.LogsOptions{ + Prefix: options.Bool(true), + Since: options.Duration(5 * time.Second), + } + i.On("SystemLogs", opts).Return(testLogs(fxLogsSystem()), nil).Once() + i.On("SystemGet").Return(&structs.System{Status: "updating"}, nil).Twice() + i.On("SystemGet").Return(fxSystem(), nil) + + res, err := testExecute(e, "rack wait", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Waiting for rack... ", + fxLogsSystem()[0], + fxLogsSystem()[1], + "OK", + }) + }) +} + +func TestRackWaitError(t *testing.T) { + testClientWait(t, 100*time.Millisecond, func(e *cli.Engine, i *mocksdk.Interface) { + opts := structs.LogsOptions{ + Prefix: options.Bool(true), + Since: options.Duration(5 * time.Second), + } + i.On("SystemLogs", opts).Return(testLogs(fxLogsSystem()), nil).Once() + i.On("SystemGet").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack wait", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{ + "Waiting for rack... ", + fxLogsSystem()[0], + fxLogsSystem()[1], + }) + }) +} diff --git a/pkg/cli/racks.go b/pkg/cli/racks.go new file mode 100644 index 0000000..c2aadba --- /dev/null +++ b/pkg/cli/racks.go @@ -0,0 +1,27 @@ +package cli + +import ( + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("racks", "list available racks", Racks, stdcli.CommandOptions{ + Validate: stdcli.Args(0), + }) +} + +func Racks(rack sdk.Interface, c *stdcli.Context) error { + rs, err := racks(c) + if err != nil { + return err + } + + t := c.Table("NAME", "STATUS") + + for _, r := range rs { + t.AddRow(r.Name, r.Status) + } + + return t.Print() +} diff --git a/pkg/cli/racks_test.go b/pkg/cli/racks_test.go new file mode 100644 index 0000000..1938ebf --- /dev/null +++ b/pkg/cli/racks_test.go @@ -0,0 +1,127 @@ +package cli_test + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "net/url" + "os" + "path/filepath" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + mockstdcli "github.com/convox/convox/pkg/mock/stdcli" + "github.com/gorilla/mux" + "github.com/stretchr/testify/require" +) + +func TestRacks(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + r := mux.NewRouter() + + r.HandleFunc("/racks", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(`[ + {"name":"foo","organization":{"name":"test"},"status":"running"}, + {"name":"other","organization":{"name":"test"},"status":"updating"} + ]`)) + }).Methods("GET") + + ts := httptest.NewTLSServer(r) + + tsu, err := url.Parse(ts.URL) + require.NoError(t, err) + + err = ioutil.WriteFile(filepath.Join(e.Settings, "host"), []byte(tsu.Host), 0644) + require.NoError(t, err) + + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte("namespace/dev\n"), nil) + e.Executor = me + + res, err := testExecute(e, "racks", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "NAME STATUS ", + "local/dev running ", + "test/foo running ", + "test/other updating", + }) + + me.AssertExpectations(t) + }) +} + +func TestRacksLocalDisable(t *testing.T) { + orig := os.Getenv("CONVOX_LOCAL") + os.Setenv("CONVOX_LOCAL", "disable") + defer os.Setenv("CONVOX_LOCAL", orig) + + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + r := mux.NewRouter() + + r.HandleFunc("/racks", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(`[ + {"name":"foo","organization":{"name":"test"},"status":"running"}, + {"name":"other","organization":{"name":"test"},"status":"updating"} + ]`)) + }).Methods("GET") + + ts := httptest.NewTLSServer(r) + + tsu, err := url.Parse(ts.URL) + require.NoError(t, err) + + err = ioutil.WriteFile(filepath.Join(e.Settings, "host"), []byte(tsu.Host), 0644) + require.NoError(t, err) + + me := &mockstdcli.Executor{} + e.Executor = me + + res, err := testExecute(e, "racks", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "NAME STATUS ", + "test/foo running ", + "test/other updating", + }) + + me.AssertExpectations(t) + }) +} + +func TestRacksError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + r := mux.NewRouter() + + r.HandleFunc("/racks", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(500) + w.Write([]byte("test")) + }).Methods("GET") + + ts := httptest.NewTLSServer(r) + + tsu, err := url.Parse(ts.URL) + require.NoError(t, err) + + err = ioutil.WriteFile(filepath.Join(e.Settings, "host"), []byte(tsu.Host), 0644) + require.NoError(t, err) + + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return(nil, fmt.Errorf("err1")) + e.Executor = me + + res, err := testExecute(e, "racks", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "NAME STATUS", + }) + }) +} diff --git a/pkg/cli/registries.go b/pkg/cli/registries.go new file mode 100644 index 0000000..46328f6 --- /dev/null +++ b/pkg/cli/registries.go @@ -0,0 +1,70 @@ +package cli + +import ( + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("registries", "list private registries", Registries, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.Args(0), + }) + + register("registries add", "add a private registry", RegistriesAdd, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Usage: " ", + Validate: stdcli.Args(3), + }) + + register("registries remove", "remove private registry", RegistriesRemove, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.Args(1), + }) +} + +func Registries(rack sdk.Interface, c *stdcli.Context) error { + rs, err := rack.RegistryList() + if err != nil { + return err + } + + t := c.Table("SERVER", "USERNAME") + + for _, r := range rs { + t.AddRow(r.Server, r.Username) + } + + return t.Print() +} + +func RegistriesAdd(rack sdk.Interface, c *stdcli.Context) error { + c.Startf("Adding registry") + + if _, err := rack.RegistryAdd(c.Arg(0), c.Arg(1), c.Arg(2)); err != nil { + return err + } + + return c.OK() +} + +func RegistriesRemove(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + c.Startf("Removing registry") + + if s.Version <= "20180708231844" { + if err := rack.RegistryRemoveClassic(c.Arg(0)); err != nil { + return err + } + } else { + if err := rack.RegistryRemove(c.Arg(0)); err != nil { + return err + } + } + + return c.OK() +} diff --git a/pkg/cli/registries_test.go b/pkg/cli/registries_test.go new file mode 100644 index 0000000..9cc7edd --- /dev/null +++ b/pkg/cli/registries_test.go @@ -0,0 +1,102 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/require" +) + +func TestRegistries(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("RegistryList").Return(structs.Registries{*fxRegistry(), *fxRegistry()}, nil) + + res, err := testExecute(e, "registries", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "SERVER USERNAME", + "registry1 username", + "registry1 username", + }) + }) +} + +func TestRegistriesError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("RegistryList").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "registries", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRegistriesAdd(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("RegistryAdd", "foo", "bar", "baz").Return(fxRegistry(), nil) + + res, err := testExecute(e, "registries add foo bar baz", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Adding registry... OK"}) + }) +} + +func TestRegistriesAddError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("RegistryAdd", "foo", "bar", "baz").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "registries add foo bar baz", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Adding registry... "}) + }) +} + +func TestRegistriesRemove(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("RegistryRemove", "foo").Return(nil) + + res, err := testExecute(e, "registries remove foo", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Removing registry... OK"}) + }) +} + +func TestRegistriesRemoveError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("RegistryRemove", "foo").Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "registries remove foo", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Removing registry... "}) + }) +} + +func TestRegistriesRemoveClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("RegistryRemoveClassic", "foo").Return(nil) + + res, err := testExecute(e, "registries remove foo", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Removing registry... OK"}) + }) +} diff --git a/pkg/cli/releases.go b/pkg/cli/releases.go new file mode 100644 index 0000000..469cf9b --- /dev/null +++ b/pkg/cli/releases.go @@ -0,0 +1,234 @@ +package cli + +import ( + "fmt" + "io" + "strings" + "time" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("releases", "list releases for an app", Releases, stdcli.CommandOptions{ + Flags: append(stdcli.OptionFlags(structs.ReleaseListOptions{}), flagRack, flagApp), + Validate: stdcli.Args(0), + }) + + register("releases info", "get information about a release", ReleasesInfo, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Validate: stdcli.Args(1), + }) + + register("releases manifest", "get manifest for a release", ReleasesManifest, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Validate: stdcli.Args(1), + }) + + register("releases promote", "promote a release", ReleasesPromote, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack, flagWait}, + Validate: stdcli.ArgsMax(1), + }) + + register("releases rollback", "copy an old release forward and promote it", ReleasesRollback, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagId, flagRack, flagWait}, + Validate: stdcli.Args(1), + }) +} + +func Releases(rack sdk.Interface, c *stdcli.Context) error { + var opts structs.ReleaseListOptions + + if err := c.Options(&opts); err != nil { + return err + } + + a, err := rack.AppGet(app(c)) + if err != nil { + return err + } + + rs, err := rack.ReleaseList(app(c), opts) + if err != nil { + return err + } + + t := c.Table("ID", "STATUS", "BUILD", "CREATED", "DESCRIPTION") + + for _, r := range rs { + status := "" + + if a.Release == r.Id { + status = "active" + } + + t.AddRow(r.Id, status, r.Build, common.Ago(r.Created), r.Description) + } + + return t.Print() +} + +func ReleasesInfo(rack sdk.Interface, c *stdcli.Context) error { + r, err := rack.ReleaseGet(app(c), c.Arg(0)) + if err != nil { + return err + } + + i := c.Info() + + i.Add("Id", r.Id) + i.Add("Build", r.Build) + i.Add("Created", r.Created.Format(time.RFC3339)) + i.Add("Description", r.Description) + i.Add("Env", r.Env) + + return i.Print() +} + +func ReleasesManifest(rack sdk.Interface, c *stdcli.Context) error { + release := c.Arg(0) + + r, err := rack.ReleaseGet(app(c), release) + if err != nil { + return err + } + + if r.Build == "" { + return fmt.Errorf("no build for release: %s", release) + } + + b, err := rack.BuildGet(app(c), r.Build) + if err != nil { + return err + } + + fmt.Fprintf(c, "%s\n", strings.TrimSpace(b.Manifest)) + + return nil +} + +func ReleasesPromote(rack sdk.Interface, c *stdcli.Context) error { + release := c.Arg(0) + + if release == "" { + rs, err := rack.ReleaseList(app(c), structs.ReleaseListOptions{Limit: options.Int(1)}) + if err != nil { + return err + } + + if len(rs) == 0 { + return fmt.Errorf("no releases to promote") + } + + release = rs[0].Id + } + + return releasePromote(rack, c, app(c), release) +} + +func releasePromote(rack sdk.Interface, c *stdcli.Context, app, id string) error { + if id == "" { + return fmt.Errorf("no release to promote") + } + + a, err := rack.AppGet(app) + if err != nil { + return err + } + + if a.Status != "running" { + c.Startf("Waiting for app to be ready") + + if err := common.WaitForAppRunning(rack, app); err != nil { + return err + } + + c.OK() + } + + c.Startf("Promoting %s", id) + + if err := rack.ReleasePromote(app, id, structs.ReleasePromoteOptions{}); err != nil { + return err + } + + if c.Bool("wait") { + c.Writef("\n") + + if err := common.WaitForAppWithLogs(rack, c, app); err != nil { + return err + } + + a, err = rack.AppGet(app) + if err != nil { + return err + } + + if a.Release != id { + return fmt.Errorf("rollback") + } + } + + return c.OK() +} + +func ReleasesRollback(rack sdk.Interface, c *stdcli.Context) error { + var stdout io.Writer + + if c.Bool("id") { + stdout = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + release := c.Arg(0) + + c.Startf("Rolling back to %s", release) + + ro, err := rack.ReleaseGet(app(c), release) + if err != nil { + return err + } + + rn, err := rack.ReleaseCreate(app(c), structs.ReleaseCreateOptions{ + Build: options.String(ro.Build), + Env: options.String(ro.Env), + }) + if err != nil { + return err + } + + c.OK(rn.Id) + + c.Startf("Promoting %s", rn.Id) + + if err := rack.ReleasePromote(app(c), rn.Id, structs.ReleasePromoteOptions{}); err != nil { + return err + } + + if c.Bool("wait") { + c.Writef("\n") + + if err := common.WaitForAppWithLogs(rack, c, app(c)); err != nil { + return err + } + + a, err := rack.AppGet(app(c)) + if err != nil { + return err + } + + if a.Release != rn.Id { + return fmt.Errorf("rollback") + } + } + + if c.Bool("id") { + fmt.Fprintf(stdout, rn.Id) + } + + return c.OK() +} diff --git a/pkg/cli/releases_test.go b/pkg/cli/releases_test.go new file mode 100644 index 0000000..67db557 --- /dev/null +++ b/pkg/cli/releases_test.go @@ -0,0 +1,192 @@ +package cli_test + +import ( + "fmt" + "testing" + "time" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/require" +) + +func TestReleases(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxApp(), nil) + i.On("ReleaseList", "app1", structs.ReleaseListOptions{}).Return(structs.Releases{*fxRelease(), *fxRelease2()}, nil) + + res, err := testExecute(e, "releases -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ID STATUS BUILD CREATED DESCRIPTION ", + "release1 active build1 2 days ago description1", + "release2 build1 2 days ago ", + }) + }) +} + +func TestReleasesError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxApp(), nil) + i.On("ReleaseList", "app1", structs.ReleaseListOptions{}).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "releases -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestReleasesInfo(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + + res, err := testExecute(e, "releases info release1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Id release1", + "Build build1", + fmt.Sprintf("Created %s", fxRelease().Created.Format(time.RFC3339)), + "Description description1", + "Env FOO=bar", + " BAZ=quux", + }) + }) +} + +func TestReleasesInfoError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ReleaseGet", "app1", "release1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "releases info release1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestReleasesManifest(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + i.On("BuildGet", "app1", "build1").Return(fxBuild(), nil) + + res, err := testExecute(e, "releases manifest release1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "manifest1", + "manifest2", + }) + }) +} + +func TestReleasesManifestError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ReleaseGet", "app1", "release1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "releases manifest release1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestReleasesPromote(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxApp(), nil) + i.On("ReleasePromote", "app1", "release1", structs.ReleasePromoteOptions{}).Return(nil) + + res, err := testExecute(e, "releases promote release1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Promoting release1... OK"}) + }) +} + +func TestReleasesPromoteError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxApp(), nil) + i.On("ReleasePromote", "app1", "release1", structs.ReleasePromoteOptions{}).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "releases promote release1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Promoting release1... "}) + }) +} + +func TestReleasesPromoteAlreadyUpdating(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxAppUpdating(), nil).Twice() + i.On("AppGet", "app1").Return(fxApp(), nil) + i.On("ReleasePromote", "app1", "release1", structs.ReleasePromoteOptions{}).Return(nil) + + res, err := testExecute(e, "releases promote release1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Waiting for app to be ready... OK", + "Promoting release1... OK", + }) + }) +} + +func TestReleasesRollback(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ReleaseGet", "app1", "release2").Return(fxRelease2(), nil) + i.On("ReleaseCreate", "app1", structs.ReleaseCreateOptions{Build: options.String(fxRelease2().Build), Env: options.String(fxRelease2().Env)}).Return(fxRelease3(), nil) + i.On("ReleasePromote", "app1", "release3", structs.ReleasePromoteOptions{}).Return(nil) + + res, err := testExecute(e, "releases rollback release2 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Rolling back to release2... OK, release3", + "Promoting release3... OK", + }) + }) +} + +func TestReleasesRollbackErrorCreate(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ReleaseGet", "app1", "release2").Return(fxRelease2(), nil) + i.On("ReleaseCreate", "app1", structs.ReleaseCreateOptions{Build: options.String(fxRelease2().Build), Env: options.String(fxRelease2().Env)}).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "releases rollback release2 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Rolling back to release2... "}) + }) +} + +func TestReleasesRollbackErrorPromote(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ReleaseGet", "app1", "release2").Return(fxRelease2(), nil) + i.On("ReleaseCreate", "app1", structs.ReleaseCreateOptions{Build: options.String(fxRelease2().Build), Env: options.String(fxRelease2().Env)}).Return(fxRelease3(), nil) + i.On("ReleasePromote", "app1", "release3", structs.ReleasePromoteOptions{}).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "releases rollback release2 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{ + "Rolling back to release2... OK, release3", + "Promoting release3... ", + }) + }) +} diff --git a/pkg/cli/resources.go b/pkg/cli/resources.go new file mode 100644 index 0000000..7d412d9 --- /dev/null +++ b/pkg/cli/resources.go @@ -0,0 +1,770 @@ +package cli + +import ( + "fmt" + "io" + "net/url" + "os" + "sort" + "strconv" + "strings" + + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("resources", "list resources", Resources, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Validate: stdcli.Args(0), + }) + + register("resources console", "start a console for a resource", ResourcesConsole, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("resources export", "export data from a resource", ResourcesExport, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagRack, + flagApp, + stdcli.StringFlag("file", "f", "export to file"), + }, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("resources import", "import data to a resource", ResourcesImport, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagRack, + flagApp, + stdcli.StringFlag("file", "f", "import from a file"), + }, + Validate: stdcli.Args(1), + }) + + register("resources info", "get information about a resource", ResourcesInfo, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("resources proxy", "proxy a local port to a resource", ResourcesProxy, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagRack, + flagApp, + stdcli.IntFlag("port", "p", "local port"), + stdcli.BoolFlag("tls", "t", "wrap connection in tls"), + }, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("resources url", "get url for a resource", ResourcesUrl, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("rack resources", "list resources", RackResources, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Invisible: true, + Validate: stdcli.Args(0), + }) + + register("rack resources create", "create a resource", RackResourcesCreate, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagRack, + flagWait, + stdcli.StringFlag("name", "n", "resource name"), + }, + Invisible: true, + Usage: " [Option=Value]...", + Validate: stdcli.ArgsMin(1), + }) + + register("rack resources delete", "delete a resource", RackResourcesDelete, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagWait}, + Invisible: true, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("rack resources info", "get information about a resource", RackResourcesInfo, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Invisible: true, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("rack resources link", "link a resource to an app", RackResourcesLink, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack, flagWait}, + Invisible: true, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("rack resources options", "list options for a resource type", RackResourcesOptions, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Invisible: true, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("rack resources proxy", "proxy a local port to a rack resource", RackResourcesProxy, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagRack, + stdcli.IntFlag("port", "p", "local port"), + stdcli.BoolFlag("tls", "t", "wrap connection in tls"), + }, + Invisible: true, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("rack resources types", "list resource types", RackResourcesTypes, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Invisible: true, + Validate: stdcli.Args(0), + }) + + register("rack resources update", "update resource options", RackResourcesUpdate, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagWait}, + Invisible: true, + Usage: " [Option=Value]...", + Validate: stdcli.ArgsMin(1), + }) + + register("rack resources unlink", "unlink a resource from an app", RackResourcesUnlink, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack, flagWait}, + Invisible: true, + Usage: "", + Validate: stdcli.Args(1), + }) + + register("rack resources url", "get url for a resource", RackResourcesUrl, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Invisible: true, + Usage: "", + Validate: stdcli.Args(1), + }) +} + +func Resources(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + if s.Version <= "20190111211123" { + return fmt.Errorf("command unavailable, please upgrade this rack") + } + + rs, err := rack.ResourceList(app(c)) + if err != nil { + return err + } + + t := c.Table("NAME", "TYPE", "URL") + + for _, r := range rs { + t.AddRow(r.Name, r.Type, r.Url) + } + + return t.Print() +} + +func ResourcesConsole(rack sdk.Interface, c *stdcli.Context) error { + opts := structs.ResourceConsoleOptions{} + + if w, h, err := c.TerminalSize(); err == nil { + opts.Height = options.Int(h) + opts.Width = options.Int(w) + } + + fmt.Printf("opts: %+v\n", opts) + + restore := c.TerminalRaw() + defer restore() + + if err := rack.ResourceConsole(app(c), c.Arg(0), c, opts); err != nil { + return err + } + + return nil +} + +func ResourcesExport(rack sdk.Interface, c *stdcli.Context) error { + var w io.Writer + + if file := c.String("file"); file != "" { + f, err := os.Create(file) + if err != nil { + return err + } + defer f.Close() + w = f + } else { + w = c.Writer().Stdout + c.Writer().Stdout = c.Writer().Stderr + } + + r, err := rack.ResourceExport(app(c), c.Arg(0)) + if err != nil { + return err + } + + if _, err := io.Copy(w, r); err != nil { + return err + } + + return nil +} + +func ResourcesImport(rack sdk.Interface, c *stdcli.Context) error { + var r io.Reader + + if file := c.String("file"); file != "" { + f, err := os.Open(file) + if err != nil { + return err + } + defer f.Close() + r = f + } else { + r = c.Reader() + } + + c.Startf("Importing data") + + if err := rack.ResourceImport(app(c), c.Arg(0), r); err != nil { + return err + } + + return c.OK() +} + +func ResourcesInfo(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + if s.Version <= "20190111211123" { + return fmt.Errorf("command unavailable, please upgrade this rack") + } + + r, err := rack.ResourceGet(app(c), c.Arg(0)) + if err != nil { + return err + } + + i := c.Info() + + i.Add("Name", r.Name) + i.Add("Type", r.Type) + + if r.Url != "" { + i.Add("URL", r.Url) + } + + return i.Print() +} + +func ResourcesProxy(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + if s.Version <= "20190111211123" { + return fmt.Errorf("command unavailable, please upgrade this rack") + } + + r, err := rack.ResourceGet(app(c), c.Arg(0)) + if err != nil { + return err + } + + if r.Url == "" { + return fmt.Errorf("no url for resource: %s", r.Name) + } + + u, err := url.Parse(r.Url) + if err != nil { + return err + } + + remotehost := u.Hostname() + remoteport := u.Port() + + if remoteport == "" { + switch u.Scheme { + case "http": + remoteport = "80" + case "https": + remoteport = "443" + default: + return fmt.Errorf("unknown port for url: %s", r.Url) + } + } + + rpi, err := strconv.Atoi(remoteport) + if err != nil { + return err + } + + port := rpi + + if p := c.Int("port"); p != 0 { + port = p + } + + go proxy(rack, c, port, remotehost, rpi, c.Bool("tls")) + + <-c.Done() + + return nil +} + +func ResourcesUrl(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + if s.Version <= "20190111211123" { + return fmt.Errorf("command unavailable, please upgrade this rack") + } + + r, err := rack.ResourceGet(app(c), c.Arg(0)) + if err != nil { + return err + } + + if r.Url == "" { + return fmt.Errorf("no url for resource: %s", r.Name) + } + + fmt.Fprintf(c, "%s\n", r.Url) + + return nil +} + +func RackResources(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + var rs structs.Resources + + if s.Version <= "20190111211123" { + rs, err = rack.SystemResourceListClassic() + } else { + rs, err = rack.SystemResourceList() + } + if err != nil { + return err + } + + t := c.Table("NAME", "TYPE", "STATUS") + + for _, r := range rs { + t.AddRow(r.Name, r.Type, r.Status) + } + + return t.Print() +} + +func RackResourcesCreate(rack sdk.Interface, c *stdcli.Context) error { + var opts structs.ResourceCreateOptions + + if err := c.Options(&opts); err != nil { + return err + } + + if v := c.String("name"); v != "" { + opts.Name = options.String(v) + } + + opts.Parameters = map[string]string{} + + for _, arg := range c.Args[1:] { + parts := strings.SplitN(arg, "=", 2) + + if len(parts) != 2 { + return fmt.Errorf("Name=Value expected: %s", arg) + } + + opts.Parameters[parts[0]] = parts[1] + } + + c.Startf("Creating resource") + + s, err := rack.SystemGet() + if err != nil { + return err + } + + var r *structs.Resource + + if s.Version <= "20180708231844" { + r, err = rack.ResourceCreateClassic(c.Arg(0), opts) + } else if s.Version <= "20190111211123" { + r, err = rack.SystemResourceCreateClassic(c.Arg(0), opts) + } else { + r, err = rack.SystemResourceCreate(c.Arg(0), opts) + } + if err != nil { + return err + } + + if c.Bool("wait") { + if err := waitForResourceRunning(rack, c, r.Name); err != nil { + return err + } + } + + return c.OK(r.Name) +} + +func RackResourcesDelete(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + c.Startf("Deleting resource") + + if s.Version <= "20190111211123" { + err = rack.SystemResourceDeleteClassic(c.Arg(0)) + } else { + err = rack.SystemResourceDelete(c.Arg(0)) + } + if err != nil { + return err + } + + if c.Bool("wait") { + if err := waitForResourceDeleted(rack, c, c.Arg(0)); err != nil { + return err + } + } + + return c.OK() +} + +func RackResourcesInfo(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + var r *structs.Resource + + if s.Version <= "20190111211123" { + r, err = rack.SystemResourceGetClassic(c.Arg(0)) + } else { + r, err = rack.SystemResourceGet(c.Arg(0)) + } + if err != nil { + return err + } + + // fmt.Printf("r = %+v\n", r) + + i := c.Info() + + apps := []string{} + + for _, a := range r.Apps { + apps = append(apps, a.Name) + } + + sort.Strings(apps) + + options := []string{} + + for k, v := range r.Parameters { + options = append(options, fmt.Sprintf("%s=%s", k, v)) + } + + sort.Strings(options) + + i.Add("Name", r.Name) + i.Add("Type", r.Type) + i.Add("Status", r.Status) + i.Add("Options", strings.Join(options, "\n")) + + if r.Url != "" { + i.Add("URL", r.Url) + } + + if len(apps) > 0 { + i.Add("Apps", strings.Join(apps, ", ")) + } + + return i.Print() +} + +func RackResourcesLink(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + c.Startf("Linking to %s", app(c)) + + resource := c.Arg(0) + + if s.Version <= "20190111211123" { + _, err = rack.SystemResourceLinkClassic(resource, app(c)) + } else { + _, err = rack.SystemResourceLink(resource, app(c)) + } + if err != nil { + return err + } + + if c.Bool("wait") { + if err := waitForResourceRunning(rack, c, resource); err != nil { + return err + } + } + + return c.OK() +} + +func RackResourcesOptions(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + var rts structs.ResourceTypes + + if s.Version <= "20190111211123" { + rts, err = rack.SystemResourceTypesClassic() + } else { + rts, err = rack.SystemResourceTypes() + } + if err != nil { + return err + } + + var rt *structs.ResourceType + + for _, t := range rts { + if t.Name == c.Arg(0) { + rt = &t + break + } + } + + if rt == nil { + return fmt.Errorf("no such resource type: %s", c.Arg(0)) + } + + t := c.Table("NAME", "DEFAULT", "DESCRIPTION") + + sort.Slice(rt.Parameters, rt.Parameters.Less) + + for _, p := range rt.Parameters { + t.AddRow(p.Name, p.Default, p.Description) + } + + return t.Print() +} + +func RackResourcesProxy(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + var r *structs.Resource + + if s.Version <= "20190111211123" { + r, err = rack.SystemResourceGetClassic(c.Arg(0)) + } else { + r, err = rack.SystemResourceGet(c.Arg(0)) + } + if err != nil { + return err + } + + if r.Url == "" { + return fmt.Errorf("no url for resource: %s", r.Name) + } + + u, err := url.Parse(r.Url) + if err != nil { + return err + } + + remotehost := u.Hostname() + remoteport := u.Port() + + if remoteport == "" { + switch u.Scheme { + case "http": + remoteport = "80" + case "https": + remoteport = "443" + default: + return fmt.Errorf("unknown port for url: %s", r.Url) + } + } + + rpi, err := strconv.Atoi(remoteport) + if err != nil { + return err + } + + port := rpi + + if p := c.Int("port"); p != 0 { + port = p + } + + go proxy(rack, c, port, remotehost, rpi, c.Bool("tls")) + + <-c.Done() + + return nil +} + +func RackResourcesTypes(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + var rts structs.ResourceTypes + + if s.Version <= "20190111211123" { + rts, err = rack.SystemResourceTypesClassic() + } else { + rts, err = rack.SystemResourceTypes() + } + if err != nil { + return err + } + + t := c.Table("TYPE") + + for _, rt := range rts { + t.AddRow(rt.Name) + } + + return t.Print() +} + +func RackResourcesUnlink(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + c.Startf("Unlinking from %s", app(c)) + + resource := c.Arg(0) + + if s.Version <= "20190111211123" { + _, err = rack.SystemResourceUnlinkClassic(resource, app(c)) + } else { + _, err = rack.SystemResourceUnlink(resource, app(c)) + } + if err != nil { + return err + } + + if c.Bool("wait") { + if err := waitForResourceRunning(rack, c, resource); err != nil { + return err + } + } + + return c.OK() +} + +func RackResourcesUpdate(rack sdk.Interface, c *stdcli.Context) error { + opts := structs.ResourceUpdateOptions{ + Parameters: map[string]string{}, + } + + for _, arg := range c.Args[1:] { + parts := strings.SplitN(arg, "=", 2) + + if len(parts) != 2 { + return fmt.Errorf("Key=Value expected: %s", arg) + } + + opts.Parameters[parts[0]] = parts[1] + } + + c.Startf("Updating resource") + + s, err := rack.SystemGet() + if err != nil { + return err + } + + resource := c.Arg(0) + + if s.Version <= "20180708231844" { + _, err = rack.ResourceUpdateClassic(resource, opts) + } else if s.Version <= "20190111211123" { + _, err = rack.SystemResourceUpdateClassic(resource, opts) + } else { + _, err = rack.SystemResourceUpdate(resource, opts) + } + if err != nil { + return err + } + + if c.Bool("wait") { + if err := waitForResourceRunning(rack, c, resource); err != nil { + return err + } + } + + return c.OK() +} + +func RackResourcesUrl(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + var r *structs.Resource + + if s.Version <= "20190111211123" { + r, err = rack.SystemResourceGetClassic(c.Arg(0)) + } else { + r, err = rack.SystemResourceGet(c.Arg(0)) + } + if err != nil { + return err + } + + if s.Version <= "20180708231844" { + if u := r.Parameters["Url"]; u != "" { + fmt.Fprintf(c, "%s\n", u) + return nil + } + } + + if r.Url == "" { + return fmt.Errorf("no url for resource: %s", r.Name) + } + + fmt.Fprintf(c, "%s\n", r.Url) + + return nil +} diff --git a/pkg/cli/resources_test.go b/pkg/cli/resources_test.go new file mode 100644 index 0000000..b7fef20 --- /dev/null +++ b/pkg/cli/resources_test.go @@ -0,0 +1,541 @@ +package cli_test + +import ( + "context" + "fmt" + "io" + "io/ioutil" + "math/rand" + "net" + "testing" + "time" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestResources(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ResourceList", "app1").Return(structs.Resources{*fxResource(), *fxResource()}, nil) + + res, err := testExecute(e, "resources -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "NAME TYPE URL ", + "resource1 type https://example.org/path", + "resource1 type https://example.org/path", + }) + }) +} + +func TestResourcesError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ResourceList", "app1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "resources -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestResourcesInfo(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ResourceGet", "app1", "resource1").Return(fxResource(), nil) + + res, err := testExecute(e, "resources info resource1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Name resource1", + "Type type", + "URL https://example.org/path", + }) + }) +} + +func TestResourcesInfoError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ResourceGet", "app1", "resource1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "resources info resource1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestResourcesProxy(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + i.On("WithContext", ctx).Return(i) + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ResourceGet", "app1", "resource1").Return(fxResource(), nil) + i.On("Proxy", "example.org", 443, mock.Anything, structs.ProxyOptions{TLS: options.Bool(false)}).Return(nil).Run(func(args mock.Arguments) { + buf := make([]byte, 2) + rwc := args.Get(2).(io.ReadWriteCloser) + n, err := rwc.Read(buf) + require.NoError(t, err) + require.Equal(t, 2, n) + require.Equal(t, "in", string(buf)) + n, err = rwc.Write([]byte("out")) + require.NoError(t, err) + require.Equal(t, 3, n) + rwc.Close() + }) + + port := rand.Intn(30000) + 10000 + + ch := make(chan *result) + + go func() { + res, _ := testExecuteContext(ctx, e, fmt.Sprintf("resources proxy resource1 -a app1 -p %d", port), nil) + ch <- res + }() + + time.Sleep(500 * time.Millisecond) + + cn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port)) + require.NoError(t, err) + + cn.Write([]byte("in")) + + data, err := ioutil.ReadAll(cn) + require.NoError(t, err) + require.Equal(t, "out", string(data)) + + cancel() + + res := <-ch + + require.NotNil(t, res) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + fmt.Sprintf("proxying localhost:%d to example.org:443", port), + fmt.Sprintf("connect: %d", port), + }) + }) +} + +func TestResourcesUrl(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ResourceGet", "app1", "resource1").Return(fxResource(), nil) + + res, err := testExecute(e, "resources url resource1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"https://example.org/path"}) + }) +} + +func TestResourcesUrlError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ResourceGet", "app1", "resource1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "resources url resource1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackResources(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceList").Return(structs.Resources{*fxResource(), *fxResource()}, nil) + + res, err := testExecute(e, "rack resources", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "NAME TYPE STATUS", + "resource1 type status", + "resource1 type status", + }) + }) +} + +func TestRackResourcesError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceList").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack resources", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackResourcesCreate(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.ResourceCreateOptions{Name: options.String("name1"), Parameters: map[string]string{"Foo": "bar", "Baz": "quux"}} + i.On("SystemResourceCreate", "type1", opts).Return(fxResource(), nil) + + res, err := testExecute(e, "rack resources create type1 -n name1 Foo=bar Baz=quux", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Creating resource... OK, resource1"}) + }) +} + +func TestRackResourcesCreateError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.ResourceCreateOptions{Name: options.String("name1"), Parameters: map[string]string{"Foo": "bar", "Baz": "quux"}} + i.On("SystemResourceCreate", "type1", opts).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack resources create type1 -n name1 Foo=bar Baz=quux", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Creating resource... "}) + }) +} + +func TestRackResourcesCreateClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + opts := structs.ResourceCreateOptions{Name: options.String("name1"), Parameters: map[string]string{"Foo": "bar", "Baz": "quux"}} + i.On("ResourceCreateClassic", "type1", opts).Return(fxResource(), nil) + + res, err := testExecute(e, "rack resources create type1 -n name1 Foo=bar Baz=quux", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Creating resource... OK, resource1"}) + }) +} + +func TestRackResourcesDelete(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceDelete", "resource1").Return(nil) + + res, err := testExecute(e, "rack resources delete resource1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Deleting resource... OK"}) + }) +} + +func TestRackResourcesDeleteError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceDelete", "resource1").Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "rack resources delete resource1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Deleting resource... "}) + }) +} + +func TestRackResourcesInfo(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceGet", "resource1").Return(fxResource(), nil) + + res, err := testExecute(e, "rack resources info resource1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Name resource1", + "Type type", + "Status status", + "Options Url=https://other.example.org/path", + " k1=v1", + " k2=v2", + "URL https://example.org/path", + "Apps app1, app1", + }) + }) +} + +func TestRackResourcesInfoError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceGet", "resource1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack resources info resource1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackResourcesLink(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceLink", "resource1", "app1").Return(fxResource(), nil) + + res, err := testExecute(e, "rack resources link resource1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Linking to app1... OK"}) + }) +} + +func TestRackResourcesLinkError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceLink", "resource1", "app1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack resources link resource1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Linking to app1... "}) + }) +} + +func TestRackResourcesOptions(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceTypes").Return(structs.ResourceTypes{fxResourceType()}, nil) + + res, err := testExecute(e, "rack resources options type1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "NAME DEFAULT DESCRIPTION", + "Param1 def1 desc1 ", + "Param2 def2 desc2 ", + }) + }) +} + +func TestRackResourcesOptionsError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceTypes").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack resources options type1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackResourcesProxy(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + i.On("WithContext", ctx).Return(i) + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceGet", "resource1").Return(fxResource(), nil) + i.On("Proxy", "example.org", 443, mock.Anything, structs.ProxyOptions{TLS: options.Bool(false)}).Return(nil).Run(func(args mock.Arguments) { + buf := make([]byte, 2) + rwc := args.Get(2).(io.ReadWriteCloser) + n, err := rwc.Read(buf) + require.NoError(t, err) + require.Equal(t, 2, n) + require.Equal(t, "in", string(buf)) + n, err = rwc.Write([]byte("out")) + require.NoError(t, err) + require.Equal(t, 3, n) + rwc.Close() + }) + + port := rand.Intn(30000) + 10000 + + ch := make(chan *result) + + go func() { + res, _ := testExecuteContext(ctx, e, fmt.Sprintf("rack resources proxy resource1 -p %d", port), nil) + ch <- res + }() + + time.Sleep(500 * time.Millisecond) + + cn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port)) + require.NoError(t, err) + + cn.Write([]byte("in")) + + data, err := ioutil.ReadAll(cn) + require.NoError(t, err) + require.Equal(t, "out", string(data)) + + cancel() + + res := <-ch + + require.NotNil(t, res) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + fmt.Sprintf("proxying localhost:%d to example.org:443", port), + fmt.Sprintf("connect: %d", port), + }) + }) +} + +func TestRackResourcesTypes(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceTypes").Return(structs.ResourceTypes{fxResourceType(), fxResourceType()}, nil) + + res, err := testExecute(e, "rack resources types", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "TYPE ", + "type1", + "type1", + }) + }) +} + +func TestRackResourcesTypesError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceTypes").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack resources types", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackResourcesUnlink(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceUnlink", "resource1", "app1").Return(fxResource(), nil) + + res, err := testExecute(e, "rack resources unlink resource1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Unlinking from app1... OK"}) + }) +} + +func TestRackResourcesUnlinkError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceUnlink", "resource1", "app1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack resources unlink resource1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Unlinking from app1... "}) + }) +} + +func TestRackResourcesUpdate(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.ResourceUpdateOptions{Parameters: map[string]string{"Foo": "bar", "Baz": "quux"}} + i.On("SystemResourceUpdate", "resource1", opts).Return(fxResource(), nil) + + res, err := testExecute(e, "rack resources update resource1 Foo=bar Baz=quux", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Updating resource... OK"}) + }) +} + +func TestRackResourcesUpdateError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + opts := structs.ResourceUpdateOptions{Parameters: map[string]string{"Foo": "bar", "Baz": "quux"}} + i.On("SystemResourceUpdate", "resource1", opts).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack resources update resource1 Foo=bar Baz=quux", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Updating resource... "}) + }) +} + +func TestRackResourcesUpdateClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + opts := structs.ResourceUpdateOptions{Parameters: map[string]string{"Foo": "bar", "Baz": "quux"}} + i.On("ResourceUpdateClassic", "resource1", opts).Return(fxResource(), nil) + + res, err := testExecute(e, "rack resources update resource1 Foo=bar Baz=quux", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Updating resource... OK"}) + }) +} + +func TestRackResourcesUrl(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceGet", "resource1").Return(fxResource(), nil) + + res, err := testExecute(e, "rack resources url resource1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"https://example.org/path"}) + }) +} + +func TestRackResourcesUrlError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("SystemResourceGet", "resource1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "rack resources url resource1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRackResourcesUrlClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("SystemResourceGetClassic", "resource1").Return(fxResource(), nil) + + res, err := testExecute(e, "rack resources url resource1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"https://other.example.org/path"}) + }) +} diff --git a/pkg/cli/restart.go b/pkg/cli/restart.go new file mode 100644 index 0000000..fd93ff5 --- /dev/null +++ b/pkg/cli/restart.go @@ -0,0 +1,36 @@ +package cli + +import ( + "sort" + + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("restart", "restart an app", Restart, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Validate: stdcli.Args(0), + }) +} + +func Restart(rack sdk.Interface, c *stdcli.Context) error { + ss, err := rack.ServiceList(app(c)) + if err != nil { + return err + } + + sort.Slice(ss, func(i, j int) bool { return ss[i].Name < ss[j].Name }) + + for _, s := range ss { + c.Startf("Restarting %s", s.Name) + + if err := rack.ServiceRestart(app(c), s.Name); err != nil { + return err + } + + c.OK() + } + + return nil +} diff --git a/pkg/cli/restart_test.go b/pkg/cli/restart_test.go new file mode 100644 index 0000000..f8e0761 --- /dev/null +++ b/pkg/cli/restart_test.go @@ -0,0 +1,52 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/require" +) + +func TestRestart(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ServiceList", "app1").Return(structs.Services{*fxService(), *fxService()}, nil) + i.On("ServiceRestart", "app1", "service1").Return(nil).Twice() + + res, err := testExecute(e, "restart -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Restarting service1... OK", + "Restarting service1... OK", + }) + }) +} + +func TestRestartErrorList(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ServiceList", "app1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "restart -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRestartErrorRestart(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ServiceList", "app1").Return(structs.Services{*fxService(), *fxService()}, nil) + i.On("ServiceRestart", "app1", "service1").Return(fmt.Errorf("err1")).Once() + + res, err := testExecute(e, "restart -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Restarting service1... "}) + }) +} diff --git a/pkg/cli/run.go b/pkg/cli/run.go new file mode 100644 index 0000000..cca09c0 --- /dev/null +++ b/pkg/cli/run.go @@ -0,0 +1,120 @@ +package cli + +import ( + "fmt" + "os" + "strings" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("run", "execute a command in a new process", Run, stdcli.CommandOptions{ + Flags: append( + stdcli.OptionFlags(structs.ProcessRunOptions{}), + flagRack, + flagApp, + stdcli.BoolFlag("detach", "d", "run process in the background"), + stdcli.IntFlag("timeout", "t", "timeout"), + ), + Usage: " ", + Validate: stdcli.ArgsMin(2), + }) +} + +func Run(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + service := c.Arg(0) + command := strings.Join(c.Args[1:], " ") + + var opts structs.ProcessRunOptions + + if err := c.Options(&opts); err != nil { + return err + } + + opts.Command = options.String(command) + + timeout := 3600 + + if t := c.Int("timeout"); t > 0 { + timeout = t + } + + if w, h, err := c.TerminalSize(); err == nil { + opts.Height = options.Int(h) + opts.Width = options.Int(w) + } + + restore := c.TerminalRaw() + defer restore() + + if s.Version <= "20180708231844" { + if c.Bool("detach") { + c.Startf("Running detached process") + + pid, err := rack.ProcessRunDetached(app(c), service, opts) + if err != nil { + return err + } + + return c.OK(pid) + } + + code, err := rack.ProcessRunAttached(app(c), service, c, timeout, opts) + if err != nil { + return err + } + + return stdcli.Exit(code) + } + + if c.Bool("detach") { + c.Startf("Running detached process") + + ps, err := rack.ProcessRun(app(c), service, opts) + if err != nil { + return err + } + + return c.OK(ps.Id) + } + + opts.Command = options.String(fmt.Sprintf("sleep %d", timeout)) + + ps, err := rack.ProcessRun(app(c), c.Arg(0), opts) + if err != nil { + return err + } + + defer rack.ProcessStop(app(c), ps.Id) + + if err := common.WaitForProcessRunning(rack, c, app(c), ps.Id); err != nil { + return err + } + + eopts := structs.ProcessExecOptions{ + Entrypoint: options.Bool(true), + Height: opts.Height, + Width: opts.Width, + } + + if !stdcli.IsTerminal(os.Stdin) { + eopts.Tty = options.Bool(false) + } + + code, err := rack.ProcessExec(app(c), ps.Id, command, c, eopts) + if err != nil { + return err + } + + return stdcli.Exit(code) +} diff --git a/pkg/cli/run_test.go b/pkg/cli/run_test.go new file mode 100644 index 0000000..2e920d5 --- /dev/null +++ b/pkg/cli/run_test.go @@ -0,0 +1,96 @@ +package cli_test + +import ( + "fmt" + "io" + "io/ioutil" + "strings" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestRun(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ProcessRun", "app1", "web", structs.ProcessRunOptions{Command: options.String("sleep 7200")}).Return(fxProcess(), nil) + i.On("ProcessGet", "app1", "pid1").Return(fxProcessPending(), nil).Twice() + i.On("ProcessGet", "app1", "pid1").Return(fxProcess(), nil) + opts := structs.ProcessExecOptions{Entrypoint: options.Bool(true), Tty: options.Bool(false)} + i.On("ProcessExec", "app1", "pid1", "bash", mock.Anything, opts).Return(4, nil).Run(func(args mock.Arguments) { + data, err := ioutil.ReadAll(args.Get(3).(io.Reader)) + require.NoError(t, err) + require.Equal(t, "in", string(data)) + args.Get(3).(io.Writer).Write([]byte("out")) + }) + i.On("ProcessStop", "app1", "pid1").Return(nil) + + res, err := testExecute(e, "run web bash -a app1 -t 7200", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 4, res.Code) + res.RequireStderr(t, []string{""}) + require.Equal(t, "out", res.Stdout) + }) +} + +func TestRunError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ProcessRun", "app1", "web", structs.ProcessRunOptions{Command: options.String("sleep 7200")}).Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "run web bash -a app1 -t 7200", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestRunClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("ProcessRunAttached", "app1", "web", mock.Anything, 7200, structs.ProcessRunOptions{Command: options.String("bash")}).Return(4, nil).Run(func(args mock.Arguments) { + data, err := ioutil.ReadAll(args.Get(2).(io.Reader)) + require.NoError(t, err) + require.Equal(t, "in", string(data)) + args.Get(2).(io.Writer).Write([]byte("out")) + }) + + res, err := testExecute(e, "run web bash -a app1 -t 7200", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 4, res.Code) + res.RequireStderr(t, []string{""}) + require.Equal(t, "out", res.Stdout) + }) +} + +func TestRunClassicDetached(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("ProcessRunDetached", "app1", "web", structs.ProcessRunOptions{Command: options.String("bash")}).Return("pid1", nil) + + res, err := testExecute(e, "run web bash -a app1 -d", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Running detached process... OK, pid1"}) + }) +} + +func TestRunDetached(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ProcessRun", "app1", "web", structs.ProcessRunOptions{Command: options.String("bash")}).Return(fxProcess(), nil) + + res, err := testExecute(e, "run web bash -a app1 -d", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Running detached process... OK, pid1"}) + }) +} diff --git a/pkg/cli/scale.go b/pkg/cli/scale.go new file mode 100644 index 0000000..6615394 --- /dev/null +++ b/pkg/cli/scale.go @@ -0,0 +1,102 @@ +package cli + +import ( + "fmt" + "sort" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("scale", "scale a service", Scale, stdcli.CommandOptions{ + Flags: append(stdcli.OptionFlags(structs.ServiceUpdateOptions{}), flagApp, flagRack, flagWait), + Usage: "", + Validate: func(c *stdcli.Context) error { + if c.Value("count") != nil || c.Value("cpu") != nil || c.Value("memory") != nil { + if len(c.Args) < 1 { + return fmt.Errorf("service name required") + } else { + return stdcli.Args(1)(c) + } + } else { + return stdcli.Args(0)(c) + } + }, + }) +} + +func Scale(rack sdk.Interface, c *stdcli.Context) error { + s, err := rack.SystemGet() + if err != nil { + return err + } + + var opts structs.ServiceUpdateOptions + + if err := c.Options(&opts); err != nil { + return err + } + + if opts.Count != nil || opts.Cpu != nil || opts.Memory != nil { + service := c.Arg(0) + + c.Startf("Scaling %s", service) + + if s.Version <= "20180708231844" { + if err := rack.FormationUpdate(app(c), service, opts); err != nil { + return err + } + } else { + if err := rack.ServiceUpdate(app(c), service, opts); err != nil { + return err + } + } + + if c.Bool("wait") { + c.Writef("\n") + + if err := common.WaitForAppWithLogs(rack, c, app(c)); err != nil { + return err + } + } + + return c.OK() + } + + var ss structs.Services + running := map[string]int{} + + if s.Version < "20180708231844" { + ss, err = rack.FormationGet(app(c)) + if err != nil { + return err + } + } else { + ss, err = rack.ServiceList(app(c)) + if err != nil { + return err + } + } + + sort.Slice(ss, func(i, j int) bool { return ss[i].Name < ss[j].Name }) + + ps, err := rack.ProcessList(app(c), structs.ProcessListOptions{}) + if err != nil { + return err + } + + for _, p := range ps { + running[p.Name] += 1 + } + + t := c.Table("SERVICE", "DESIRED", "RUNNING", "CPU", "MEMORY") + + for _, s := range ss { + t.AddRow(s.Name, fmt.Sprintf("%d", s.Count), fmt.Sprintf("%d", running[s.Name]), fmt.Sprintf("%d", s.Cpu), fmt.Sprintf("%d", s.Memory)) + } + + return t.Print() +} diff --git a/pkg/cli/scale_test.go b/pkg/cli/scale_test.go new file mode 100644 index 0000000..73ad988 --- /dev/null +++ b/pkg/cli/scale_test.go @@ -0,0 +1,100 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/require" +) + +func TestScale(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ServiceList", "app1").Return(structs.Services{*fxService(), *fxService()}, nil) + i.On("ProcessList", "app1", structs.ProcessListOptions{}).Return(structs.Processes{*fxProcess(), *fxProcess()}, nil) + + res, err := testExecute(e, "scale -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "SERVICE DESIRED RUNNING CPU MEMORY", + "service1 1 0 2 3 ", + "service1 1 0 2 3 ", + }) + }) +} + +func TestScaleError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ServiceList", "app1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "scale -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestScaleClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("FormationGet", "app1").Return(structs.Services{*fxService(), *fxService()}, nil) + i.On("ProcessList", "app1", structs.ProcessListOptions{}).Return(structs.Processes{*fxProcess(), *fxProcess()}, nil) + + res, err := testExecute(e, "scale -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "SERVICE DESIRED RUNNING CPU MEMORY", + "service1 1 0 2 3 ", + "service1 1 0 2 3 ", + }) + }) +} + +func TestScaleUpdate(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ServiceUpdate", "app1", "web", structs.ServiceUpdateOptions{Count: options.Int(3), Cpu: options.Int(5), Memory: options.Int(10)}).Return(nil) + + res, err := testExecute(e, "scale web --cpu 5 --memory 10 --count 3 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Scaling web... OK"}) + }) +} + +func TestScaleUpdateError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ServiceUpdate", "app1", "web", structs.ServiceUpdateOptions{Count: options.Int(3), Cpu: options.Int(5), Memory: options.Int(10)}).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "scale web --cpu 5 --memory 10 --count 3 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Scaling web... "}) + }) +} + +func TestScaleUpdateClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("FormationUpdate", "app1", "web", structs.ServiceUpdateOptions{Count: options.Int(3), Cpu: options.Int(5), Memory: options.Int(10)}).Return(nil) + + res, err := testExecute(e, "scale web --cpu 5 --memory 10 --count 3 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Scaling web... OK"}) + }) +} diff --git a/pkg/cli/services.go b/pkg/cli/services.go new file mode 100644 index 0000000..1be6087 --- /dev/null +++ b/pkg/cli/services.go @@ -0,0 +1,75 @@ +package cli + +import ( + "fmt" + "strings" + + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("services", "list services for an app", Services, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Validate: stdcli.Args(0), + }) + + register("services restart", "restart a service", ServicesRestart, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagApp, flagRack}, + Validate: stdcli.Args(1), + }) +} + +func Services(rack sdk.Interface, c *stdcli.Context) error { + sys, err := rack.SystemGet() + if err != nil { + return err + } + + var ss structs.Services + + if sys.Version < "20180708231844" { + ss, err = rack.FormationGet(app(c)) + if err != nil { + return err + } + } else { + ss, err = rack.ServiceList(app(c)) + if err != nil { + return err + } + } + + t := c.Table("SERVICE", "DOMAIN", "PORTS") + + for _, s := range ss { + ports := []string{} + + for _, p := range s.Ports { + port := fmt.Sprintf("%d", p.Balancer) + + if p.Container != 0 { + port = fmt.Sprintf("%d:%d", p.Balancer, p.Container) + } + + ports = append(ports, port) + } + + t.AddRow(s.Name, s.Domain, strings.Join(ports, " ")) + } + + return t.Print() +} + +func ServicesRestart(rack sdk.Interface, c *stdcli.Context) error { + name := c.Arg(0) + + c.Startf("Restarting %s", name) + + if err := rack.ServiceRestart(app(c), name); err != nil { + return err + } + + return c.OK() +} diff --git a/pkg/cli/services_test.go b/pkg/cli/services_test.go new file mode 100644 index 0000000..ef66254 --- /dev/null +++ b/pkg/cli/services_test.go @@ -0,0 +1,82 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/require" +) + +func TestServices(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ServiceList", "app1").Return(structs.Services{*fxService(), *fxService()}, nil) + + res, err := testExecute(e, "services -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "SERVICE DOMAIN PORTS ", + "service1 domain 1:2 1:2", + "service1 domain 1:2 1:2", + }) + }) +} + +func TestServicesError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ServiceList", "app1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "services -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestServicesClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("FormationGet", "app1").Return(structs.Services{*fxService(), *fxService()}, nil) + + res, err := testExecute(e, "services -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "SERVICE DOMAIN PORTS ", + "service1 domain 1:2 1:2", + "service1 domain 1:2 1:2", + }) + }) +} + +func TestServicesRestart(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ServiceRestart", "app1", "service1").Return(nil) + + res, err := testExecute(e, "services restart service1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Restarting service1... OK"}) + }) +} + +func TestServicesRestartError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("ServiceRestart", "app1", "service1").Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "services restart service1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Restarting service1... "}) + }) +} diff --git a/pkg/cli/ssl.go b/pkg/cli/ssl.go new file mode 100644 index 0000000..5cf4bc7 --- /dev/null +++ b/pkg/cli/ssl.go @@ -0,0 +1,105 @@ +package cli + +import ( + "fmt" + "strconv" + "strings" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("ssl", "list certificate associates for an app", Ssl, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp}, + Validate: stdcli.Args(0), + }) + + register("ssl update", "update certificate for an app", SslUpdate, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack, flagApp, flagWait}, + Usage: " ", + Validate: stdcli.Args(2), + }) +} + +func Ssl(rack sdk.Interface, c *stdcli.Context) error { + sys, err := rack.SystemGet() + if err != nil { + return err + } + + var ss structs.Services + + if sys.Version < "20180708231844" { + ss, err = rack.FormationGet(app(c)) + if err != nil { + return err + } + } else { + ss, err = rack.ServiceList(app(c)) + if err != nil { + return err + } + } + + t := c.Table("ENDPOINT", "CERTIFICATE", "DOMAIN", "EXPIRES") + + certs := map[string]structs.Certificate{} + + cs, err := rack.CertificateList() + if err != nil { + return err + } + + for _, c := range cs { + certs[c.Id] = c + } + + for _, s := range ss { + for _, p := range s.Ports { + if p.Certificate != "" { + t.AddRow(fmt.Sprintf("%s:%d", s.Name, p.Balancer), p.Certificate, certs[p.Certificate].Domain, common.Ago(certs[p.Certificate].Expiration)) + } + } + } + + return t.Print() +} + +func SslUpdate(rack sdk.Interface, c *stdcli.Context) error { + a, err := rack.AppGet(app(c)) + if err != nil { + return err + } + + if a.Generation == "2" { + return fmt.Errorf("command not valid for generation 2 applications") + } + + parts := strings.SplitN(c.Arg(0), ":", 2) + + if len(parts) != 2 { + return fmt.Errorf("process:port required as first argument") + } + + port, err := strconv.Atoi(parts[1]) + if err != nil { + return err + } + + c.Startf("Updating certificate") + + if err := rack.CertificateApply(app(c), parts[0], port, c.Arg(1)); err != nil { + return err + } + + if c.Bool("wait") { + if err := common.WaitForAppRunning(rack, app(c)); err != nil { + return err + } + } + + return c.OK() +} diff --git a/pkg/cli/ssl_test.go b/pkg/cli/ssl_test.go new file mode 100644 index 0000000..9e581d0 --- /dev/null +++ b/pkg/cli/ssl_test.go @@ -0,0 +1,102 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/require" +) + +func TestSsl(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ServiceList", "app1").Return(structs.Services{*fxService(), *fxService()}, nil) + i.On("CertificateList").Return(structs.Certificates{*fxCertificate()}, nil) + + res, err := testExecute(e, "ssl -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ENDPOINT CERTIFICATE DOMAIN EXPIRES ", + "service1:1 cert1 example.org 2 days from now", + "service1:1 cert1 example.org 2 days from now", + "service1:1 cert1 example.org 2 days from now", + "service1:1 cert1 example.org 2 days from now", + }) + }) +} + +func TestSslError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ServiceList", "app1").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "ssl -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestSslClassic(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystemClassic(), nil) + i.On("FormationGet", "app1").Return(structs.Services{*fxService(), *fxService()}, nil) + i.On("CertificateList").Return(structs.Certificates{*fxCertificate()}, nil) + + res, err := testExecute(e, "ssl -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "ENDPOINT CERTIFICATE DOMAIN EXPIRES ", + "service1:1 cert1 example.org 2 days from now", + "service1:1 cert1 example.org 2 days from now", + "service1:1 cert1 example.org 2 days from now", + "service1:1 cert1 example.org 2 days from now", + }) + }) +} + +func TestSslUpdate(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxApp(), nil) + + res, err := testExecute(e, "ssl update web:5000 cert1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: command not valid for generation 2 applications"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestSslUpdateGeneration1(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxAppGeneration1(), nil) + i.On("CertificateApply", "app1", "web", 5000, "cert1").Return(nil) + + res, err := testExecute(e, "ssl update web:5000 cert1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Updating certificate... OK"}) + }) +} + +func TestSslUpdateGeneration1Error(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("AppGet", "app1").Return(fxAppGeneration1(), nil) + i.On("CertificateApply", "app1", "web", 5000, "cert1").Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "ssl update web:5000 cert1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{"Updating certificate... "}) + }) +} diff --git a/pkg/cli/start.go b/pkg/cli/start.go new file mode 100644 index 0000000..8370475 --- /dev/null +++ b/pkg/cli/start.go @@ -0,0 +1,102 @@ +package cli + +import ( + "context" + "fmt" + "os" + "os/signal" + "path/filepath" + "strings" + + "github.com/convox/convox/pkg/start" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("start", "start an application for local development", Start, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagRack, + flagApp, + stdcli.StringFlag("manifest", "m", "manifest file"), + stdcli.StringFlag("generation", "g", "generation"), + stdcli.BoolFlag("no-build", "", "skip build"), + stdcli.BoolFlag("no-cache", "", "build withoit layer cache"), + stdcli.BoolFlag("no-sync", "", "do not sync local changes into the running containers"), + stdcli.IntFlag("shift", "s", "shift local port numbers (generation 1 only)"), + }, + Usage: "[service] [service...]", + }) +} + +func Start(rack sdk.Interface, c *stdcli.Context) error { + ctx, cancel := context.WithCancel(context.Background()) + + go handleInterrupt(cancel) + + if c.String("generation") == "1" || c.LocalSetting("generation") == "1" || filepath.Base(c.String("manifest")) == "docker-compose.yml" { + return fmt.Errorf("gen1 is no longer supported") + } + + var p structs.Provider + + if rack != nil { + p = rack + // s, err := rack.SystemGet() + // if err != nil { + // return err + // } + // if s.Provider == "local" || s.Provider == "kaws" { + // p = rack + // } + } + + if p == nil { + if !localRackRunning(c) { + return fmt.Errorf("local rack not found, try `sudo convox rack install local`") + } + + r, err := matchRack(c, "local/") + if err != nil { + if strings.HasPrefix(err.Error(), "ambiguous rack name") { + return fmt.Errorf("multiple local racks detected, use `convox switch` to select one") + } + return err + } + + cl, err := sdk.New(fmt.Sprintf("https://rack.%s", strings.TrimPrefix(r.Name, "local/"))) + if err != nil { + return err + } + + p = cl + } + + if p == nil { + return fmt.Errorf("could not find local rack") + } + + opts := start.Options2{ + App: app(c), + Build: !c.Bool("no-build"), + Cache: !c.Bool("no-cache"), + Manifest: c.String("manifest"), + Provider: p, + Sync: !c.Bool("no-sync"), + } + + if len(c.Args) > 0 { + opts.Services = c.Args + } + + return Starter.Start2(ctx, c, opts) +} + +func handleInterrupt(cancel context.CancelFunc) { + ch := make(chan os.Signal, 1) + signal.Notify(ch, os.Interrupt, os.Kill) + <-ch + fmt.Println("") + cancel() +} diff --git a/pkg/cli/start_test.go b/pkg/cli/start_test.go new file mode 100644 index 0000000..f88dd13 --- /dev/null +++ b/pkg/cli/start_test.go @@ -0,0 +1,236 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + mockstart "github.com/convox/convox/pkg/mock/start" + mockstdcli "github.com/convox/convox/pkg/mock/stdcli" + "github.com/convox/convox/pkg/start" + "github.com/convox/convox/sdk" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestStart1(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + ms := &mockstart.Interface{} + cli.Starter = ms + + opts := start.Options1{ + App: "app1", + Build: true, + Cache: true, + Sync: true, + } + + ms.On("Start1", mock.Anything, opts).Return(nil) + + res, err := testExecute(e, "start -g 1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestStart1Error(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + ms := &mockstart.Interface{} + cli.Starter = ms + + opts := start.Options1{ + App: "app1", + Build: true, + Cache: true, + Sync: true, + } + + ms.On("Start1", mock.Anything, opts).Return(fmt.Errorf("err1")) + + res, err := testExecute(e, "start -g 1 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestStart1Options(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + ms := &mockstart.Interface{} + cli.Starter = ms + + opts := start.Options1{ + App: "app1", + Build: false, + Cache: false, + Command: []string{"bin/command", "args"}, + Manifest: "manifest1", + Service: "service1", + Shift: 3000, + Sync: false, + } + + ms.On("Start1", mock.Anything, opts).Return(nil) + + res, err := testExecute(e, "start -g 1 -a app1 -m manifest1 --no-build --no-cache --no-sync -s 3000 service1 bin/command args", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestStart2(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte("namespace/dev\n"), nil) + e.Executor = me + + ms := &mockstart.Interface{} + cli.Starter = ms + + opts := start.Options2{ + App: "app1", + Build: true, + Cache: true, + Provider: i, + Sync: true, + } + + ms.On("Start2", mock.Anything, mock.Anything, opts).Return(nil) + + i.On("SystemGet").Return(fxSystemLocal, nil) + + res, err := testExecute(e, "start -g 2 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestStart2Error(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte("namespace/dev\n"), nil) + e.Executor = me + + ms := &mockstart.Interface{} + cli.Starter = ms + + opts := start.Options2{ + App: "app1", + Build: true, + Cache: true, + Provider: i, + Sync: true, + } + + ms.On("Start2", mock.Anything, mock.Anything, opts).Return(fmt.Errorf("err1")) + + i.On("SystemGet").Return(fxSystemLocal, nil) + + res, err := testExecute(e, "start -g 2 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestStart2Options(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte("namespace/dev\n"), nil) + e.Executor = me + + ms := &mockstart.Interface{} + cli.Starter = ms + + opts := start.Options2{ + App: "app1", + Build: false, + Cache: false, + Manifest: "manifest1", + Provider: i, + Services: []string{"service1", "service2"}, + Sync: false, + } + + ms.On("Start2", mock.Anything, mock.Anything, opts).Return(nil) + + i.On("SystemGet").Return(fxSystemLocal(), nil) + + res, err := testExecute(e, "start -g 2 -a app1 -m manifest1 --no-build --no-cache --no-sync service1 service2", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestStart2Remote(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte("namespace/dev"), nil) + e.Executor = me + + ms := &mockstart.Interface{} + cli.Starter = ms + + ms.On("Start2", mock.Anything, mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { + opts := args.Get(2).(start.Options2) + require.Equal(t, "app1", opts.App) + require.Equal(t, true, opts.Build) + require.Equal(t, true, opts.Cache) + require.Equal(t, true, opts.Sync) + p := opts.Provider.(*sdk.Client) + require.Equal(t, "https", p.Client.Endpoint.Scheme) + require.Equal(t, "rack.dev", p.Client.Endpoint.Host) + }) + + i.On("SystemGet").Return(fxSystem(), nil) + + res, err := testExecute(e, "start -g 2 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{""}) + }) +} + +func TestStart2RemoteMultiple(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte("namespace/dev\nnamespace/dev2\n"), nil) + e.Executor = me + + ms := &mockstart.Interface{} + cli.Starter = ms + + opts := start.Options2{ + App: "app1", + Build: true, + Cache: true, + Sync: true, + } + + ms.On("Start2", mock.Anything, opts).Return(nil).Run(func(args mock.Arguments) { + s := args.Get(0).(*sdk.Client) + require.Equal(t, "https", s.Client.Endpoint.Scheme) + require.Equal(t, "rack.classic", s.Client.Endpoint.Host) + }) + + i.On("SystemGet").Return(fxSystem(), nil) + + res, err := testExecute(e, "start -g 2 -a app1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: multiple local racks detected, use `convox switch` to select one"}) + res.RequireStdout(t, []string{""}) + }) +} diff --git a/pkg/cli/switch.go b/pkg/cli/switch.go new file mode 100644 index 0000000..7d07dc7 --- /dev/null +++ b/pkg/cli/switch.go @@ -0,0 +1,49 @@ +package cli + +import ( + "encoding/json" + + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + registerWithoutProvider("switch", "switch current rack", Switch, stdcli.CommandOptions{ + Validate: stdcli.ArgsMax(1), + }) +} + +func Switch(rack sdk.Interface, c *stdcli.Context) error { + host, err := currentHost(c) + if err != nil { + return err + } + + if rack := c.Arg(0); rack != "" { + r, err := matchRack(c, rack) + if err != nil { + return err + } + + rs := hostRacks(c) + + rs[host] = r.Name + + data, err := json.MarshalIndent(rs, "", " ") + if err != nil { + return err + } + + if err := c.SettingWrite("racks", string(data)); err != nil { + return err + } + + c.Writef("Switched to %s\n", r.Name) + + return nil + } + + c.Writef("%s\n", currentRack(c, host)) + + return nil +} diff --git a/pkg/cli/switch_test.go b/pkg/cli/switch_test.go new file mode 100644 index 0000000..894e613 --- /dev/null +++ b/pkg/cli/switch_test.go @@ -0,0 +1,74 @@ +package cli_test + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "net/url" + "path/filepath" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/gorilla/mux" + "github.com/stretchr/testify/require" +) + +func TestSwitch(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + r := mux.NewRouter() + + r.HandleFunc("/racks", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(`[ + {"name":"foo","organization":{"name":"test"},"status":"running"}, + {"name":"other","organization":{"name":"test"},"status":"updating"} + ]`)) + }).Methods("GET") + + ts := httptest.NewTLSServer(r) + + tsu, err := url.Parse(ts.URL) + require.NoError(t, err) + + err = ioutil.WriteFile(filepath.Join(e.Settings, "host"), []byte(tsu.Host), 0644) + require.NoError(t, err) + + res, err := testExecute(e, "switch foo", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{"Switched to test/foo"}) + + data, err := ioutil.ReadFile(filepath.Join(e.Settings, "racks")) + require.NoError(t, err) + require.Equal(t, fmt.Sprintf("{\n \"%s\": \"test/foo\"\n}", tsu.Host), string(data)) + }) +} + +func TestSwitchUnknown(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + r := mux.NewRouter() + + r.HandleFunc("/racks", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(`[ + {"name":"foo","organization":{"name":"test"},"status":"running"}, + {"name":"other","organization":{"name":"test"},"status":"updating"} + ]`)) + }).Methods("GET") + + ts := httptest.NewTLSServer(r) + + tsu, err := url.Parse(ts.URL) + require.NoError(t, err) + + err = ioutil.WriteFile(filepath.Join(e.Settings, "host"), []byte(tsu.Host), 0644) + require.NoError(t, err) + + res, err := testExecute(e, "switch rack1", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: could not find rack: rack1"}) + res.RequireStdout(t, []string{""}) + }) +} diff --git a/pkg/cli/test.go b/pkg/cli/test.go new file mode 100644 index 0000000..fc71773 --- /dev/null +++ b/pkg/cli/test.go @@ -0,0 +1,98 @@ +package cli + +import ( + "fmt" + "os" + + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("test", "run tests", Test, stdcli.CommandOptions{ + Flags: []stdcli.Flag{ + flagApp, + flagRack, + stdcli.StringFlag("description", "d", "description"), + stdcli.StringFlag("release", "", "use existing release to run tests"), + stdcli.IntFlag("timeout", "t", "timeout"), + }, + Usage: "[dir]", + Validate: stdcli.ArgsMax(1), + }) +} + +func Test(rack sdk.Interface, c *stdcli.Context) error { + release := c.String("release") + + if release == "" { + b, err := build(rack, c, true) + if err != nil { + return err + } + + release = b.Release + } + + m, _, err := common.ReleaseManifest(rack, app(c), release) + if err != nil { + return err + } + + timeout := 3600 + + if t := c.Int("timeout"); t > 0 { + timeout = t + } + + for _, s := range m.Services { + if s.Test == "" { + continue + } + + c.Writef("Running %s on %s\n", s.Test, s.Name) + + ropts := structs.ProcessRunOptions{ + Command: options.String(fmt.Sprintf("sleep %d", timeout)), + Release: options.String(release), + } + + ps, err := rack.ProcessRun(app(c), s.Name, ropts) + if err != nil { + return err + } + + defer rack.ProcessStop(app(c), ps.Id) + + if err := common.WaitForProcessRunning(rack, c, app(c), ps.Id); err != nil { + return err + } + + eopts := structs.ProcessExecOptions{ + Entrypoint: options.Bool(true), + } + + if w, h, err := c.TerminalSize(); err == nil { + eopts.Height = options.Int(h) + eopts.Width = options.Int(w) + } + + if !stdcli.IsTerminal(os.Stdin) { + eopts.Tty = options.Bool(false) + } + + code, err := rack.ProcessExec(app(c), ps.Id, s.Test, c, eopts) + if err != nil { + return err + } + + if code != 0 { + return fmt.Errorf("exit %d", code) + } + } + + return nil +} diff --git a/pkg/cli/test_test.go b/pkg/cli/test_test.go new file mode 100644 index 0000000..45ec2cb --- /dev/null +++ b/pkg/cli/test_test.go @@ -0,0 +1,93 @@ +package cli_test + +import ( + "io" + "io/ioutil" + "strings" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestTest(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ObjectStore", "app1", mock.AnythingOfType("string"), mock.Anything, structs.ObjectStoreOptions{}).Return(&fxObject, nil).Run(func(args mock.Arguments) { + require.Regexp(t, `tmp/[0-9a-f]{30}\.tgz`, args.Get(1).(string)) + }) + i.On("BuildCreate", "app1", "object://test", structs.BuildCreateOptions{Development: options.Bool(true), Description: options.String("foo")}).Return(fxBuild(), nil) + i.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(testLogs(fxLogs()), nil) + i.On("BuildGet", "app1", "build1").Return(fxBuildRunning(), nil).Once() + i.On("BuildGet", "app1", "build4").Return(fxBuild(), nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + i.On("ProcessRun", "app1", "web", structs.ProcessRunOptions{Command: options.String("sleep 7200"), Release: options.String("release1")}).Return(fxProcess(), nil) + i.On("ProcessGet", "app1", "pid1").Return(fxProcessPending(), nil).Twice() + i.On("ProcessGet", "app1", "pid1").Return(fxProcess(), nil) + opts := structs.ProcessExecOptions{Entrypoint: options.Bool(true), Tty: options.Bool(false)} + i.On("ProcessExec", "app1", "pid1", "make test", mock.Anything, opts).Return(0, nil).Run(func(args mock.Arguments) { + data, err := ioutil.ReadAll(args.Get(3).(io.Reader)) + require.NoError(t, err) + require.Equal(t, "in", string(data)) + args.Get(3).(io.Writer).Write([]byte("out")) + }) + i.On("ProcessStop", "app1", "pid1").Return(nil) + + res, err := testExecute(e, "test ./testdata/httpd -a app1 -d foo -t 7200", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "Packaging source... OK", + "Uploading source... OK", + "Starting build... OK", + "log1", + "log2", + "Running make test on web", + "out", + }) + }) +} + +func TestTestFail(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + i.On("SystemGet").Return(fxSystem(), nil) + i.On("ObjectStore", "app1", mock.AnythingOfType("string"), mock.Anything, structs.ObjectStoreOptions{}).Return(&fxObject, nil).Run(func(args mock.Arguments) { + require.Regexp(t, `tmp/[0-9a-f]{30}\.tgz`, args.Get(1).(string)) + }) + i.On("BuildCreate", "app1", "object://test", structs.BuildCreateOptions{Development: options.Bool(true), Description: options.String("foo")}).Return(fxBuild(), nil) + i.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(testLogs(fxLogs()), nil) + i.On("BuildGet", "app1", "build1").Return(fxBuildRunning(), nil).Once() + i.On("BuildGet", "app1", "build4").Return(fxBuild(), nil) + i.On("ReleaseGet", "app1", "release1").Return(fxRelease(), nil) + i.On("ProcessRun", "app1", "web", structs.ProcessRunOptions{Command: options.String("sleep 7200"), Release: options.String("release1")}).Return(fxProcess(), nil) + i.On("ProcessGet", "app1", "pid1").Return(fxProcessPending(), nil).Twice() + i.On("ProcessGet", "app1", "pid1").Return(fxProcess(), nil) + opts := structs.ProcessExecOptions{Entrypoint: options.Bool(true), Tty: options.Bool(false)} + i.On("ProcessExec", "app1", "pid1", "make test", mock.Anything, opts).Return(4, nil).Run(func(args mock.Arguments) { + data, err := ioutil.ReadAll(args.Get(3).(io.Reader)) + require.NoError(t, err) + require.Equal(t, "in", string(data)) + args.Get(3).(io.Writer).Write([]byte("out")) + }) + i.On("ProcessStop", "app1", "pid1").Return(nil) + + res, err := testExecute(e, "test ./testdata/httpd -a app1 -d foo -t 7200", strings.NewReader("in")) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: exit 4"}) + res.RequireStdout(t, []string{ + "Packaging source... OK", + "Uploading source... OK", + "Starting build... OK", + "log1", + "log2", + "Running make test on web", + "out", + }) + }) +} diff --git a/pkg/cli/testdata/app.nobuild.tgz b/pkg/cli/testdata/app.nobuild.tgz new file mode 100644 index 0000000..10a1dc7 Binary files /dev/null and b/pkg/cli/testdata/app.nobuild.tgz differ diff --git a/pkg/cli/testdata/app.noparams.tgz b/pkg/cli/testdata/app.noparams.tgz new file mode 100644 index 0000000..48ea260 Binary files /dev/null and b/pkg/cli/testdata/app.noparams.tgz differ diff --git a/pkg/cli/testdata/app.sameparams.tgz b/pkg/cli/testdata/app.sameparams.tgz new file mode 100644 index 0000000..8088ebf Binary files /dev/null and b/pkg/cli/testdata/app.sameparams.tgz differ diff --git a/pkg/cli/testdata/app.tgz b/pkg/cli/testdata/app.tgz new file mode 100644 index 0000000..2cdaea8 Binary files /dev/null and b/pkg/cli/testdata/app.tgz differ diff --git a/pkg/cli/testdata/base/file b/pkg/cli/testdata/base/file new file mode 100644 index 0000000..f73f309 --- /dev/null +++ b/pkg/cli/testdata/base/file @@ -0,0 +1 @@ +file diff --git a/pkg/cli/testdata/build.tgz b/pkg/cli/testdata/build.tgz new file mode 100644 index 0000000..e3ece33 Binary files /dev/null and b/pkg/cli/testdata/build.tgz differ diff --git a/pkg/cli/testdata/cert.pem b/pkg/cli/testdata/cert.pem new file mode 100644 index 0000000..057edb5 --- /dev/null +++ b/pkg/cli/testdata/cert.pem @@ -0,0 +1 @@ +cert diff --git a/pkg/cli/testdata/chain.pem b/pkg/cli/testdata/chain.pem new file mode 100644 index 0000000..afe00de --- /dev/null +++ b/pkg/cli/testdata/chain.pem @@ -0,0 +1 @@ +chain diff --git a/pkg/cli/testdata/file b/pkg/cli/testdata/file new file mode 100644 index 0000000..f73f309 --- /dev/null +++ b/pkg/cli/testdata/file @@ -0,0 +1 @@ +file diff --git a/pkg/cli/testdata/file.tar b/pkg/cli/testdata/file.tar new file mode 100644 index 0000000..ed4f5cb Binary files /dev/null and b/pkg/cli/testdata/file.tar differ diff --git a/pkg/cli/testdata/httpd/Dockerfile b/pkg/cli/testdata/httpd/Dockerfile new file mode 100644 index 0000000..6455161 --- /dev/null +++ b/pkg/cli/testdata/httpd/Dockerfile @@ -0,0 +1 @@ +FROM httpd diff --git a/pkg/cli/testdata/httpd/convox-dockerfile.yml b/pkg/cli/testdata/httpd/convox-dockerfile.yml new file mode 100644 index 0000000..3d3ba32 --- /dev/null +++ b/pkg/cli/testdata/httpd/convox-dockerfile.yml @@ -0,0 +1,4 @@ +services: + web: + build: . + port: 80 diff --git a/pkg/cli/testdata/httpd/convox.yml b/pkg/cli/testdata/httpd/convox.yml new file mode 100644 index 0000000..10d1e08 --- /dev/null +++ b/pkg/cli/testdata/httpd/convox.yml @@ -0,0 +1,4 @@ +services: + web: + image: httpd + port: 80 diff --git a/pkg/cli/testdata/httpd/docker-compose.yml b/pkg/cli/testdata/httpd/docker-compose.yml new file mode 100644 index 0000000..0532b7c --- /dev/null +++ b/pkg/cli/testdata/httpd/docker-compose.yml @@ -0,0 +1,7 @@ +web: + image: httpd + labels: + - convox.port.443.protocol=tls + ports: + - 80:80 + - 443:80 diff --git a/pkg/cli/testdata/key.pem b/pkg/cli/testdata/key.pem new file mode 100644 index 0000000..06bfde4 --- /dev/null +++ b/pkg/cli/testdata/key.pem @@ -0,0 +1 @@ +key diff --git a/pkg/cli/update.go b/pkg/cli/update.go new file mode 100644 index 0000000..d91f47d --- /dev/null +++ b/pkg/cli/update.go @@ -0,0 +1,54 @@ +package cli + +import ( + "fmt" + "net/http" + "runtime" + + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" + cv "github.com/convox/version" + update "github.com/inconshreveable/go-update" +) + +func init() { + registerWithoutProvider("update", "update the cli", Update, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.ArgsMax(1), + }) +} + +func Update(rack sdk.Interface, c *stdcli.Context) error { + target := c.Arg(0) + + // if no version specified, find the latest version + if target == "" { + v, err := cv.Latest() + if err != nil { + return err + } + + target = v + } + + url := fmt.Sprintf("https://s3.amazonaws.com/convox/release/%s/cli/%s/%s", target, runtime.GOOS, executableName()) + + res, err := http.Get(url) + if err != nil { + return err + } + + if res.StatusCode != 200 { + return fmt.Errorf("invalid version") + } + + defer res.Body.Close() + + c.Startf("Updating to %s", target) + + if err := update.Apply(res.Body, update.Options{}); err != nil { + return err + } + + return c.OK() +} diff --git a/pkg/cli/version.go b/pkg/cli/version.go new file mode 100644 index 0000000..cea0b2c --- /dev/null +++ b/pkg/cli/version.go @@ -0,0 +1,45 @@ +package cli + +import ( + "net/url" + + "github.com/convox/convox/sdk" + "github.com/convox/stdcli" +) + +func init() { + register("version", "display version information", Version, stdcli.CommandOptions{ + Flags: []stdcli.Flag{flagRack}, + Validate: stdcli.Args(0), + }) +} + +func Version(rack sdk.Interface, c *stdcli.Context) error { + c.Writef("client: %s\n", c.Version()) + + host, err := currentHost(c) + if err != nil { + c.Writef("server: none\n") + return nil + } + + ep, err := currentEndpoint(c, currentRack(c, host)) + if err != nil { + c.Writef("server: none\n") + return nil + } + + s, err := rack.SystemGet() + if err != nil { + return err + } + + eu, err := url.Parse(ep) + if err != nil { + return err + } + + c.Writef("server: %s (%s)\n", s.Version, eu.Host) + + return nil +} diff --git a/pkg/cli/version_test.go b/pkg/cli/version_test.go new file mode 100644 index 0000000..90b427f --- /dev/null +++ b/pkg/cli/version_test.go @@ -0,0 +1,109 @@ +package cli_test + +import ( + "fmt" + "io/ioutil" + "path/filepath" + "testing" + + "github.com/convox/convox/pkg/cli" + mocksdk "github.com/convox/convox/pkg/mock/sdk" + mockstdcli "github.com/convox/convox/pkg/mock/stdcli" + "github.com/stretchr/testify/require" +) + +func TestVersion(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte("namespace/dev\n"), nil) + e.Executor = me + + err := ioutil.WriteFile(filepath.Join(e.Settings, "host"), []byte("host1"), 0644) + require.NoError(t, err) + + i.On("SystemGet").Return(fxSystem(), nil) + + res, err := testExecute(e, "version", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "client: test", + "server: 21000101000000 (host1)", + }) + }) +} + +func TestVersionError(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte("namespace/dev\n"), nil) + e.Executor = me + + err := ioutil.WriteFile(filepath.Join(e.Settings, "host"), []byte("host1"), 0644) + require.NoError(t, err) + + i.On("SystemGet").Return(nil, fmt.Errorf("err1")) + + res, err := testExecute(e, "version", nil) + require.NoError(t, err) + require.Equal(t, 1, res.Code) + res.RequireStderr(t, []string{"ERROR: err1"}) + res.RequireStdout(t, []string{ + "client: test", + }) + }) +} + +func TestVersionNoSystem(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte(""), nil) + e.Executor = me + + res, err := testExecute(e, "version", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "client: test", + "server: none", + }) + }) +} + +func TestVersionNoSystemMultipleLocal(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte("namespace/dev\nnamespace/dev2\n"), nil) + e.Executor = me + + res, err := testExecute(e, "version", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "client: test", + "server: none", + }) + }) +} + +func TestVersionNoSystemSingleLocal(t *testing.T) { + testClient(t, func(e *cli.Engine, i *mocksdk.Interface) { + me := &mockstdcli.Executor{} + me.On("Execute", "kubectl", "get", "ns", "--selector=system=convox,type=rack", "--output=name").Return([]byte("namespace/dev\n"), nil) + e.Executor = me + + i.On("SystemGet").Return(fxSystemLocal(), nil) + + res, err := testExecute(e, "version", nil) + require.NoError(t, err) + require.Equal(t, 0, res.Code) + res.RequireStderr(t, []string{""}) + res.RequireStdout(t, []string{ + "client: test", + "server: dev (rack.dev)", + }) + }) +} diff --git a/pkg/mock/sdk/interface.go b/pkg/mock/sdk/interface.go new file mode 100644 index 0000000..5d352e5 --- /dev/null +++ b/pkg/mock/sdk/interface.go @@ -0,0 +1,2042 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package sdk + +import ( + context "context" + io "io" + + mock "github.com/stretchr/testify/mock" + + stdsdk "github.com/convox/stdsdk" + + structs "github.com/convox/convox/pkg/structs" +) + +// Interface is an autogenerated mock type for the Interface type +type Interface struct { + mock.Mock +} + +// AppCancel provides a mock function with given fields: name +func (_m *Interface) AppCancel(name string) error { + ret := _m.Called(name) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(name) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// AppCreate provides a mock function with given fields: name, opts +func (_m *Interface) AppCreate(name string, opts structs.AppCreateOptions) (*structs.App, error) { + ret := _m.Called(name, opts) + + var r0 *structs.App + if rf, ok := ret.Get(0).(func(string, structs.AppCreateOptions) *structs.App); ok { + r0 = rf(name, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.App) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.AppCreateOptions) error); ok { + r1 = rf(name, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AppDelete provides a mock function with given fields: name +func (_m *Interface) AppDelete(name string) error { + ret := _m.Called(name) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(name) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// AppGet provides a mock function with given fields: name +func (_m *Interface) AppGet(name string) (*structs.App, error) { + ret := _m.Called(name) + + var r0 *structs.App + if rf, ok := ret.Get(0).(func(string) *structs.App); ok { + r0 = rf(name) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.App) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(name) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AppList provides a mock function with given fields: +func (_m *Interface) AppList() (structs.Apps, error) { + ret := _m.Called() + + var r0 structs.Apps + if rf, ok := ret.Get(0).(func() structs.Apps); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Apps) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AppLogs provides a mock function with given fields: name, opts +func (_m *Interface) AppLogs(name string, opts structs.LogsOptions) (io.ReadCloser, error) { + ret := _m.Called(name, opts) + + var r0 io.ReadCloser + if rf, ok := ret.Get(0).(func(string, structs.LogsOptions) io.ReadCloser); ok { + r0 = rf(name, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.ReadCloser) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.LogsOptions) error); ok { + r1 = rf(name, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AppMetrics provides a mock function with given fields: name, opts +func (_m *Interface) AppMetrics(name string, opts structs.MetricsOptions) (structs.Metrics, error) { + ret := _m.Called(name, opts) + + var r0 structs.Metrics + if rf, ok := ret.Get(0).(func(string, structs.MetricsOptions) structs.Metrics); ok { + r0 = rf(name, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Metrics) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.MetricsOptions) error); ok { + r1 = rf(name, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AppParametersGet provides a mock function with given fields: _a0 +func (_m *Interface) AppParametersGet(_a0 string) (map[string]string, error) { + ret := _m.Called(_a0) + + var r0 map[string]string + if rf, ok := ret.Get(0).(func(string) map[string]string); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]string) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AppParametersSet provides a mock function with given fields: _a0, _a1 +func (_m *Interface) AppParametersSet(_a0 string, _a1 map[string]string) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(string, map[string]string) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// AppUpdate provides a mock function with given fields: name, opts +func (_m *Interface) AppUpdate(name string, opts structs.AppUpdateOptions) error { + ret := _m.Called(name, opts) + + var r0 error + if rf, ok := ret.Get(0).(func(string, structs.AppUpdateOptions) error); ok { + r0 = rf(name, opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// BuildCreate provides a mock function with given fields: app, url, opts +func (_m *Interface) BuildCreate(app string, url string, opts structs.BuildCreateOptions) (*structs.Build, error) { + ret := _m.Called(app, url, opts) + + var r0 *structs.Build + if rf, ok := ret.Get(0).(func(string, string, structs.BuildCreateOptions) *structs.Build); ok { + r0 = rf(app, url, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Build) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, structs.BuildCreateOptions) error); ok { + r1 = rf(app, url, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BuildCreateUpload provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Interface) BuildCreateUpload(_a0 string, _a1 io.Reader, _a2 structs.BuildCreateOptions) (*structs.Build, error) { + ret := _m.Called(_a0, _a1, _a2) + + var r0 *structs.Build + if rf, ok := ret.Get(0).(func(string, io.Reader, structs.BuildCreateOptions) *structs.Build); ok { + r0 = rf(_a0, _a1, _a2) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Build) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, io.Reader, structs.BuildCreateOptions) error); ok { + r1 = rf(_a0, _a1, _a2) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BuildExport provides a mock function with given fields: app, id, w +func (_m *Interface) BuildExport(app string, id string, w io.Writer) error { + ret := _m.Called(app, id, w) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, io.Writer) error); ok { + r0 = rf(app, id, w) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// BuildGet provides a mock function with given fields: app, id +func (_m *Interface) BuildGet(app string, id string) (*structs.Build, error) { + ret := _m.Called(app, id) + + var r0 *structs.Build + if rf, ok := ret.Get(0).(func(string, string) *structs.Build); ok { + r0 = rf(app, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Build) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(app, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BuildImport provides a mock function with given fields: app, r +func (_m *Interface) BuildImport(app string, r io.Reader) (*structs.Build, error) { + ret := _m.Called(app, r) + + var r0 *structs.Build + if rf, ok := ret.Get(0).(func(string, io.Reader) *structs.Build); ok { + r0 = rf(app, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Build) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, io.Reader) error); ok { + r1 = rf(app, r) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BuildImportMultipart provides a mock function with given fields: _a0, _a1 +func (_m *Interface) BuildImportMultipart(_a0 string, _a1 io.Reader) (*structs.Build, error) { + ret := _m.Called(_a0, _a1) + + var r0 *structs.Build + if rf, ok := ret.Get(0).(func(string, io.Reader) *structs.Build); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Build) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, io.Reader) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BuildImportUrl provides a mock function with given fields: _a0, _a1 +func (_m *Interface) BuildImportUrl(_a0 string, _a1 io.Reader) (*structs.Build, error) { + ret := _m.Called(_a0, _a1) + + var r0 *structs.Build + if rf, ok := ret.Get(0).(func(string, io.Reader) *structs.Build); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Build) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, io.Reader) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BuildList provides a mock function with given fields: app, opts +func (_m *Interface) BuildList(app string, opts structs.BuildListOptions) (structs.Builds, error) { + ret := _m.Called(app, opts) + + var r0 structs.Builds + if rf, ok := ret.Get(0).(func(string, structs.BuildListOptions) structs.Builds); ok { + r0 = rf(app, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Builds) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.BuildListOptions) error); ok { + r1 = rf(app, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BuildLogs provides a mock function with given fields: app, id, opts +func (_m *Interface) BuildLogs(app string, id string, opts structs.LogsOptions) (io.ReadCloser, error) { + ret := _m.Called(app, id, opts) + + var r0 io.ReadCloser + if rf, ok := ret.Get(0).(func(string, string, structs.LogsOptions) io.ReadCloser); ok { + r0 = rf(app, id, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.ReadCloser) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, structs.LogsOptions) error); ok { + r1 = rf(app, id, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BuildUpdate provides a mock function with given fields: app, id, opts +func (_m *Interface) BuildUpdate(app string, id string, opts structs.BuildUpdateOptions) (*structs.Build, error) { + ret := _m.Called(app, id, opts) + + var r0 *structs.Build + if rf, ok := ret.Get(0).(func(string, string, structs.BuildUpdateOptions) *structs.Build); ok { + r0 = rf(app, id, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Build) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, structs.BuildUpdateOptions) error); ok { + r1 = rf(app, id, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CapacityGet provides a mock function with given fields: +func (_m *Interface) CapacityGet() (*structs.Capacity, error) { + ret := _m.Called() + + var r0 *structs.Capacity + if rf, ok := ret.Get(0).(func() *structs.Capacity); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Capacity) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CertificateApply provides a mock function with given fields: app, service, port, id +func (_m *Interface) CertificateApply(app string, service string, port int, id string) error { + ret := _m.Called(app, service, port, id) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, int, string) error); ok { + r0 = rf(app, service, port, id) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// CertificateCreate provides a mock function with given fields: pub, key, opts +func (_m *Interface) CertificateCreate(pub string, key string, opts structs.CertificateCreateOptions) (*structs.Certificate, error) { + ret := _m.Called(pub, key, opts) + + var r0 *structs.Certificate + if rf, ok := ret.Get(0).(func(string, string, structs.CertificateCreateOptions) *structs.Certificate); ok { + r0 = rf(pub, key, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Certificate) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, structs.CertificateCreateOptions) error); ok { + r1 = rf(pub, key, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CertificateCreateClassic provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Interface) CertificateCreateClassic(_a0 string, _a1 string, _a2 structs.CertificateCreateOptions) (*structs.Certificate, error) { + ret := _m.Called(_a0, _a1, _a2) + + var r0 *structs.Certificate + if rf, ok := ret.Get(0).(func(string, string, structs.CertificateCreateOptions) *structs.Certificate); ok { + r0 = rf(_a0, _a1, _a2) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Certificate) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, structs.CertificateCreateOptions) error); ok { + r1 = rf(_a0, _a1, _a2) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CertificateDelete provides a mock function with given fields: id +func (_m *Interface) CertificateDelete(id string) error { + ret := _m.Called(id) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(id) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// CertificateGenerate provides a mock function with given fields: domains +func (_m *Interface) CertificateGenerate(domains []string) (*structs.Certificate, error) { + ret := _m.Called(domains) + + var r0 *structs.Certificate + if rf, ok := ret.Get(0).(func([]string) *structs.Certificate); ok { + r0 = rf(domains) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Certificate) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]string) error); ok { + r1 = rf(domains) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CertificateList provides a mock function with given fields: +func (_m *Interface) CertificateList() (structs.Certificates, error) { + ret := _m.Called() + + var r0 structs.Certificates + if rf, ok := ret.Get(0).(func() structs.Certificates); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Certificates) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EnvironmentSet provides a mock function with given fields: _a0, _a1 +func (_m *Interface) EnvironmentSet(_a0 string, _a1 []byte) (*structs.Release, error) { + ret := _m.Called(_a0, _a1) + + var r0 *structs.Release + if rf, ok := ret.Get(0).(func(string, []byte) *structs.Release); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Release) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, []byte) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EnvironmentUnset provides a mock function with given fields: _a0, _a1 +func (_m *Interface) EnvironmentUnset(_a0 string, _a1 string) (*structs.Release, error) { + ret := _m.Called(_a0, _a1) + + var r0 *structs.Release + if rf, ok := ret.Get(0).(func(string, string) *structs.Release); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Release) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EventSend provides a mock function with given fields: action, opts +func (_m *Interface) EventSend(action string, opts structs.EventSendOptions) error { + ret := _m.Called(action, opts) + + var r0 error + if rf, ok := ret.Get(0).(func(string, structs.EventSendOptions) error); ok { + r0 = rf(action, opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// FilesDelete provides a mock function with given fields: app, pid, files +func (_m *Interface) FilesDelete(app string, pid string, files []string) error { + ret := _m.Called(app, pid, files) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, []string) error); ok { + r0 = rf(app, pid, files) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// FilesDownload provides a mock function with given fields: app, pid, file +func (_m *Interface) FilesDownload(app string, pid string, file string) (io.Reader, error) { + ret := _m.Called(app, pid, file) + + var r0 io.Reader + if rf, ok := ret.Get(0).(func(string, string, string) io.Reader); ok { + r0 = rf(app, pid, file) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.Reader) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string) error); ok { + r1 = rf(app, pid, file) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FilesUpload provides a mock function with given fields: app, pid, r +func (_m *Interface) FilesUpload(app string, pid string, r io.Reader) error { + ret := _m.Called(app, pid, r) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, io.Reader) error); ok { + r0 = rf(app, pid, r) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// FormationGet provides a mock function with given fields: _a0 +func (_m *Interface) FormationGet(_a0 string) (structs.Services, error) { + ret := _m.Called(_a0) + + var r0 structs.Services + if rf, ok := ret.Get(0).(func(string) structs.Services); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Services) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FormationUpdate provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Interface) FormationUpdate(_a0 string, _a1 string, _a2 structs.ServiceUpdateOptions) error { + ret := _m.Called(_a0, _a1, _a2) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, structs.ServiceUpdateOptions) error); ok { + r0 = rf(_a0, _a1, _a2) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Get provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Interface) Get(_a0 string, _a1 stdsdk.RequestOptions, _a2 interface{}) error { + ret := _m.Called(_a0, _a1, _a2) + + var r0 error + if rf, ok := ret.Get(0).(func(string, stdsdk.RequestOptions, interface{}) error); ok { + r0 = rf(_a0, _a1, _a2) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Initialize provides a mock function with given fields: opts +func (_m *Interface) Initialize(opts structs.ProviderOptions) error { + ret := _m.Called(opts) + + var r0 error + if rf, ok := ret.Get(0).(func(structs.ProviderOptions) error); ok { + r0 = rf(opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// InstanceKeyroll provides a mock function with given fields: +func (_m *Interface) InstanceKeyroll() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// InstanceList provides a mock function with given fields: +func (_m *Interface) InstanceList() (structs.Instances, error) { + ret := _m.Called() + + var r0 structs.Instances + if rf, ok := ret.Get(0).(func() structs.Instances); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Instances) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InstanceShell provides a mock function with given fields: id, rw, opts +func (_m *Interface) InstanceShell(id string, rw io.ReadWriter, opts structs.InstanceShellOptions) (int, error) { + ret := _m.Called(id, rw, opts) + + var r0 int + if rf, ok := ret.Get(0).(func(string, io.ReadWriter, structs.InstanceShellOptions) int); ok { + r0 = rf(id, rw, opts) + } else { + r0 = ret.Get(0).(int) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, io.ReadWriter, structs.InstanceShellOptions) error); ok { + r1 = rf(id, rw, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InstanceShellClassic provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Interface) InstanceShellClassic(_a0 string, _a1 io.ReadWriter, _a2 structs.InstanceShellOptions) (int, error) { + ret := _m.Called(_a0, _a1, _a2) + + var r0 int + if rf, ok := ret.Get(0).(func(string, io.ReadWriter, structs.InstanceShellOptions) int); ok { + r0 = rf(_a0, _a1, _a2) + } else { + r0 = ret.Get(0).(int) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, io.ReadWriter, structs.InstanceShellOptions) error); ok { + r1 = rf(_a0, _a1, _a2) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InstanceTerminate provides a mock function with given fields: id +func (_m *Interface) InstanceTerminate(id string) error { + ret := _m.Called(id) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(id) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ObjectDelete provides a mock function with given fields: app, key +func (_m *Interface) ObjectDelete(app string, key string) error { + ret := _m.Called(app, key) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string) error); ok { + r0 = rf(app, key) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ObjectExists provides a mock function with given fields: app, key +func (_m *Interface) ObjectExists(app string, key string) (bool, error) { + ret := _m.Called(app, key) + + var r0 bool + if rf, ok := ret.Get(0).(func(string, string) bool); ok { + r0 = rf(app, key) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(app, key) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ObjectFetch provides a mock function with given fields: app, key +func (_m *Interface) ObjectFetch(app string, key string) (io.ReadCloser, error) { + ret := _m.Called(app, key) + + var r0 io.ReadCloser + if rf, ok := ret.Get(0).(func(string, string) io.ReadCloser); ok { + r0 = rf(app, key) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.ReadCloser) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(app, key) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ObjectList provides a mock function with given fields: app, prefix +func (_m *Interface) ObjectList(app string, prefix string) ([]string, error) { + ret := _m.Called(app, prefix) + + var r0 []string + if rf, ok := ret.Get(0).(func(string, string) []string); ok { + r0 = rf(app, prefix) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(app, prefix) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ObjectStore provides a mock function with given fields: app, key, r, opts +func (_m *Interface) ObjectStore(app string, key string, r io.Reader, opts structs.ObjectStoreOptions) (*structs.Object, error) { + ret := _m.Called(app, key, r, opts) + + var r0 *structs.Object + if rf, ok := ret.Get(0).(func(string, string, io.Reader, structs.ObjectStoreOptions) *structs.Object); ok { + r0 = rf(app, key, r, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Object) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, io.Reader, structs.ObjectStoreOptions) error); ok { + r1 = rf(app, key, r, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessExec provides a mock function with given fields: app, pid, command, rw, opts +func (_m *Interface) ProcessExec(app string, pid string, command string, rw io.ReadWriter, opts structs.ProcessExecOptions) (int, error) { + ret := _m.Called(app, pid, command, rw, opts) + + var r0 int + if rf, ok := ret.Get(0).(func(string, string, string, io.ReadWriter, structs.ProcessExecOptions) int); ok { + r0 = rf(app, pid, command, rw, opts) + } else { + r0 = ret.Get(0).(int) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string, io.ReadWriter, structs.ProcessExecOptions) error); ok { + r1 = rf(app, pid, command, rw, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessGet provides a mock function with given fields: app, pid +func (_m *Interface) ProcessGet(app string, pid string) (*structs.Process, error) { + ret := _m.Called(app, pid) + + var r0 *structs.Process + if rf, ok := ret.Get(0).(func(string, string) *structs.Process); ok { + r0 = rf(app, pid) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Process) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(app, pid) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessList provides a mock function with given fields: app, opts +func (_m *Interface) ProcessList(app string, opts structs.ProcessListOptions) (structs.Processes, error) { + ret := _m.Called(app, opts) + + var r0 structs.Processes + if rf, ok := ret.Get(0).(func(string, structs.ProcessListOptions) structs.Processes); ok { + r0 = rf(app, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Processes) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.ProcessListOptions) error); ok { + r1 = rf(app, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessLogs provides a mock function with given fields: app, pid, opts +func (_m *Interface) ProcessLogs(app string, pid string, opts structs.LogsOptions) (io.ReadCloser, error) { + ret := _m.Called(app, pid, opts) + + var r0 io.ReadCloser + if rf, ok := ret.Get(0).(func(string, string, structs.LogsOptions) io.ReadCloser); ok { + r0 = rf(app, pid, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.ReadCloser) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, structs.LogsOptions) error); ok { + r1 = rf(app, pid, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessRun provides a mock function with given fields: app, service, opts +func (_m *Interface) ProcessRun(app string, service string, opts structs.ProcessRunOptions) (*structs.Process, error) { + ret := _m.Called(app, service, opts) + + var r0 *structs.Process + if rf, ok := ret.Get(0).(func(string, string, structs.ProcessRunOptions) *structs.Process); ok { + r0 = rf(app, service, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Process) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, structs.ProcessRunOptions) error); ok { + r1 = rf(app, service, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessRunAttached provides a mock function with given fields: _a0, _a1, _a2, _a3, _a4 +func (_m *Interface) ProcessRunAttached(_a0 string, _a1 string, _a2 io.ReadWriter, _a3 int, _a4 structs.ProcessRunOptions) (int, error) { + ret := _m.Called(_a0, _a1, _a2, _a3, _a4) + + var r0 int + if rf, ok := ret.Get(0).(func(string, string, io.ReadWriter, int, structs.ProcessRunOptions) int); ok { + r0 = rf(_a0, _a1, _a2, _a3, _a4) + } else { + r0 = ret.Get(0).(int) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, io.ReadWriter, int, structs.ProcessRunOptions) error); ok { + r1 = rf(_a0, _a1, _a2, _a3, _a4) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessRunDetached provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Interface) ProcessRunDetached(_a0 string, _a1 string, _a2 structs.ProcessRunOptions) (string, error) { + ret := _m.Called(_a0, _a1, _a2) + + var r0 string + if rf, ok := ret.Get(0).(func(string, string, structs.ProcessRunOptions) string); ok { + r0 = rf(_a0, _a1, _a2) + } else { + r0 = ret.Get(0).(string) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, structs.ProcessRunOptions) error); ok { + r1 = rf(_a0, _a1, _a2) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessStop provides a mock function with given fields: app, pid +func (_m *Interface) ProcessStop(app string, pid string) error { + ret := _m.Called(app, pid) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string) error); ok { + r0 = rf(app, pid) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Proxy provides a mock function with given fields: host, port, rw, opts +func (_m *Interface) Proxy(host string, port int, rw io.ReadWriter, opts structs.ProxyOptions) error { + ret := _m.Called(host, port, rw, opts) + + var r0 error + if rf, ok := ret.Get(0).(func(string, int, io.ReadWriter, structs.ProxyOptions) error); ok { + r0 = rf(host, port, rw, opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RegistryAdd provides a mock function with given fields: server, username, password +func (_m *Interface) RegistryAdd(server string, username string, password string) (*structs.Registry, error) { + ret := _m.Called(server, username, password) + + var r0 *structs.Registry + if rf, ok := ret.Get(0).(func(string, string, string) *structs.Registry); ok { + r0 = rf(server, username, password) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Registry) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string) error); ok { + r1 = rf(server, username, password) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RegistryList provides a mock function with given fields: +func (_m *Interface) RegistryList() (structs.Registries, error) { + ret := _m.Called() + + var r0 structs.Registries + if rf, ok := ret.Get(0).(func() structs.Registries); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Registries) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RegistryRemove provides a mock function with given fields: server +func (_m *Interface) RegistryRemove(server string) error { + ret := _m.Called(server) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(server) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RegistryRemoveClassic provides a mock function with given fields: _a0 +func (_m *Interface) RegistryRemoveClassic(_a0 string) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ReleaseCreate provides a mock function with given fields: app, opts +func (_m *Interface) ReleaseCreate(app string, opts structs.ReleaseCreateOptions) (*structs.Release, error) { + ret := _m.Called(app, opts) + + var r0 *structs.Release + if rf, ok := ret.Get(0).(func(string, structs.ReleaseCreateOptions) *structs.Release); ok { + r0 = rf(app, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Release) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.ReleaseCreateOptions) error); ok { + r1 = rf(app, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ReleaseGet provides a mock function with given fields: app, id +func (_m *Interface) ReleaseGet(app string, id string) (*structs.Release, error) { + ret := _m.Called(app, id) + + var r0 *structs.Release + if rf, ok := ret.Get(0).(func(string, string) *structs.Release); ok { + r0 = rf(app, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Release) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(app, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ReleaseList provides a mock function with given fields: app, opts +func (_m *Interface) ReleaseList(app string, opts structs.ReleaseListOptions) (structs.Releases, error) { + ret := _m.Called(app, opts) + + var r0 structs.Releases + if rf, ok := ret.Get(0).(func(string, structs.ReleaseListOptions) structs.Releases); ok { + r0 = rf(app, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Releases) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.ReleaseListOptions) error); ok { + r1 = rf(app, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ReleasePromote provides a mock function with given fields: app, id, opts +func (_m *Interface) ReleasePromote(app string, id string, opts structs.ReleasePromoteOptions) error { + ret := _m.Called(app, id, opts) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, structs.ReleasePromoteOptions) error); ok { + r0 = rf(app, id, opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ResourceConsole provides a mock function with given fields: app, name, rw, opts +func (_m *Interface) ResourceConsole(app string, name string, rw io.ReadWriter, opts structs.ResourceConsoleOptions) error { + ret := _m.Called(app, name, rw, opts) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, io.ReadWriter, structs.ResourceConsoleOptions) error); ok { + r0 = rf(app, name, rw, opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ResourceCreateClassic provides a mock function with given fields: _a0, _a1 +func (_m *Interface) ResourceCreateClassic(_a0 string, _a1 structs.ResourceCreateOptions) (*structs.Resource, error) { + ret := _m.Called(_a0, _a1) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, structs.ResourceCreateOptions) *structs.Resource); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.ResourceCreateOptions) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ResourceExport provides a mock function with given fields: app, name +func (_m *Interface) ResourceExport(app string, name string) (io.ReadCloser, error) { + ret := _m.Called(app, name) + + var r0 io.ReadCloser + if rf, ok := ret.Get(0).(func(string, string) io.ReadCloser); ok { + r0 = rf(app, name) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.ReadCloser) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(app, name) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ResourceGet provides a mock function with given fields: app, name +func (_m *Interface) ResourceGet(app string, name string) (*structs.Resource, error) { + ret := _m.Called(app, name) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, string) *structs.Resource); ok { + r0 = rf(app, name) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(app, name) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ResourceImport provides a mock function with given fields: app, name, r +func (_m *Interface) ResourceImport(app string, name string, r io.Reader) error { + ret := _m.Called(app, name, r) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, io.Reader) error); ok { + r0 = rf(app, name, r) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ResourceList provides a mock function with given fields: app +func (_m *Interface) ResourceList(app string) (structs.Resources, error) { + ret := _m.Called(app) + + var r0 structs.Resources + if rf, ok := ret.Get(0).(func(string) structs.Resources); ok { + r0 = rf(app) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Resources) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(app) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ResourceUpdateClassic provides a mock function with given fields: _a0, _a1 +func (_m *Interface) ResourceUpdateClassic(_a0 string, _a1 structs.ResourceUpdateOptions) (*structs.Resource, error) { + ret := _m.Called(_a0, _a1) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, structs.ResourceUpdateOptions) *structs.Resource); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.ResourceUpdateOptions) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ServiceList provides a mock function with given fields: app +func (_m *Interface) ServiceList(app string) (structs.Services, error) { + ret := _m.Called(app) + + var r0 structs.Services + if rf, ok := ret.Get(0).(func(string) structs.Services); ok { + r0 = rf(app) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Services) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(app) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ServiceRestart provides a mock function with given fields: app, name +func (_m *Interface) ServiceRestart(app string, name string) error { + ret := _m.Called(app, name) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string) error); ok { + r0 = rf(app, name) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ServiceUpdate provides a mock function with given fields: app, name, opts +func (_m *Interface) ServiceUpdate(app string, name string, opts structs.ServiceUpdateOptions) error { + ret := _m.Called(app, name, opts) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, structs.ServiceUpdateOptions) error); ok { + r0 = rf(app, name, opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Start provides a mock function with given fields: +func (_m *Interface) Start() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SystemGet provides a mock function with given fields: +func (_m *Interface) SystemGet() (*structs.System, error) { + ret := _m.Called() + + var r0 *structs.System + if rf, ok := ret.Get(0).(func() *structs.System); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.System) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemInstall provides a mock function with given fields: w, opts +func (_m *Interface) SystemInstall(w io.Writer, opts structs.SystemInstallOptions) (string, error) { + ret := _m.Called(w, opts) + + var r0 string + if rf, ok := ret.Get(0).(func(io.Writer, structs.SystemInstallOptions) string); ok { + r0 = rf(w, opts) + } else { + r0 = ret.Get(0).(string) + } + + var r1 error + if rf, ok := ret.Get(1).(func(io.Writer, structs.SystemInstallOptions) error); ok { + r1 = rf(w, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemLogs provides a mock function with given fields: opts +func (_m *Interface) SystemLogs(opts structs.LogsOptions) (io.ReadCloser, error) { + ret := _m.Called(opts) + + var r0 io.ReadCloser + if rf, ok := ret.Get(0).(func(structs.LogsOptions) io.ReadCloser); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.ReadCloser) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(structs.LogsOptions) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemMetrics provides a mock function with given fields: opts +func (_m *Interface) SystemMetrics(opts structs.MetricsOptions) (structs.Metrics, error) { + ret := _m.Called(opts) + + var r0 structs.Metrics + if rf, ok := ret.Get(0).(func(structs.MetricsOptions) structs.Metrics); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Metrics) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(structs.MetricsOptions) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemProcesses provides a mock function with given fields: opts +func (_m *Interface) SystemProcesses(opts structs.SystemProcessesOptions) (structs.Processes, error) { + ret := _m.Called(opts) + + var r0 structs.Processes + if rf, ok := ret.Get(0).(func(structs.SystemProcessesOptions) structs.Processes); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Processes) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(structs.SystemProcessesOptions) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemReleases provides a mock function with given fields: +func (_m *Interface) SystemReleases() (structs.Releases, error) { + ret := _m.Called() + + var r0 structs.Releases + if rf, ok := ret.Get(0).(func() structs.Releases); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Releases) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceCreate provides a mock function with given fields: kind, opts +func (_m *Interface) SystemResourceCreate(kind string, opts structs.ResourceCreateOptions) (*structs.Resource, error) { + ret := _m.Called(kind, opts) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, structs.ResourceCreateOptions) *structs.Resource); ok { + r0 = rf(kind, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.ResourceCreateOptions) error); ok { + r1 = rf(kind, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceCreateClassic provides a mock function with given fields: _a0, _a1 +func (_m *Interface) SystemResourceCreateClassic(_a0 string, _a1 structs.ResourceCreateOptions) (*structs.Resource, error) { + ret := _m.Called(_a0, _a1) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, structs.ResourceCreateOptions) *structs.Resource); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.ResourceCreateOptions) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceDelete provides a mock function with given fields: name +func (_m *Interface) SystemResourceDelete(name string) error { + ret := _m.Called(name) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(name) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SystemResourceDeleteClassic provides a mock function with given fields: _a0 +func (_m *Interface) SystemResourceDeleteClassic(_a0 string) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SystemResourceGet provides a mock function with given fields: name +func (_m *Interface) SystemResourceGet(name string) (*structs.Resource, error) { + ret := _m.Called(name) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string) *structs.Resource); ok { + r0 = rf(name) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(name) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceGetClassic provides a mock function with given fields: _a0 +func (_m *Interface) SystemResourceGetClassic(_a0 string) (*structs.Resource, error) { + ret := _m.Called(_a0) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string) *structs.Resource); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceLink provides a mock function with given fields: name, app +func (_m *Interface) SystemResourceLink(name string, app string) (*structs.Resource, error) { + ret := _m.Called(name, app) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, string) *structs.Resource); ok { + r0 = rf(name, app) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(name, app) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceLinkClassic provides a mock function with given fields: _a0, _a1 +func (_m *Interface) SystemResourceLinkClassic(_a0 string, _a1 string) (*structs.Resource, error) { + ret := _m.Called(_a0, _a1) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, string) *structs.Resource); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceList provides a mock function with given fields: +func (_m *Interface) SystemResourceList() (structs.Resources, error) { + ret := _m.Called() + + var r0 structs.Resources + if rf, ok := ret.Get(0).(func() structs.Resources); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Resources) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceListClassic provides a mock function with given fields: +func (_m *Interface) SystemResourceListClassic() (structs.Resources, error) { + ret := _m.Called() + + var r0 structs.Resources + if rf, ok := ret.Get(0).(func() structs.Resources); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Resources) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceTypes provides a mock function with given fields: +func (_m *Interface) SystemResourceTypes() (structs.ResourceTypes, error) { + ret := _m.Called() + + var r0 structs.ResourceTypes + if rf, ok := ret.Get(0).(func() structs.ResourceTypes); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.ResourceTypes) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceTypesClassic provides a mock function with given fields: +func (_m *Interface) SystemResourceTypesClassic() (structs.ResourceTypes, error) { + ret := _m.Called() + + var r0 structs.ResourceTypes + if rf, ok := ret.Get(0).(func() structs.ResourceTypes); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.ResourceTypes) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceUnlink provides a mock function with given fields: name, app +func (_m *Interface) SystemResourceUnlink(name string, app string) (*structs.Resource, error) { + ret := _m.Called(name, app) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, string) *structs.Resource); ok { + r0 = rf(name, app) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(name, app) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceUnlinkClassic provides a mock function with given fields: _a0, _a1 +func (_m *Interface) SystemResourceUnlinkClassic(_a0 string, _a1 string) (*structs.Resource, error) { + ret := _m.Called(_a0, _a1) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, string) *structs.Resource); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceUpdate provides a mock function with given fields: name, opts +func (_m *Interface) SystemResourceUpdate(name string, opts structs.ResourceUpdateOptions) (*structs.Resource, error) { + ret := _m.Called(name, opts) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, structs.ResourceUpdateOptions) *structs.Resource); ok { + r0 = rf(name, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.ResourceUpdateOptions) error); ok { + r1 = rf(name, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemResourceUpdateClassic provides a mock function with given fields: _a0, _a1 +func (_m *Interface) SystemResourceUpdateClassic(_a0 string, _a1 structs.ResourceUpdateOptions) (*structs.Resource, error) { + ret := _m.Called(_a0, _a1) + + var r0 *structs.Resource + if rf, ok := ret.Get(0).(func(string, structs.ResourceUpdateOptions) *structs.Resource); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*structs.Resource) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, structs.ResourceUpdateOptions) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SystemUninstall provides a mock function with given fields: name, w, opts +func (_m *Interface) SystemUninstall(name string, w io.Writer, opts structs.SystemUninstallOptions) error { + ret := _m.Called(name, w, opts) + + var r0 error + if rf, ok := ret.Get(0).(func(string, io.Writer, structs.SystemUninstallOptions) error); ok { + r0 = rf(name, w, opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SystemUpdate provides a mock function with given fields: opts +func (_m *Interface) SystemUpdate(opts structs.SystemUpdateOptions) error { + ret := _m.Called(opts) + + var r0 error + if rf, ok := ret.Get(0).(func(structs.SystemUpdateOptions) error); ok { + r0 = rf(opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// WithContext provides a mock function with given fields: ctx +func (_m *Interface) WithContext(ctx context.Context) structs.Provider { + ret := _m.Called(ctx) + + var r0 structs.Provider + if rf, ok := ret.Get(0).(func(context.Context) structs.Provider); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(structs.Provider) + } + } + + return r0 +} + +// Workers provides a mock function with given fields: +func (_m *Interface) Workers() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/pkg/mock/start/interface.go b/pkg/mock/start/interface.go new file mode 100644 index 0000000..c2fb183 --- /dev/null +++ b/pkg/mock/start/interface.go @@ -0,0 +1,31 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package sdk + +import ( + context "context" + io "io" + + mock "github.com/stretchr/testify/mock" + + start "github.com/convox/convox/pkg/start" +) + +// Interface is an autogenerated mock type for the Interface type +type Interface struct { + mock.Mock +} + +// Start2 provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Interface) Start2(_a0 context.Context, _a1 io.Writer, _a2 start.Options2) error { + ret := _m.Called(_a0, _a1, _a2) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, io.Writer, start.Options2) error); ok { + r0 = rf(_a0, _a1, _a2) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/pkg/mock/stdcli/executor.go b/pkg/mock/stdcli/executor.go new file mode 100644 index 0000000..9dc1253 --- /dev/null +++ b/pkg/mock/stdcli/executor.go @@ -0,0 +1,86 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package stdcli + +import ( + io "io" + + mock "github.com/stretchr/testify/mock" +) + +// Executor is an autogenerated mock type for the Executor type +type Executor struct { + mock.Mock +} + +// Execute provides a mock function with given fields: cmd, args +func (_m *Executor) Execute(cmd string, args ...string) ([]byte, error) { + _va := make([]interface{}, len(args)) + for _i := range args { + _va[_i] = args[_i] + } + var _ca []interface{} + _ca = append(_ca, cmd) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 []byte + if rf, ok := ret.Get(0).(func(string, ...string) []byte); ok { + r0 = rf(cmd, args...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, ...string) error); ok { + r1 = rf(cmd, args...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Run provides a mock function with given fields: w, cmd, args +func (_m *Executor) Run(w io.Writer, cmd string, args ...string) error { + _va := make([]interface{}, len(args)) + for _i := range args { + _va[_i] = args[_i] + } + var _ca []interface{} + _ca = append(_ca, w, cmd) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(io.Writer, string, ...string) error); ok { + r0 = rf(w, cmd, args...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Terminal provides a mock function with given fields: cmd, args +func (_m *Executor) Terminal(cmd string, args ...string) error { + _va := make([]interface{}, len(args)) + for _i := range args { + _va[_i] = args[_i] + } + var _ca []interface{} + _ca = append(_ca, cmd) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(string, ...string) error); ok { + r0 = rf(cmd, args...) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/pkg/prefix/writer.go b/pkg/prefix/writer.go new file mode 100644 index 0000000..caf4bd0 --- /dev/null +++ b/pkg/prefix/writer.go @@ -0,0 +1,75 @@ +package prefix + +import ( + "bufio" + "fmt" + "io" + "sync" +) + +const ( + ScannerStartSize = 4096 + ScannerMaxSize = 20 * 1024 * 1024 +) + +type Writer struct { + lock sync.Mutex + max int + prefixes map[string]string + writer io.Writer +} + +func NewWriter(w io.Writer, prefixes map[string]string) Writer { + max := 0 + + for k := range prefixes { + if l := len(k); l > max { + max = l + } + } + + return Writer{max: max, prefixes: prefixes, writer: w} +} + +func (w Writer) Write(prefix string, r io.Reader) { + s := bufio.NewScanner(r) + + s.Buffer(make([]byte, ScannerStartSize), ScannerMaxSize) + + for s.Scan() { + w.Writef(prefix, "%s\n", s.Text()) + } + + if err := s.Err(); err != nil { + w.Writef(prefix, "scan error: %s\n", err) + } +} + +func (w Writer) Writer(prefix string) io.Writer { + rr, ww := io.Pipe() + + go w.Write(prefix, rr) + + return ww +} + +func (w Writer) Writef(prefix string, format string, args ...interface{}) { + w.lock.Lock() + defer w.lock.Unlock() + + line := fmt.Sprintf(w.format(prefix), prefix, fmt.Sprintf(format, args...)) + + fmt.Fprintf(w.writer, "%s", line) +} + +func (w Writer) format(prefix string) string { + ot := "" + ct := "" + + if t := w.prefixes[prefix]; t != "" { + ot = fmt.Sprintf("<%s>", t) + ct = fmt.Sprintf("", t) + } + + return fmt.Sprintf("%s%%-%ds%s | %%s", ot, w.max, ct) +} diff --git a/pkg/start/gen2.go b/pkg/start/gen2.go new file mode 100644 index 0000000..b811b70 --- /dev/null +++ b/pkg/start/gen2.go @@ -0,0 +1,806 @@ +package start + +import ( + "archive/tar" + "bufio" + "bytes" + "context" + "crypto/tls" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "path/filepath" + "regexp" + "strings" + "sync" + "time" + + "github.com/pkg/errors" + + "github.com/convox/changes" + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/manifest" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/prefix" + "github.com/convox/convox/pkg/structs" + "github.com/docker/docker/builder/dockerignore" +) + +const ( + ScannerStartSize = 4096 + ScannerMaxSize = 20 * 1024 * 1024 +) + +var ( + reAppLog = regexp.MustCompile(`^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})Z ([^/]+)/([^/]+)/([^ ]+) (.*)$`) + reDockerOption = regexp.MustCompile("--([a-z]+)") +) + +type Options2 struct { + App string + Build bool + Cache bool + Manifest string + Provider structs.Provider + Services []string + Sync bool + Test bool +} + +type buildSource struct { + Local string + Remote string +} + +func (s *Start) Start2(ctx context.Context, w io.Writer, opts Options2) error { + select { + case <-ctx.Done(): + return nil + default: + } + + if opts.App == "" { + return errors.WithStack(fmt.Errorf("app required")) + } + + a, err := opts.Provider.AppGet(opts.App) + if err != nil { + if _, err := opts.Provider.AppCreate(opts.App, structs.AppCreateOptions{Generation: options.String("2")}); err != nil { + return errors.WithStack(err) + } + } else { + if a.Generation != "2" && a.Generation != "3" { + return errors.WithStack(fmt.Errorf("invalid generation: %s", a.Generation)) + } + } + + data, err := ioutil.ReadFile(common.CoalesceString(opts.Manifest, "convox.yml")) + if err != nil { + return errors.WithStack(err) + } + + env, err := common.AppEnvironment(opts.Provider, opts.App) + if err != nil { + return errors.WithStack(err) + } + + m, err := manifest.Load(data, env) + if err != nil { + return errors.WithStack(err) + } + + services := map[string]bool{} + + if opts.Services == nil { + for _, s := range m.Services { + services[s.Name] = true + } + } else { + for _, s := range opts.Services { + services[s] = true + } + } + + pw := prefixWriter(w, services) + + if opts.Build { + pw.Writef("build", "uploading source\n") + + data, err := common.Tarball(".") + if err != nil { + return errors.WithStack(err) + } + + o, err := opts.Provider.ObjectStore(opts.App, "", bytes.NewReader(data), structs.ObjectStoreOptions{}) + if err != nil { + return errors.WithStack(err) + } + + pw.Writef("build", "starting build\n") + + bopts := structs.BuildCreateOptions{Development: options.Bool(true)} + + if opts.Manifest != "" { + bopts.Manifest = options.String(opts.Manifest) + } + + b, err := opts.Provider.BuildCreate(opts.App, o.Url, bopts) + if err != nil { + return errors.WithStack(err) + } + + logs, err := opts.Provider.BuildLogs(opts.App, b.Id, structs.LogsOptions{}) + if err != nil { + return errors.WithStack(err) + } + + bo := pw.Writer("build") + + go io.Copy(bo, logs) + + if err := opts.waitForBuild(ctx, b.Id); err != nil { + return errors.WithStack(err) + } + + select { + case <-ctx.Done(): + return nil + default: + } + + b, err = opts.Provider.BuildGet(opts.App, b.Id) + if err != nil { + return errors.WithStack(err) + } + + popts := structs.ReleasePromoteOptions{ + Development: options.Bool(true), + Force: options.Bool(true), + Idle: options.Bool(false), + Min: options.Int(0), + Timeout: options.Int(300), + } + + if err := opts.Provider.ReleasePromote(opts.App, b.Release, popts); err != nil { + return errors.WithStack(err) + } + } + + go opts.streamLogs(ctx, pw, services) + + errch := make(chan error) + defer close(errch) + + go handleErrors(ctx, pw, errch) + + wd, err := os.Getwd() + if err != nil { + return errors.WithStack(err) + } + + for _, s := range m.Services { + if !services[s.Name] { + continue + } + + if s.Build.Path != "" { + go opts.watchChanges(ctx, pw, m, s.Name, wd, errch) + } + } + + if err := common.WaitForAppRunningContext(ctx, opts.Provider, opts.App); err != nil { + return err + } + + <-ctx.Done() + + a, err = opts.Provider.AppGet(opts.App) + if err != nil { + return nil + } + + pw.Writef("convox", "stopping\n") + + if a.Release != "" { + popts := structs.ReleasePromoteOptions{ + Development: options.Bool(false), + Force: options.Bool(true), + } + + if err := opts.Provider.ReleasePromote(opts.App, a.Release, popts); err != nil { + return errors.WithStack(err) + } + } + + return nil +} + +func (opts Options2) handleAdds(pid, remote string, adds []changes.Change) error { + if len(adds) == 0 { + return nil + } + + if !filepath.IsAbs(remote) { + var buf bytes.Buffer + + if _, err := opts.Provider.ProcessExec(opts.App, pid, "pwd", &buf, structs.ProcessExecOptions{}); err != nil { + return errors.WithStack(fmt.Errorf("%s pwd: %s", pid, err)) + } + + wd := strings.TrimSpace(buf.String()) + + remote = filepath.Join(wd, remote) + } + + rp, wp := io.Pipe() + + ch := make(chan error) + + go func() { + ch <- opts.Provider.FilesUpload(opts.App, pid, rp) + close(ch) + }() + + tw := tar.NewWriter(wp) + + for _, add := range adds { + local := filepath.Join(add.Base, add.Path) + + stat, err := os.Stat(local) + if err != nil { + // skip transient files like '.git/.COMMIT_EDITMSG.swp' + if os.IsNotExist(err) { + continue + } + + return errors.WithStack(err) + } + + tw.WriteHeader(&tar.Header{ + Name: filepath.Join(remote, add.Path), + Mode: int64(stat.Mode()), + Size: stat.Size(), + ModTime: stat.ModTime(), + }) + + fd, err := os.Open(local) + if err != nil { + return errors.WithStack(err) + } + + defer fd.Close() + + if _, err := io.Copy(tw, fd); err != nil { + return errors.WithStack(err) + } + + fd.Close() + } + + if err := tw.Close(); err != nil { + return errors.WithStack(err) + } + + if err := wp.Close(); err != nil { + return errors.WithStack(err) + } + + return <-ch +} + +func (opts Options2) handleRemoves(pid string, removes []changes.Change) error { + if len(removes) == 0 { + return nil + } + + return opts.Provider.FilesDelete(opts.App, pid, changes.Files(removes)) +} + +func (opts Options2) healthCheck(ctx context.Context, pw prefix.Writer, s manifest.Service, errch chan error, wg *sync.WaitGroup) { + rss, err := opts.Provider.ServiceList(opts.App) + if err != nil { + errch <- err + return + } + + hostname := "" + + for _, rs := range rss { + if rs.Name == s.Name { + hostname = rs.Domain + } + } + + if hostname == "" { + errch <- fmt.Errorf("could not find hostname for service: %s", s.Name) + return + } + + pw.Writef("convox", "starting health check for %s on path %s with %ds interval, %ds grace\n", s.Name, s.Health.Path, s.Health.Interval, s.Health.Grace) + + wg.Done() + + hcu := fmt.Sprintf("https://%s%s", hostname, s.Health.Path) + + grace := time.Duration(s.Health.Grace) * time.Second + interval := time.Duration(s.Health.Interval) * time.Second + + if opts.Test { + grace = 5 * time.Millisecond + interval = 5 * time.Millisecond + } + + time.Sleep(grace) + + tick := time.Tick(interval) + + c := &http.Client{ + Timeout: time.Duration(s.Health.Timeout) * time.Second, + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + }, + } + + // previous status code + var ps int + + for { + select { + case <-ctx.Done(): + return + case <-tick: + res, err := c.Get(hcu) + if err != nil { + pw.Writef("convox", "health check %s: %s\n", s.Name, err.Error()) + continue + } + defer res.Body.Close() + + if res.StatusCode < 200 || res.StatusCode > 399 { + pw.Writef("convox", "health check %s: %d\n", s.Name, res.StatusCode) + } else if res.StatusCode != ps { + pw.Writef("convox", "health check %s: %d\n", s.Name, res.StatusCode) + } + + ps = res.StatusCode + } + } +} + +func (opts Options2) stopProcess(pid string, wg *sync.WaitGroup) { + defer wg.Done() + opts.Provider.ProcessStop(opts.App, pid) +} + +func (opts Options2) streamLogs(ctx context.Context, pw prefix.Writer, services map[string]bool) { + for { + select { + case <-ctx.Done(): + return + default: + logs, err := opts.Provider.AppLogs(opts.App, structs.LogsOptions{Prefix: options.Bool(true), Since: options.Duration(1 * time.Second)}) + if err == nil { + writeLogs(ctx, pw, logs, services) + } + + select { + case <-ctx.Done(): + return + default: + time.Sleep(1 * time.Second) + } + } + } +} + +func (opts Options2) waitForBuild(ctx context.Context, id string) error { + tick := time.Tick(1 * time.Second) + + for { + select { + case <-ctx.Done(): + return nil + case <-tick: + b, err := opts.Provider.BuildGet(opts.App, id) + if err != nil { + return errors.WithStack(err) + } + + switch b.Status { + case "created", "running": + break + case "complete": + return nil + case "failed": + return errors.WithStack(fmt.Errorf("build failed")) + default: + return errors.WithStack(fmt.Errorf("unknown build status: %s", b.Status)) + } + } + } +} + +func (opts Options2) watchChanges(ctx context.Context, pw prefix.Writer, m *manifest.Manifest, service, root string, ch chan error) { + bss, err := buildSources(m, root, service) + if err != nil { + ch <- fmt.Errorf("sync error: %s", err) + return + } + + ignores, err := buildIgnores(root, service) + if err != nil { + ch <- fmt.Errorf("sync error: %s", err) + return + } + + for _, bs := range bss { + go opts.watchPath(ctx, pw, service, root, bs, ignores, ch) + } +} + +func (opts Options2) watchPath(ctx context.Context, pw prefix.Writer, service, root string, bs buildSource, ignores []string, ch chan error) { + cch := make(chan changes.Change, 1) + + abs, err := filepath.Abs(bs.Local) + if err != nil { + ch <- fmt.Errorf("sync error: %s", err) + return + } + + wd, err := os.Getwd() + if err != nil { + ch <- fmt.Errorf("sync error: %s", err) + return + } + + rel, err := filepath.Rel(wd, bs.Local) + if err != nil { + ch <- fmt.Errorf("sync error: %s", err) + return + } + + pw.Writef("convox", "starting sync from %s to %s on %s\n", rel, common.CoalesceString(bs.Remote, "."), service) + + go changes.Watch(abs, cch, changes.WatchOptions{ + Ignores: ignores, + }) + + tick := time.Tick(1000 * time.Millisecond) + chgs := []changes.Change{} + + for { + select { + case <-ctx.Done(): + return + case c := <-cch: + chgs = append(chgs, c) + case <-tick: + if len(chgs) == 0 { + continue + } + + pss, err := opts.Provider.ProcessList(opts.App, structs.ProcessListOptions{Service: options.String(service)}) + if err != nil { + pw.Writef("convox", "sync error: %s\n", err) + continue + } + + adds, removes := changes.Partition(chgs) + + for _, ps := range pss { + switch { + case len(adds) > 3: + pw.Writef("convox", "sync: %d files to %s on %s\n", len(adds), common.CoalesceString(bs.Remote, "."), service) + case len(adds) > 0: + for _, a := range adds { + pw.Writef("convox", "sync: %s to %s on %s\n", a.Path, common.CoalesceString(bs.Remote, "."), service) + } + } + + if err := opts.handleAdds(ps.Id, bs.Remote, adds); err != nil { + pw.Writef("convox", "sync add error: %s\n", err) + } + + switch { + case len(removes) > 3: + pw.Writef("convox", "remove: %d files from %s to %s\n", len(removes), common.CoalesceString(bs.Remote, "."), service) + case len(removes) > 0: + for _, r := range removes { + pw.Writef("convox", "remove: %s from %s on %s\n", r.Path, common.CoalesceString(bs.Remote, "."), service) + } + } + + if err := opts.handleRemoves(ps.Id, removes); err != nil { + pw.Writef("convox", "sync remove error: %s\n", err) + } + } + + chgs = []changes.Change{} + } + } +} + +func buildDockerfile(m *manifest.Manifest, root, service string) ([]byte, error) { + s, err := m.Service(service) + if err != nil { + return nil, errors.WithStack(err) + } + + if s.Image != "" { + return nil, nil + } + + path, err := filepath.Abs(filepath.Join(root, s.Build.Path, s.Build.Manifest)) + if err != nil { + return nil, errors.WithStack(err) + } + + if _, err := os.Stat(path); os.IsNotExist(err) { + return nil, errors.WithStack(fmt.Errorf("no such file: %s", filepath.Join(s.Build.Path, s.Build.Manifest))) + } + + return ioutil.ReadFile(path) +} + +func buildIgnores(root, service string) ([]string, error) { + fd, err := os.Open(filepath.Join(root, ".dockerignore")) + if os.IsNotExist(err) { + return []string{}, nil + } + if err != nil { + return nil, errors.WithStack(err) + } + + return dockerignore.ReadAll(fd) +} + +func buildSources(m *manifest.Manifest, root, service string) ([]buildSource, error) { + data, err := buildDockerfile(m, root, service) + if err != nil { + return nil, errors.WithStack(err) + } + if data == nil { + return []buildSource{}, nil + } + + svc, err := m.Service(service) + if err != nil { + return nil, errors.WithStack(err) + } + + bs := []buildSource{} + env := map[string]string{} + wd := "" + + s := bufio.NewScanner(bytes.NewReader(data)) + +lines: + for s.Scan() { + parts := strings.Fields(s.Text()) + + if len(parts) < 1 { + continue + } + + switch strings.ToUpper(parts[0]) { + case "ADD", "COPY": + for i, p := range parts { + if m := reDockerOption.FindStringSubmatch(p); len(m) > 1 { + switch strings.ToLower(m[1]) { + case "from": + continue lines + default: + parts = append(parts[:i], parts[i+1:]...) + } + } + } + + if len(parts) > 2 { + u, err := url.Parse(parts[1]) + if err != nil { + return nil, errors.WithStack(err) + } + + if strings.HasPrefix(parts[1], "--from") { + continue + } + + switch u.Scheme { + case "http", "https": + // do nothing + default: + local := filepath.Join(svc.Build.Path, parts[1]) + remote := replaceEnv(parts[2], env) + + if wd != "" && !filepath.IsAbs(remote) { + remote = filepath.Join(wd, remote) + } + + bs = append(bs, buildSource{Local: local, Remote: remote}) + } + } + case "ENV": + if len(parts) > 2 { + env[parts[1]] = parts[2] + } + case "FROM": + if len(parts) > 1 { + var ee []string + + data, err := Exec.Execute("docker", "inspect", parts[1], "--format", "{{json .Config.Env}}") + if err != nil { + continue + } + + if err := json.Unmarshal(data, &ee); err != nil { + return nil, errors.WithStack(err) + } + + for _, e := range ee { + parts := strings.SplitN(e, "=", 2) + + if len(parts) == 2 { + env[parts[0]] = parts[1] + } + } + + data, err = Exec.Execute("docker", "inspect", parts[1], "--format", "{{.Config.WorkingDir}}") + if err != nil { + return nil, errors.WithStack(err) + } + + wd = strings.TrimSpace(string(data)) + } + case "WORKDIR": + if len(parts) > 1 { + wd = replaceEnv(parts[1], env) + } + } + } + + for i := range bs { + abs, err := filepath.Abs(bs[i].Local) + if err != nil { + return nil, errors.WithStack(err) + } + + stat, err := os.Stat(abs) + if err != nil { + return nil, errors.WithStack(err) + } + + if stat.IsDir() && !strings.HasSuffix(abs, "/") { + abs = abs + "/" + } + + bs[i].Local = abs + + if bs[i].Remote == "." { + bs[i].Remote = wd + } + } + + bss := []buildSource{} + + for i := range bs { + contained := false + + for j := i + 1; j < len(bs); j++ { + if strings.HasPrefix(bs[i].Local, bs[j].Local) { + if bs[i].Remote == bs[j].Remote { + contained = true + break + } + + rl, err := filepath.Rel(bs[j].Local, bs[i].Local) + if err != nil { + return nil, errors.WithStack(err) + } + + rr, err := filepath.Rel(bs[j].Remote, bs[i].Remote) + if err != nil { + return nil, errors.WithStack(err) + } + + if rl == rr { + contained = true + break + } + } + } + + if !contained { + bss = append(bss, bs[i]) + } + } + + return bss, nil +} + +type stackTracer interface { + StackTrace() errors.StackTrace +} + +func handleErrors(ctx context.Context, pw prefix.Writer, errch chan error) { + for { + select { + case <-ctx.Done(): + return + case err := <-errch: + if err != nil { + pw.Writef("convox", "error: %s\n", err) + } + } + } +} + +func replaceEnv(s string, env map[string]string) string { + for k, v := range env { + s = strings.Replace(s, fmt.Sprintf("${%s}", k), v, -1) + s = strings.Replace(s, fmt.Sprintf("$%s", k), v, -1) + } + + return s +} + +var ansiScreenSequences = []*regexp.Regexp{ + regexp.MustCompile("\033\\[\\d+;\\d+H"), +} + +func stripANSIScreenCommands(data string) string { + for _, r := range ansiScreenSequences { + data = r.ReplaceAllString(data, "") + } + + return data +} + +func writeLogs(ctx context.Context, pw prefix.Writer, r io.Reader, services map[string]bool) { + ls := bufio.NewScanner(r) + + ls.Buffer(make([]byte, ScannerStartSize), ScannerMaxSize) + + for ls.Scan() { + select { + case <-ctx.Done(): + return + default: + match := reAppLog.FindStringSubmatch(ls.Text()) + + if len(match) != 7 { + continue + } + + switch match[3] { + case "service": + service := match[4] + + if !services[service] { + continue + } + + stripped := stripANSIScreenCommands(match[6]) + + pw.Writef(service, "%s\n", stripped) + case "system": + service := strings.Split(match[5], "-")[0] + + if !services[service] { + continue + } + + pw.Writef(service, "%s\n", match[6]) + } + } + } + + if err := ls.Err(); err != nil { + pw.Writef("convox", "scan error: %s\n", err) + } +} diff --git a/pkg/start/gen2_test.go b/pkg/start/gen2_test.go new file mode 100644 index 0000000..f4f0ac6 --- /dev/null +++ b/pkg/start/gen2_test.go @@ -0,0 +1,141 @@ +package start_test + +import ( + "bytes" + "context" + "io/ioutil" + "os" + "strings" + "testing" + "time" + + "github.com/convox/exec" + "github.com/convox/convox/pkg/common" + "github.com/convox/convox/pkg/options" + "github.com/convox/convox/pkg/start" + "github.com/convox/convox/pkg/structs" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestStart2(t *testing.T) { + p := &structs.MockProvider{} + + mhc := mockHealthCheck(func(n int) int { + return 200 + }) + defer mhc.Close() + + logs := "0000-00-00T00:00:00Z service/web/pid1 log1\n0000-00-00T00:00:00Z service/web/pid1 log2\n" + + p.On("AppGet", "app1").Return(&structs.App{Name: "app1", Generation: "2"}, nil) + p.On("ReleaseList", "app1", structs.ReleaseListOptions{Limit: options.Int(1)}).Return(structs.Releases{{Id: "release1"}}, nil) + p.On("ReleaseGet", "app1", "release1").Return(&structs.Release{}, nil) + p.On("AppLogs", "app1", structs.LogsOptions{Prefix: options.Bool(true), Since: options.Duration(1 * time.Second)}).Return(ioutil.NopCloser(strings.NewReader(logs)), nil) + + e := &exec.MockInterface{} + start.Exec = e + + e.On("Execute", "docker", "inspect", "httpd", "--format", "{{json .Config.Env}}").Return([]byte(`["FOO=bar","BAZ=qux"]`), nil) + e.On("Execute", "docker", "inspect", "httpd", "--format", "{{.Config.WorkingDir}}").Return([]byte(`/app/foo`), nil) + + cwd, err := os.Getwd() + require.NoError(t, err) + os.Chdir("testdata/httpd") + defer os.Chdir(cwd) + + s := start.New() + + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + + buf := bytes.Buffer{} + + opts := start.Options2{ + App: "app1", + Provider: p, + Test: true, + } + + err = s.Start2(ctx, &buf, opts) + require.NoError(t, err) + + require.Equal(t, + []string{ + "web | log1", + "web | log2", + "convox | stopping", + }, + strings.Split(strings.TrimSuffix(buf.String(), "\n"), "\n"), + ) + + p.AssertExpectations(t) + e.AssertExpectations(t) +} + +func TestStart2Options(t *testing.T) { + helpers.ProviderWaitDuration = 1 + + p := &structs.MockProvider{} + + appLogs := "0000-00-00T00:00:00Z service/web/pid1 log1\n0000-00-00T00:00:00Z service/web/pid1 log2\n" + buildLogs := "build1\nbuild2\n" + + p.On("AppGet", "app1").Return(&structs.App{Name: "app1", Generation: "2", Release: "old", Status: "running"}, nil) + p.On("ReleaseList", "app1", structs.ReleaseListOptions{Limit: options.Int(1)}).Return(structs.Releases{{Id: "release1"}}, nil) + p.On("ReleaseGet", "app1", "release1").Return(&structs.Release{}, nil) + p.On("ObjectStore", "app1", "", mock.Anything, structs.ObjectStoreOptions{}).Return(&structs.Object{Url: "object://app1/object1.tgz"}, nil) + p.On("BuildCreate", "app1", "object://app1/object1.tgz", structs.BuildCreateOptions{Development: options.Bool(true), Manifest: options.String("convox2.yml")}).Return(&structs.Build{Id: "build1"}, nil) + p.On("BuildLogs", "app1", "build1", structs.LogsOptions{}).Return(ioutil.NopCloser(strings.NewReader(buildLogs)), nil) + p.On("BuildGet", "app1", "build1").Return(&structs.Build{Id: "build1", Release: "release1", Status: "complete"}, nil) + p.On("ReleasePromote", "app1", "release1", structs.ReleasePromoteOptions{Development: options.Bool(true), Force: options.Bool(true), Idle: options.Bool(false), Min: options.Int(0), Timeout: options.Int(300)}).Return(nil) + p.On("AppLogs", "app1", structs.LogsOptions{Prefix: options.Bool(true), Since: options.Duration(1 * time.Second)}).Return(ioutil.NopCloser(strings.NewReader(appLogs)), nil).Once() + p.On("ReleasePromote", "app1", "old", structs.ReleasePromoteOptions{Development: options.Bool(false), Force: options.Bool(true)}).Return(nil) + + e := &exec.MockInterface{} + start.Exec = e + + e.On("Execute", "docker", "inspect", "httpd", "--format", "{{json .Config.Env}}").Return([]byte(`["FOO=bar","BAZ=qux"]`), nil) + e.On("Execute", "docker", "inspect", "httpd", "--format", "{{.Config.WorkingDir}}").Return([]byte(`/app/foo`), nil) + + cwd, err := os.Getwd() + require.NoError(t, err) + os.Chdir("testdata/httpd") + defer os.Chdir(cwd) + + s := start.New() + + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + + buf := bytes.Buffer{} + + opts := start.Options2{ + App: "app1", + Build: true, + Cache: true, + Manifest: "convox2.yml", + Provider: p, + Sync: true, + Test: true, + } + + err = s.Start2(ctx, &buf, opts) + require.NoError(t, err) + + require.Equal(t, + []string{ + "build | uploading source", + "build | starting build", + "build | build1", + "build | build2", + "web | log1", + "web | log2", + "convox | stopping", + }, + strings.Split(strings.TrimSuffix(buf.String(), "\n"), "\n"), + ) + + p.AssertExpectations(t) + e.AssertExpectations(t) +} diff --git a/pkg/start/start.go b/pkg/start/start.go new file mode 100644 index 0000000..9a9ec3a --- /dev/null +++ b/pkg/start/start.go @@ -0,0 +1,57 @@ +package start + +import ( + "context" + "fmt" + "io" + "os" + "os/signal" + + "github.com/convox/convox/pkg/prefix" + "github.com/convox/exec" +) + +var ( + Exec exec.Interface = &exec.Exec{} +) + +type Interface interface { + Start2(context.Context, io.Writer, Options2) error +} + +type Start struct{} + +func New() Interface { + return &Start{} +} + +func prefixHash(prefix string) int { + sum := 0 + + for c := range prefix { + sum += int(c) + } + + return sum % 18 +} + +func prefixWriter(w io.Writer, services map[string]bool) prefix.Writer { + prefixes := map[string]string{ + "build": "system", + "convox": "system", + } + + for s := range services { + prefixes[s] = fmt.Sprintf("color%d", prefixHash(s)) + } + + return prefix.NewWriter(w, prefixes) +} + +func handleInterrupt(fn func()) { + ch := make(chan os.Signal, 1) + signal.Notify(ch, os.Interrupt, os.Kill) + <-ch + fmt.Println("") + fn() +} diff --git a/pkg/start/start_test.go b/pkg/start/start_test.go new file mode 100644 index 0000000..ebe106b --- /dev/null +++ b/pkg/start/start_test.go @@ -0,0 +1,27 @@ +package start_test + +import ( + "net/http" + "net/http/httptest" +) + +type MockHealthCheck struct { + *httptest.Server + count int + handler func(int) int +} + +func (mhc *MockHealthCheck) Count() int { + return mhc.count +} + +func (mhc *MockHealthCheck) ServeHTTP(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(mhc.handler(mhc.count)) + mhc.count++ +} + +func mockHealthCheck(fn func(n int) int) *MockHealthCheck { + m := &MockHealthCheck{handler: fn} + m.Server = httptest.NewTLSServer(m) + return m +} diff --git a/pkg/start/testdata/httpd/Dockerfile b/pkg/start/testdata/httpd/Dockerfile new file mode 100644 index 0000000..6455161 --- /dev/null +++ b/pkg/start/testdata/httpd/Dockerfile @@ -0,0 +1 @@ +FROM httpd diff --git a/pkg/start/testdata/httpd/Dockerfile2 b/pkg/start/testdata/httpd/Dockerfile2 new file mode 100644 index 0000000..3a968c5 --- /dev/null +++ b/pkg/start/testdata/httpd/Dockerfile2 @@ -0,0 +1,3 @@ +FROM httpd + +ARG FOO=qux diff --git a/pkg/start/testdata/httpd/convox.yml b/pkg/start/testdata/httpd/convox.yml new file mode 100644 index 0000000..3d3ba32 --- /dev/null +++ b/pkg/start/testdata/httpd/convox.yml @@ -0,0 +1,4 @@ +services: + web: + build: . + port: 80 diff --git a/pkg/start/testdata/httpd/convox2.yml b/pkg/start/testdata/httpd/convox2.yml new file mode 100644 index 0000000..e73c3aa --- /dev/null +++ b/pkg/start/testdata/httpd/convox2.yml @@ -0,0 +1,8 @@ +services: + web: + image: httpd + port: 80 + web2: + build: + manifest: Dockerfile2 + path: . diff --git a/pkg/structs/mock_Provider.go b/pkg/structs/mock_Provider.go index cd9fc69..fc432b7 100644 --- a/pkg/structs/mock_Provider.go +++ b/pkg/structs/mock_Provider.go @@ -982,6 +982,43 @@ func (_m *MockProvider) ReleasePromote(app string, id string, opts ReleasePromot return r0 } +// ResourceConsole provides a mock function with given fields: app, name, rw, opts +func (_m *MockProvider) ResourceConsole(app string, name string, rw io.ReadWriter, opts ResourceConsoleOptions) error { + ret := _m.Called(app, name, rw, opts) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, io.ReadWriter, ResourceConsoleOptions) error); ok { + r0 = rf(app, name, rw, opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ResourceExport provides a mock function with given fields: app, name +func (_m *MockProvider) ResourceExport(app string, name string) (io.ReadCloser, error) { + ret := _m.Called(app, name) + + var r0 io.ReadCloser + if rf, ok := ret.Get(0).(func(string, string) io.ReadCloser); ok { + r0 = rf(app, name) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(io.ReadCloser) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(app, name) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // ResourceGet provides a mock function with given fields: app, name func (_m *MockProvider) ResourceGet(app string, name string) (*Resource, error) { ret := _m.Called(app, name) @@ -1005,6 +1042,20 @@ func (_m *MockProvider) ResourceGet(app string, name string) (*Resource, error) return r0, r1 } +// ResourceImport provides a mock function with given fields: app, name, r +func (_m *MockProvider) ResourceImport(app string, name string, r io.Reader) error { + ret := _m.Called(app, name, r) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string, io.Reader) error); ok { + r0 = rf(app, name, r) + } else { + r0 = ret.Error(0) + } + + return r0 +} + // ResourceList provides a mock function with given fields: app func (_m *MockProvider) ResourceList(app string) (Resources, error) { ret := _m.Called(app) diff --git a/pkg/structs/provider.go b/pkg/structs/provider.go index 45c89a5..76db5f5 100644 --- a/pkg/structs/provider.go +++ b/pkg/structs/provider.go @@ -69,7 +69,10 @@ type Provider interface { ReleaseList(app string, opts ReleaseListOptions) (Releases, error) ReleasePromote(app, id string, opts ReleasePromoteOptions) error + ResourceConsole(app, name string, rw io.ReadWriter, opts ResourceConsoleOptions) error + ResourceExport(app, name string) (io.ReadCloser, error) ResourceGet(app, name string) (*Resource, error) + ResourceImport(app, name string, r io.Reader) error ResourceList(app string) (Resources, error) ServiceList(app string) (Services, error) diff --git a/pkg/structs/resource.go b/pkg/structs/resource.go index cb6d771..77d761c 100644 --- a/pkg/structs/resource.go +++ b/pkg/structs/resource.go @@ -39,6 +39,11 @@ func (rps ResourceParameters) Less(i, j int) bool { return rps[i].Name < rps[j].Name } +type ResourceConsoleOptions struct { + Height *int `header:"Height"` + Width *int `header:"Width"` +} + type ResourceCreateOptions struct { Name *string `param:"name"` Parameters map[string]string `param:"parameters"` diff --git a/pkg/structs/routes.go b/pkg/structs/routes.go index e89cff0..299d81e 100644 --- a/pkg/structs/routes.go +++ b/pkg/structs/routes.go @@ -53,7 +53,10 @@ func init() { routes["RegistryAdd"] = "POST /registries" routes["RegistryList"] = "GET /registries" routes["RegistryRemove"] = "DELETE /registries/{server:.*}" + routes["ResourceConsole"] = "SOCKET /apps/{app}/resources/{name}/console" + routes["ResourceExport"] = "GET /apps/{app}/resources/{name}/data" routes["ResourceGet"] = "GET /apps/{app}/resources/{name}" + routes["ResourceImport"] = "PUT /apps/{app}/resources/{name}/data" routes["ResourceList"] = "GET /apps/{app}/resources" routes["ServiceList"] = "GET /apps/{app}/services" routes["ServiceRestart"] = "POST /apps/{app}/services/{name}/restart" diff --git a/pkg/token/token.go b/pkg/token/token.go new file mode 100644 index 0000000..d385509 --- /dev/null +++ b/pkg/token/token.go @@ -0,0 +1,151 @@ +// +build !windows + +package token + +import ( + "context" + "crypto/sha256" + "encoding/base64" + "encoding/json" + "fmt" + "strings" + "time" + + "github.com/convox/hid" + "github.com/convox/u2f/u2fhid" + "github.com/convox/u2f/u2ftoken" +) + +type authenticationKey struct { + AppId string `json:"appId"` + KeyHandle string `json:"keyHandle"` + Version string `json:"version"` +} + +type authenticationRequest struct { + AppId string `json:"appId"` + Challenge string `json:"challenge"` + RegisteredKeys []authenticationKey +} + +type authenticationResponse struct { + ClientData string `json:"clientData"` + KeyHandle string `json:"keyHandle"` + SignatureData string `json:"signatureData"` +} + +type tokenResponse struct { + Error error + Response []byte +} + +func decodeBase64(s string) ([]byte, error) { + for i := 0; i < len(s)%4; i++ { + s += "=" + } + return base64.URLEncoding.DecodeString(s) +} + +func encodeBase64(buf []byte) string { + s := base64.URLEncoding.EncodeToString(buf) + return strings.TrimRight(s, "=") +} + +func Authenticate(req []byte) ([]byte, error) { + var areq authenticationRequest + + if err := json.Unmarshal(req, &areq); err != nil { + return nil, err + } + + ds, err := u2fhid.Devices() + if err != nil { + if err != nil { + return nil, err + } + } + + ch := make(chan tokenResponse) + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + for _, d := range ds { + go authenticateDevice(ctx, d, areq, ch) + } + + for range ds { + res := <-ch + + if res.Error != nil { + return nil, res.Error + } + + if res.Response != nil { + return res.Response, nil + } + } + + return nil, fmt.Errorf("no valid tokens found") +} + +func authenticateDevice(ctx context.Context, d *hid.DeviceInfo, req authenticationRequest, rch chan tokenResponse) { + ud, err := u2fhid.Open(d) + if err != nil { + rch <- tokenResponse{Error: err} + return + } + + cd := []byte(fmt.Sprintf(`{"challenge":"%s","origin":"%s"}`, req.Challenge, req.AppId)) + ch := sha256.Sum256(cd) + + t := u2ftoken.NewToken(ud) + + for _, k := range req.RegisteredKeys { + app := sha256.Sum256([]byte(k.AppId)) + + key, err := decodeBase64(k.KeyHandle) + if err != nil { + rch <- tokenResponse{Error: err} + return + } + + treq := u2ftoken.AuthenticateRequest{ + Application: app[:], + Challenge: ch[:], + KeyHandle: key, + } + + if err := t.CheckAuthenticate(treq); err != nil { + continue + } + + for { + tres, err := t.Authenticate(treq) + if err == u2ftoken.ErrPresenceRequired { + time.Sleep(200 * time.Millisecond) + continue + } + if err != nil { + continue + } + + ares := authenticationResponse{ + ClientData: encodeBase64(cd), + KeyHandle: k.KeyHandle, + SignatureData: encodeBase64(tres.RawResponse), + } + + data, err := json.Marshal(ares) + if err != nil { + rch <- tokenResponse{Error: err} + return + } + + rch <- tokenResponse{Response: data} + return + } + } + + rch <- tokenResponse{} +} diff --git a/pkg/token/token_windows.go b/pkg/token/token_windows.go new file mode 100644 index 0000000..e133fdc --- /dev/null +++ b/pkg/token/token_windows.go @@ -0,0 +1,7 @@ +package token + +import "fmt" + +func Authenticate(req []byte) ([]byte, error) { + return nil, fmt.Errorf("no u2f support on windows") +} diff --git a/provider/k8s/resource.go b/provider/k8s/resource.go index 40ac732..5b53606 100644 --- a/provider/k8s/resource.go +++ b/provider/k8s/resource.go @@ -2,11 +2,87 @@ package k8s import ( "fmt" + "io" + "os/exec" "github.com/convox/convox/pkg/structs" + "github.com/creack/pty" am "k8s.io/apimachinery/pkg/apis/meta/v1" ) +func (p *Provider) ResourceConsole(app, name string, rw io.ReadWriter, opts structs.ResourceConsoleOptions) error { + r, err := p.ResourceGet(app, name) + if err != nil { + return err + } + + switch r.Type { + case "postgres": + return resourceConsoleCommand(rw, opts, "psql", r.Url) + default: + return fmt.Errorf("can not export resources of type: %s", r.Type) + } +} + +func resourceConsoleCommand(rw io.ReadWriter, opts structs.ResourceConsoleOptions, command string, args ...string) error { + cmd := exec.Command(command, args...) + + size := &pty.Winsize{} + + if opts.Height != nil { + size.Rows = uint16(*opts.Height) + } + + if opts.Width != nil { + size.Cols = uint16(*opts.Width) + } + + fd, err := pty.StartWithSize(cmd, size) + if err != nil { + return err + } + + go io.Copy(fd, rw) + io.Copy(rw, fd) + + return nil +} + +func (p *Provider) ResourceExport(app, name string) (io.ReadCloser, error) { + r, err := p.ResourceGet(app, name) + if err != nil { + return nil, err + } + + switch r.Type { + case "postgres": + return resourceExportPostgres(r) + default: + return nil, fmt.Errorf("can not export resources of type: %s", r.Type) + } +} + +func resourceExportCommand(w io.WriteCloser, command string, args ...string) { + defer w.Close() + + cmd := exec.Command(command, args...) + + cmd.Stdout = w + cmd.Stderr = w + + if err := cmd.Run(); err != nil { + fmt.Fprintf(w, "ERROR: could not export: %v\n", err) + } +} + +func resourceExportPostgres(r *structs.Resource) (io.ReadCloser, error) { + rr, ww := io.Pipe() + + go resourceExportCommand(ww, "pg_dump", "--no-acl", "--no-owner", r.Url) + + return rr, nil +} + func (p *Provider) ResourceGet(app, name string) (*structs.Resource, error) { d, err := p.Cluster.AppsV1().Deployments(p.AppNamespace(app)).Get(fmt.Sprintf("resource-%s", name), am.GetOptions{}) if err != nil { @@ -34,6 +110,34 @@ func (p *Provider) ResourceGet(app, name string) (*structs.Resource, error) { return r, nil } +func (p *Provider) ResourceImport(app, name string, r io.Reader) error { + rr, err := p.ResourceGet(app, name) + if err != nil { + return err + } + + switch rr.Type { + case "postgres": + return resourceImportPostgres(rr, r) + default: + return fmt.Errorf("can not import resources of type: %s", rr.Type) + } +} + +func resourceImportPostgres(rr *structs.Resource, r io.Reader) error { + cmd := exec.Command("psql", rr.Url) + + cmd.Stdin = r + + data, err := cmd.CombinedOutput() + fmt.Printf("string(data): %+v\n", string(data)) + if err != nil { + return fmt.Errorf("ERROR: import failed") + } + + return nil +} + func (p *Provider) ResourceList(app string) (structs.Resources, error) { lopts := am.ListOptions{ LabelSelector: fmt.Sprintf("app=%s,type=resource", app), diff --git a/sdk/methods.go b/sdk/methods.go index 0599fab..10d2079 100644 --- a/sdk/methods.go +++ b/sdk/methods.go @@ -701,6 +701,45 @@ func (c *Client) ReleasePromote(app string, id string, opts structs.ReleasePromo return err } +func (c *Client) ResourceConsole(app string, name string, rw io.ReadWriter, opts structs.ResourceConsoleOptions) error { + var err error + + ro, err := stdsdk.MarshalOptions(opts) + if err != nil { + return err + } + + ro.Body = rw + + r, err := c.Websocket(fmt.Sprintf("/apps/%s/resources/%s/console", app, name), ro) + if err != nil { + return err + } + + if _, err := io.Copy(rw, r); err != nil { + return err + } + + return err +} + +func (c *Client) ResourceExport(app string, name string) (io.ReadCloser, error) { + var err error + + ro := stdsdk.RequestOptions{Headers: stdsdk.Headers{}, Params: stdsdk.Params{}, Query: stdsdk.Query{}} + + var v io.ReadCloser + + res, err := c.GetStream(fmt.Sprintf("/apps/%s/resources/%s/data", app, name), ro) + if err != nil { + return nil, err + } + + v = res.Body + + return v, err +} + func (c *Client) ResourceGet(app string, name string) (*structs.Resource, error) { var err error @@ -713,6 +752,18 @@ func (c *Client) ResourceGet(app string, name string) (*structs.Resource, error) return v, err } +func (c *Client) ResourceImport(app string, name string, r io.Reader) error { + var err error + + ro := stdsdk.RequestOptions{Headers: stdsdk.Headers{}, Params: stdsdk.Params{}, Query: stdsdk.Query{}} + + ro.Body = r + + err = c.Put(fmt.Sprintf("/apps/%s/resources/%s/data", app, name), ro, nil) + + return err +} + func (c *Client) ResourceList(app string) (structs.Resources, error) { var err error diff --git a/vendor/github.com/convox/changes/changes.go b/vendor/github.com/convox/changes/changes.go new file mode 100644 index 0000000..0a1a0e3 --- /dev/null +++ b/vendor/github.com/convox/changes/changes.go @@ -0,0 +1,138 @@ +package changes + +import ( + "os" + "path/filepath" + "sort" + "time" + + "github.com/docker/engine/pkg/fileutils" +) + +type Change struct { + Operation string + Base string + Path string +} + +type WatchOptions struct { + Ignores []string +} + +func Files(cc []Change) []string { + files := make([]string, len(cc)) + + for i, c := range cc { + files[i] = c.Path + } + + sort.Strings(files) + + return files +} + +func Partition(changes []Change) (adds []Change, removes []Change) { + for _, c := range changes { + switch c.Operation { + case "add": + adds = append(adds, c) + case "remove": + removes = append(removes, c) + } + } + + return +} + +func Watch(dir string, ch chan Change, opts WatchOptions) error { + abs, err := filepath.Abs(dir) + if err != nil { + return err + } + + sym, err := filepath.EvalSymlinks(abs) + if err != nil { + return err + } + + return watchForChanges(sym, opts.Ignores, ch) +} + +func watchForChanges(dir string, ignore []string, ch chan Change) error { + defer close(ch) + + cur, err := snapshot(dir) + if err != nil { + return err + } + + startScanner(dir) + + for { + snap, err := snapshot(dir) + if err != nil { + return err + } + + notify(ch, cur, snap, dir, ignore) + + cur = snap + + waitForNextScan(dir) + } +} + +func notify(ch chan Change, from, to map[string]time.Time, base string, ignore []string) { + for fk, ft := range from { + tt, ok := to[fk] + + switch { + case !ok: + send(ch, "remove", fk, base, ignore) + case ft.Before(tt): + send(ch, "add", fk, base, ignore) + } + } + + for tk := range to { + if _, ok := from[tk]; !ok { + send(ch, "add", tk, base, ignore) + } + } +} + +func send(ch chan Change, op, file, base string, ignore []string) { + rel, err := filepath.Rel(base, file) + if err != nil { + return + } + + if match, _ := fileutils.Matches(rel, ignore); match { + return + } + + change := Change{ + Operation: op, + Base: base, + Path: rel, + } + + ch <- change +} + +func snapshot(dir string) (map[string]time.Time, error) { + snap := map[string]time.Time{} + + err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if info == nil || info.IsDir() { + return nil + } + snap[path] = info.ModTime() + return nil + }) + if err != nil { + return nil, err + } + + return snap, nil +} diff --git a/vendor/github.com/convox/changes/go.mod b/vendor/github.com/convox/changes/go.mod new file mode 100644 index 0000000..5645ef5 --- /dev/null +++ b/vendor/github.com/convox/changes/go.mod @@ -0,0 +1,9 @@ +module github.com/convox/changes + +go 1.13 + +require ( + github.com/convox/inotify v0.0.0-20170313035821-b56f5149b5c6 + github.com/docker/engine v1.4.2-0.20190717161051-705d9623b7c1 + github.com/sirupsen/logrus v1.4.2 // indirect +) diff --git a/vendor/github.com/convox/changes/go.sum b/vendor/github.com/convox/changes/go.sum new file mode 100644 index 0000000..bdea1e1 --- /dev/null +++ b/vendor/github.com/convox/changes/go.sum @@ -0,0 +1,13 @@ +github.com/convox/inotify v0.0.0-20170313035821-b56f5149b5c6 h1:bigLg74wAp2d11vaK4/IkTbN95D5mlSqZ/+/O6YBgtQ= +github.com/convox/inotify v0.0.0-20170313035821-b56f5149b5c6/go.mod h1:JOi7Az72uBLT9D2Qv/6FbUbC9W420st0MMIUgVYUyd0= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docker/engine v1.4.2-0.20190717161051-705d9623b7c1 h1:HjO0YFIGk26fADKDJYuAoGneX9nrVVotZJ1Ctn15Vv4= +github.com/docker/engine v1.4.2-0.20190717161051-705d9623b7c1/go.mod h1:3CPr2caMgTHxxIAZgEMd3uLYPDlRvPqCpyeRf6ncPcY= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/convox/changes/watch.go b/vendor/github.com/convox/changes/watch.go new file mode 100644 index 0000000..a1b816e --- /dev/null +++ b/vendor/github.com/convox/changes/watch.go @@ -0,0 +1,12 @@ +// +build !darwin,!linux darwin,!cgo + +package changes + +import "time" + +func startScanner(dir string) { +} + +func waitForNextScan(dir string) { + time.Sleep(700 * time.Millisecond) +} diff --git a/vendor/github.com/convox/changes/watch_darwin.c b/vendor/github.com/convox/changes/watch_darwin.c new file mode 100644 index 0000000..cdcafa8 --- /dev/null +++ b/vendor/github.com/convox/changes/watch_darwin.c @@ -0,0 +1,32 @@ +// +build darwin,cgo + +#include +#include "_cgo_export.h" + +void +fswatch_cb(ConstFSEventStreamRef streamRef, + void *clientCallBackInfo, + size_t numEvents, + void *eventPaths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[]) +{ + cb( + (FSEventStreamRef)streamRef, + clientCallBackInfo, + numEvents, + eventPaths, + (FSEventStreamEventFlags*)eventFlags, + (FSEventStreamEventId*)eventIds); +} + +FSEventStreamRef fswatch_new(FSEventStreamContext *ctx, CFMutableArrayRef pathsToWatch, FSEventStreamEventId since, CFTimeInterval latency, FSEventStreamCreateFlags flags) { + return FSEventStreamCreate( + NULL, + fswatch_cb, + ctx, + pathsToWatch, + since, + latency, + flags); +} diff --git a/vendor/github.com/convox/changes/watch_darwin.go b/vendor/github.com/convox/changes/watch_darwin.go new file mode 100644 index 0000000..ba124a6 --- /dev/null +++ b/vendor/github.com/convox/changes/watch_darwin.go @@ -0,0 +1,104 @@ +// +build darwin,cgo + +// heavily inspired by https://github.com/fsnotify/fsevents + +package changes + +/* +#cgo LDFLAGS: -framework CoreServices +#include +FSEventStreamRef fswatch_new( + FSEventStreamContext*, + CFMutableArrayRef, + FSEventStreamEventId, + CFTimeInterval, + FSEventStreamCreateFlags); +static CFMutableArrayRef fswatch_make_mutable_array() { + return CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); +} +*/ +import "C" + +import ( + "math/rand" + "sync" + "time" + "unsafe" +) + +var ( + cflags = C.FSEventStreamCreateFlags(0) + chans = make(map[string](chan string)) + interval = 700 * time.Millisecond + now = C.FSEventStreamEventId((1 << 64) - 1) + + lock sync.Mutex +) + +func init() { + rand.Seed(time.Now().UTC().UnixNano()) +} + +func startScanner(dir string) { + lock.Lock() + chans[dir] = make(chan string) + lock.Unlock() + + cpaths := C.fswatch_make_mutable_array() + defer C.free(unsafe.Pointer(cpaths)) + + path := C.CString(dir) + str := C.CFStringCreateWithCString(C.kCFAllocatorDefault, path, C.kCFStringEncodingUTF8) + defer C.free(unsafe.Pointer(path)) + defer C.free(unsafe.Pointer(str)) + + C.CFArrayAppendValue(cpaths, unsafe.Pointer(str)) + + ctx := C.FSEventStreamContext{info: unsafe.Pointer(C.CString(dir))} + + stream := C.fswatch_new(&ctx, cpaths, now, C.CFTimeInterval(interval/time.Second), cflags) + + go func() { + C.FSEventStreamScheduleWithRunLoop(stream, C.CFRunLoopGetCurrent(), C.kCFRunLoopCommonModes) + C.FSEventStreamStart(stream) + C.CFRunLoopRun() + }() +} + +func waitForNextScan(dir string) { + tick := time.Tick(900 * time.Millisecond) + fired := false + + for { + lock.Lock() + ch, ok := chans[dir] + lock.Unlock() + + if !ok { + return + } + + select { + case <-ch: + tick = time.Tick(500 * time.Millisecond) + fired = true + case <-tick: + if fired { + return + } + } + } +} + +//export cb +func cb(stream C.FSEventStreamRef, info unsafe.Pointer, count C.size_t, paths **C.char, flags *C.FSEventStreamEventFlags, ids *C.FSEventStreamEventId) { + dir := C.GoString((*C.char)(info)) + + lock.Lock() + ch, ok := chans[dir] + lock.Unlock() + + if ok { + ch <- "" + } +} diff --git a/vendor/github.com/convox/changes/watch_linux.go b/vendor/github.com/convox/changes/watch_linux.go new file mode 100644 index 0000000..d11c2e5 --- /dev/null +++ b/vendor/github.com/convox/changes/watch_linux.go @@ -0,0 +1,58 @@ +package changes + +import ( + "os" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/convox/inotify" +) + +var ( + dirCreateFlags = inotify.IN_CREATE | inotify.IN_ISDIR + dirDeleteFlags = inotify.IN_DELETE | inotify.IN_ISDIR + watcher *inotify.Watcher + lock sync.Mutex +) + +func init() { + watcher, _ = inotify.NewWatcher() +} + +func startScanner(dir string) { + filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if info != nil && info.IsDir() { + lock.Lock() + // watcher.AddWatch(path, inotify.IN_CREATE|inotify.IN_DELETE|inotify.IN_MODIFY|inotify.IN_ATTRIB) + watcher.Watch(path) + lock.Unlock() + } + return nil + }) +} + +func waitForNextScan(dir string) { + tick := time.Tick(900 * time.Millisecond) + fired := false + + for { + select { + case ev := <-watcher.Event: + if strings.HasPrefix(ev.Name, dir) { + if ev.Mask|dirCreateFlags == dirCreateFlags { + startScanner(ev.Name) + } + if ev.Mask|dirDeleteFlags == dirDeleteFlags { + watcher.RemoveWatch(ev.Name) + } + fired = true + } + case <-tick: + if fired { + return + } + } + } +} diff --git a/vendor/github.com/convox/hid/.gitignore b/vendor/github.com/convox/hid/.gitignore new file mode 100644 index 0000000..c38fa4e --- /dev/null +++ b/vendor/github.com/convox/hid/.gitignore @@ -0,0 +1,2 @@ +.idea +*.iml diff --git a/vendor/github.com/convox/hid/LICENSE b/vendor/github.com/convox/hid/LICENSE new file mode 100644 index 0000000..862b0dd --- /dev/null +++ b/vendor/github.com/convox/hid/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Florian Sundermann + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/convox/hid/README.md b/vendor/github.com/convox/hid/README.md new file mode 100644 index 0000000..98c04f7 --- /dev/null +++ b/vendor/github.com/convox/hid/README.md @@ -0,0 +1,53 @@ +# HID + +A Go package to access Human Interface Devices. The platform specific parts of +this package are heavily based on [Signal 11's HIDAPI](https://github.com/signal11/hidapi). + +## Supported operating systems + +The following operating systems are supported targets +(as used by [*$GOOS* environment variable](https://golang.org/doc/install/source#environment)) + +* darwin (uses native IOKit framework) +* linux (uses hidraw) +* windows (uses native Windows HID library) + +## Known quirks for building on Windows 64-bit + +For building this HID package, you need to have a gcc.exe in your *%PATH%* environment variable. +There are two tested GCC toolchains: [tdm-gcc](http://tdm-gcc.tdragon.net/) +and [mingw-w64](http://mingw-w64.yaxm.org/). At the moment (March 2015), both toolchains +are missing some declarations in header files, which will result in the following error message, +when running the ```go build```: + +``` +D:\projects.go\src\github.com\boombuler\hid> go build -v -work +WORK=C:\Users\xxx\AppData\Local\Temp\go-build011586055 +github.com/boombuler/hid +# github.com/boombuler/hid +could not determine kind of name for C.HidD_FreePreparsedData +could not determine kind of name for C.HidD_GetPreparsedData +``` + +The solutions is simple: just add these four lines to your gcc toolchain header file ```hidsdi.h``` +````C +/* http://msdn.microsoft.com/en-us/library/windows/hardware/ff538893(v=vs.85).aspx */ +HIDAPI BOOLEAN NTAPI HidD_FreePreparsedData(PHIDP_PREPARSED_DATA PreparsedData); + +/* http://msdn.microsoft.com/en-us/library/windows/hardware/ff539679(v=vs.85).aspx */ +HIDAPI BOOLEAN NTAPI HidD_GetPreparsedData(HANDLE HidDeviceObject, PHIDP_PREPARSED_DATA *PreparsedData); +```` +Depending on your gcc toolchain installation folder, the files are located in + +``` C:\TDM-GCC-64\x86_64-w64-mingw32\include\hidsdi.h ``` + +or + +``` c:\mingw-w64\x86_64-4.9.2-win32-seh-rt_v3-rev1\mingw64\x86_64-w64-mingw32\include\hidsdi.h ``` + +After patching the header file, this package will compile. +Future releases of the gcc toolchains will surely fix this issue. + +## License + +[![License: MIT](https://img.shields.io/:license-MIT-blue.svg)](http://opensource.org/licenses/MIT) diff --git a/vendor/github.com/convox/hid/hid.go b/vendor/github.com/convox/hid/hid.go new file mode 100644 index 0000000..2cfb13b --- /dev/null +++ b/vendor/github.com/convox/hid/hid.go @@ -0,0 +1,39 @@ +// Package hid provides access to Human Interface Devices. +package hid + +// DeviceInfo provides general information about a device. +type DeviceInfo struct { + // Path contains a platform-specific device path which is used to identify the device. + Path string + + VendorID uint16 + ProductID uint16 + VersionNumber uint16 + Manufacturer string + Product string + + UsagePage uint16 + Usage uint16 + + InputReportLength uint16 + OutputReportLength uint16 +} + +// A Device provides access to a HID device. +type Device interface { + // Close closes the device and associated resources. + Close() + + // Write writes an output report to device. The first byte must be the + // report number to write, zero if the device does not use numbered reports. + Write([]byte) error + + // ReadCh returns a channel that will be sent input reports from the device. + // If the device uses numbered reports, the first byte will be the report + // number. + ReadCh() <-chan []byte + + // ReadError returns the read error, if any after the channel returned from + // ReadCh has been closed. + ReadError() error +} diff --git a/vendor/github.com/convox/hid/hid_darwin.go b/vendor/github.com/convox/hid/hid_darwin.go new file mode 100644 index 0000000..a082724 --- /dev/null +++ b/vendor/github.com/convox/hid/hid_darwin.go @@ -0,0 +1,413 @@ +package hid + +/* +#cgo LDFLAGS: -L . -L/usr/local/lib -framework CoreFoundation -framework IOKit + +#include +#include + + +static inline CFIndex cfstring_utf8_length(CFStringRef str, CFIndex *need) { + CFIndex n, usedBufLen; + CFRange rng = CFRangeMake(0, CFStringGetLength(str)); + + return CFStringGetBytes(str, rng, kCFStringEncodingUTF8, 0, 0, NULL, 0, need); +} + +void deviceUnplugged(IOHIDDeviceRef osd, IOReturn ret, void *dev); + +void reportCallback(void *context, IOReturn result, void *sender, IOHIDReportType report_type, uint32_t report_id, uint8_t *report, CFIndex report_length); + +*/ +import "C" + +import ( + "errors" + "fmt" + "reflect" + "runtime" + "sync" + "unsafe" +) + +func ioReturnToErr(ret C.IOReturn) error { + switch ret { + case C.kIOReturnSuccess: + return nil + case C.kIOReturnError: + return errors.New("hid: general error") + case C.kIOReturnNoMemory: + return errors.New("hid: can't allocate memory") + case C.kIOReturnNoResources: + return errors.New("hid: resource shortage") + case C.kIOReturnIPCError: + return errors.New("hid: error during IPC") + case C.kIOReturnNoDevice: + return errors.New("hid: no such device") + case C.kIOReturnNotPrivileged: + return errors.New("hid: privilege violation") + case C.kIOReturnBadArgument: + return errors.New("hid: invalid argument") + case C.kIOReturnLockedRead: + return errors.New("hid: device read locked") + case C.kIOReturnLockedWrite: + return errors.New("hid: device write locked") + case C.kIOReturnExclusiveAccess: + return errors.New("hid: exclusive access and device already open") + case C.kIOReturnBadMessageID: + return errors.New("hid: sent/received messages had different msg_id") + case C.kIOReturnUnsupported: + return errors.New("hid: unsupported function") + case C.kIOReturnVMError: + return errors.New("hid: misc. VM failure") + case C.kIOReturnInternalError: + return errors.New("hid: internal error") + case C.kIOReturnIOError: + return errors.New("hid: general I/O error") + case C.kIOReturnCannotLock: + return errors.New("hid: can't acquire lock") + case C.kIOReturnNotOpen: + return errors.New("hid: device not open") + case C.kIOReturnNotReadable: + return errors.New("hid: read not supported") + case C.kIOReturnNotWritable: + return errors.New("hid: write not supported") + case C.kIOReturnNotAligned: + return errors.New("hid: alignment error") + case C.kIOReturnBadMedia: + return errors.New("hid: media Error") + case C.kIOReturnStillOpen: + return errors.New("hid: device(s) still open") + case C.kIOReturnRLDError: + return errors.New("hid: rld failure") + case C.kIOReturnDMAError: + return errors.New("hid: DMA failure") + case C.kIOReturnBusy: + return errors.New("hid: device Busy") + case C.kIOReturnTimeout: + return errors.New("hid: i/o timeout") + case C.kIOReturnOffline: + return errors.New("hid: device offline") + case C.kIOReturnNotReady: + return errors.New("hid: not ready") + case C.kIOReturnNotAttached: + return errors.New("hid: device not attached") + case C.kIOReturnNoChannels: + return errors.New("hid: no DMA channels left") + case C.kIOReturnNoSpace: + return errors.New("hid: no space for data") + case C.kIOReturnPortExists: + return errors.New("hid: port already exists") + case C.kIOReturnCannotWire: + return errors.New("hid: can't wire down physical memory") + case C.kIOReturnNoInterrupt: + return errors.New("hid: no interrupt attached") + case C.kIOReturnNoFrames: + return errors.New("hid: no DMA frames enqueued") + case C.kIOReturnMessageTooLarge: + return errors.New("hid: oversized msg received on interrupt port") + case C.kIOReturnNotPermitted: + return errors.New("hid: not permitted") + case C.kIOReturnNoPower: + return errors.New("hid: no power to device") + case C.kIOReturnNoMedia: + return errors.New("hid: media not present") + case C.kIOReturnUnformattedMedia: + return errors.New("hid: media not formatted") + case C.kIOReturnUnsupportedMode: + return errors.New("hid: no such mode") + case C.kIOReturnUnderrun: + return errors.New("hid: data underrun") + case C.kIOReturnOverrun: + return errors.New("hid: data overrun") + case C.kIOReturnDeviceError: + return errors.New("hid: the device is not working properly!") + case C.kIOReturnNoCompletion: + return errors.New("hid: a completion routine is required") + case C.kIOReturnAborted: + return errors.New("hid: operation aborted") + case C.kIOReturnNoBandwidth: + return errors.New("hid: bus bandwidth would be exceeded") + case C.kIOReturnNotResponding: + return errors.New("hid: device not responding") + case C.kIOReturnIsoTooOld: + return errors.New("hid: isochronous I/O request for distant past!") + case C.kIOReturnIsoTooNew: + return errors.New("hid: isochronous I/O request for distant future") + case C.kIOReturnNotFound: + return errors.New("hid: data was not found") + default: + return errors.New("hid: unknown error") + } +} + +var deviceCtxMtx sync.Mutex +var deviceCtx = make(map[C.IOHIDDeviceRef]*osxDevice) + +type cleanupDeviceManagerFn func() +type osxDevice struct { + mtx sync.Mutex + osDevice C.IOHIDDeviceRef + disconnected bool + closeDM cleanupDeviceManagerFn + + readSetup sync.Once + readCh chan []byte + readErr error + readBuf []byte + runLoop C.CFRunLoopRef +} + +func cfstring(s string) C.CFStringRef { + n := C.CFIndex(len(s)) + return C.CFStringCreateWithBytes(C.kCFAllocatorDefault, *(**C.UInt8)(unsafe.Pointer(&s)), n, C.kCFStringEncodingUTF8, 0) +} + +func gostring(cfs C.CFStringRef) string { + if cfs == nilCfStringRef { + return "" + } + + var usedBufLen C.CFIndex + n := C.cfstring_utf8_length(cfs, &usedBufLen) + if n <= 0 { + return "" + } + rng := C.CFRange{location: C.CFIndex(0), length: n} + buf := make([]byte, int(usedBufLen)) + + bufp := unsafe.Pointer(&buf[0]) + C.CFStringGetBytes(cfs, rng, C.kCFStringEncodingUTF8, 0, 0, (*C.UInt8)(bufp), C.CFIndex(len(buf)), &usedBufLen) + + sh := &reflect.StringHeader{ + Data: uintptr(bufp), + Len: int(usedBufLen), + } + return *(*string)(unsafe.Pointer(sh)) +} + +func getIntProp(device C.IOHIDDeviceRef, key C.CFStringRef) int32 { + var value int32 + ref := C.IOHIDDeviceGetProperty(device, key) + if ref == nilCfTypeRef { + return 0 + } + if C.CFGetTypeID(ref) != C.CFNumberGetTypeID() { + return 0 + } + C.CFNumberGetValue(C.CFNumberRef(ref), C.kCFNumberSInt32Type, unsafe.Pointer(&value)) + return value +} + +func getStringProp(device C.IOHIDDeviceRef, key C.CFStringRef) string { + s := C.IOHIDDeviceGetProperty(device, key) + return gostring(C.CFStringRef(s)) +} + +func getPath(osDev C.IOHIDDeviceRef) string { + return fmt.Sprintf("%s_%04x_%04x_%08x", + getStringProp(osDev, cfstring(C.kIOHIDTransportKey)), + uint16(getIntProp(osDev, cfstring(C.kIOHIDVendorIDKey))), + uint16(getIntProp(osDev, cfstring(C.kIOHIDProductIDKey))), + uint32(getIntProp(osDev, cfstring(C.kIOHIDLocationIDKey)))) +} + +func iterateDevices(action func(device C.IOHIDDeviceRef) bool) cleanupDeviceManagerFn { + var mgr C.IOHIDManagerRef + mgr = C.IOHIDManagerCreate(C.kCFAllocatorDefault, C.kIOHIDOptionsTypeNone) + C.IOHIDManagerSetDeviceMatching(mgr, 0) + C.IOHIDManagerOpen(mgr, C.kIOHIDOptionsTypeNone) + + var allDevicesSet C.CFSetRef + allDevicesSet = C.IOHIDManagerCopyDevices(mgr) + if allDevicesSet == nilCfSetRef { + return func() {} + } + defer C.CFRelease((C.CFTypeRef)(allDevicesSet)) + devCnt := C.CFSetGetCount(allDevicesSet) + allDevices := make([]unsafe.Pointer, uint64(devCnt)) + C.CFSetGetValues(allDevicesSet, &allDevices[0]) + + for _, pDev := range allDevices { + if !action(C.IOHIDDeviceRef(pDev)) { + break + } + } + return func() { + C.IOHIDManagerClose(mgr, C.kIOHIDOptionsTypeNone) + C.CFRelease(C.CFTypeRef(mgr)) + } +} + +func Devices() ([]*DeviceInfo, error) { + var result []*DeviceInfo + iterateDevices(func(device C.IOHIDDeviceRef) bool { + result = append(result, &DeviceInfo{ + VendorID: uint16(getIntProp(device, cfstring(C.kIOHIDVendorIDKey))), + ProductID: uint16(getIntProp(device, cfstring(C.kIOHIDProductIDKey))), + VersionNumber: uint16(getIntProp(device, cfstring(C.kIOHIDVersionNumberKey))), + Manufacturer: getStringProp(device, cfstring(C.kIOHIDManufacturerKey)), + Product: getStringProp(device, cfstring(C.kIOHIDProductKey)), + UsagePage: uint16(getIntProp(device, cfstring(C.kIOHIDPrimaryUsagePageKey))), + Usage: uint16(getIntProp(device, cfstring(C.kIOHIDPrimaryUsageKey))), + InputReportLength: uint16(getIntProp(device, cfstring(C.kIOHIDMaxInputReportSizeKey))), + OutputReportLength: uint16(getIntProp(device, cfstring(C.kIOHIDMaxOutputReportSizeKey))), + Path: getPath(device), + }) + return true + })() + return result, nil +} + +func ByPath(path string) (*DeviceInfo, error) { + devices, err := Devices() + if err != nil { + return nil, err + } + for _, d := range devices { + if d.Path == path { + return d, nil + } + } + return nil, errors.New("hid: device not found") +} + +func (di *DeviceInfo) Open() (Device, error) { + err := errors.New("hid: device not found") + var dev *osxDevice + closeDM := iterateDevices(func(device C.IOHIDDeviceRef) bool { + if getPath(device) == di.Path { + res := C.IOHIDDeviceOpen(device, C.kIOHIDOptionsTypeSeizeDevice) + if res == C.kIOReturnSuccess { + C.CFRetain(C.CFTypeRef(device)) + dev = &osxDevice{osDevice: device} + err = nil + deviceCtxMtx.Lock() + deviceCtx[device] = dev + deviceCtxMtx.Unlock() + C.IOHIDDeviceRegisterRemovalCallback(device, (C.IOHIDCallback)(unsafe.Pointer(C.deviceUnplugged)), unsafe.Pointer(device)) + } else { + err = ioReturnToErr(res) + } + return false + } + return true + }) + if dev != nil { + dev.closeDM = closeDM + dev.readBuf = make([]byte, int(di.InputReportLength)) + } + + return dev, err +} + +//export deviceUnplugged +func deviceUnplugged(osdev C.IOHIDDeviceRef, result C.IOReturn, dev unsafe.Pointer) { + deviceCtxMtx.Lock() + od := deviceCtx[C.IOHIDDeviceRef(dev)] + deviceCtxMtx.Unlock() + od.readErr = errors.New("hid: device unplugged") + od.close(true) +} + +func (dev *osxDevice) Close() { + dev.readErr = errors.New("hid: device closed") + dev.close(false) +} + +func (dev *osxDevice) close(disconnected bool) { + dev.mtx.Lock() + defer dev.mtx.Unlock() + + if dev.disconnected { + return + } + + if dev.readCh != nil { + if !disconnected { + C.IOHIDDeviceRegisterInputReportCallback(dev.osDevice, (*C.uint8_t)(&dev.readBuf[0]), C.CFIndex(len(dev.readBuf)), nil, unsafe.Pointer(dev.osDevice)) + C.IOHIDDeviceUnscheduleFromRunLoop(dev.osDevice, dev.runLoop, C.kCFRunLoopDefaultMode) + } + C.CFRunLoopStop(dev.runLoop) + } + if !disconnected { + C.IOHIDDeviceRegisterRemovalCallback(dev.osDevice, nil, nil) + C.IOHIDDeviceClose(dev.osDevice, C.kIOHIDOptionsTypeSeizeDevice) + } + + deviceCtxMtx.Lock() + delete(deviceCtx, dev.osDevice) + deviceCtxMtx.Unlock() + C.CFRelease(C.CFTypeRef(dev.osDevice)) + dev.osDevice = nilIOHIDDeviceRef + dev.closeDM() + dev.disconnected = true +} + +func (dev *osxDevice) setReport(typ C.IOHIDReportType, data []byte) error { + dev.mtx.Lock() + defer dev.mtx.Unlock() + + if dev.disconnected { + return errors.New("hid: device disconnected") + } + + reportNo := int32(data[0]) + if reportNo == 0 { + data = data[1:] + } + + res := C.IOHIDDeviceSetReport(dev.osDevice, typ, C.CFIndex(reportNo), (*C.uint8_t)(&data[0]), C.CFIndex(len(data))) + if res != C.kIOReturnSuccess { + return ioReturnToErr(res) + } + return nil +} + +func (dev *osxDevice) Write(data []byte) error { + return dev.setReport(C.kIOHIDReportTypeOutput, data) +} + +func (dev *osxDevice) ReadCh() <-chan []byte { + dev.readSetup.Do(dev.startReadThread) + return dev.readCh +} + +func (dev *osxDevice) startReadThread() { + dev.mtx.Lock() + dev.readCh = make(chan []byte, 30) + dev.mtx.Unlock() + + go func() { + runtime.LockOSThread() + dev.mtx.Lock() + dev.runLoop = C.CFRunLoopGetCurrent() + C.IOHIDDeviceScheduleWithRunLoop(dev.osDevice, dev.runLoop, C.kCFRunLoopDefaultMode) + C.IOHIDDeviceRegisterInputReportCallback(dev.osDevice, (*C.uint8_t)(&dev.readBuf[0]), C.CFIndex(len(dev.readBuf)), (C.IOHIDReportCallback)(unsafe.Pointer(C.reportCallback)), unsafe.Pointer(dev.osDevice)) + dev.mtx.Unlock() + C.CFRunLoopRun() + close(dev.readCh) + }() +} + +func (dev *osxDevice) ReadError() error { + return dev.readErr +} + +//export reportCallback +func reportCallback(context unsafe.Pointer, result C.IOReturn, sender unsafe.Pointer, reportType C.IOHIDReportType, reportID uint32, report *C.uint8_t, reportLength C.CFIndex) { + deviceCtxMtx.Lock() + dev, ok := deviceCtx[(C.IOHIDDeviceRef)(context)] + deviceCtxMtx.Unlock() + if !ok { + return + } + data := C.GoBytes(unsafe.Pointer(report), C.int(reportLength)) + + // readCh is buffered, drop the data if we can't send to avoid blocking the + // run loop + select { + case dev.readCh <- data: + default: + } +} diff --git a/vendor/github.com/convox/hid/hid_darwin_go110.go b/vendor/github.com/convox/hid/hid_darwin_go110.go new file mode 100644 index 0000000..b86f52f --- /dev/null +++ b/vendor/github.com/convox/hid/hid_darwin_go110.go @@ -0,0 +1,14 @@ +// +build go1.10,darwin + +package hid + +/* +#include +#include +*/ +import "C" + +var nilCfStringRef C.CFStringRef= 0 +var nilCfTypeRef C.CFTypeRef = 0 +var nilCfSetRef C.CFSetRef = 0 +var nilIOHIDDeviceRef C.IOHIDDeviceRef = 0 diff --git a/vendor/github.com/convox/hid/hid_darwin_go19.go b/vendor/github.com/convox/hid/hid_darwin_go19.go new file mode 100644 index 0000000..123c1db --- /dev/null +++ b/vendor/github.com/convox/hid/hid_darwin_go19.go @@ -0,0 +1,14 @@ +// +build go1.9,!go1.10,darwin + +package hid + +/* +#include +#include + */ +import "C" + +var nilCfStringRef C.CFStringRef= nil +var nilCfTypeRef C.CFTypeRef = nil +var nilCfSetRef C.CFSetRef = nil +var nilIOHIDDeviceRef C.IOHIDDeviceRef = nil diff --git a/vendor/github.com/convox/hid/hid_linux.go b/vendor/github.com/convox/hid/hid_linux.go new file mode 100644 index 0000000..4b1437d --- /dev/null +++ b/vendor/github.com/convox/hid/hid_linux.go @@ -0,0 +1,214 @@ +package hid + +// #include +import "C" + +import ( + "bytes" + "io/ioutil" + "os" + "path/filepath" + "sync" + "unsafe" +) + +var ( + ioctlHIDIOCGRDESCSIZE = ioR('H', 0x01, C.sizeof_int) + ioctlHIDIOCGRDESC = ioR('H', 0x02, C.sizeof_struct_hidraw_report_descriptor) + ioctlHIDIOCGRAWINFO = ioR('H', 0x03, C.sizeof_struct_hidraw_devinfo) +) + +func ioctlHIDIOCGRAWNAME(size int) uintptr { + return ioR('H', 0x04, uintptr(size)) +} + +func ioctlHIDIOCGRAWPHYS(size int) uintptr { + return ioR('H', 0x05, uintptr(size)) +} + +func ioctlHIDIOCSFEATURE(size int) uintptr { + return ioRW('H', 0x06, uintptr(size)) +} + +func ioctlHIDIOCGFEATURE(size int) uintptr { + return ioRW('H', 0x07, uintptr(size)) +} + +type linuxDevice struct { + f *os.File + info *DeviceInfo + + readSetup sync.Once + readErr error + readCh chan []byte +} + +func Devices() ([]*DeviceInfo, error) { + sys, err := os.Open("/sys/class/hidraw") + if err != nil { + return nil, err + } + names, err := sys.Readdirnames(0) + sys.Close() + if err != nil { + return nil, err + } + + var res []*DeviceInfo + for _, dir := range names { + path := filepath.Join("/dev", filepath.Base(dir)) + info, err := getDeviceInfo(path) + if os.IsPermission(err) { + continue + } else if err != nil { + return nil, err + } + res = append(res, info) + } + + return res, nil +} + +func getDeviceInfo(path string) (*DeviceInfo, error) { + d := &DeviceInfo{ + Path: path, + } + + dev, err := os.OpenFile(path, os.O_RDWR, 0) + if err != nil { + return nil, err + } + defer dev.Close() + fd := uintptr(dev.Fd()) + + var descSize C.int + if err := ioctl(fd, ioctlHIDIOCGRDESCSIZE, uintptr(unsafe.Pointer(&descSize))); err != nil { + return nil, err + } + + rawDescriptor := C.struct_hidraw_report_descriptor{ + size: C.__u32(descSize), + } + if err := ioctl(fd, ioctlHIDIOCGRDESC, uintptr(unsafe.Pointer(&rawDescriptor))); err != nil { + return nil, err + } + d.parseReport(C.GoBytes(unsafe.Pointer(&rawDescriptor.value), descSize)) + + var rawInfo C.struct_hidraw_devinfo + if err := ioctl(fd, ioctlHIDIOCGRAWINFO, uintptr(unsafe.Pointer(&rawInfo))); err != nil { + return nil, err + } + d.VendorID = uint16(rawInfo.vendor) + d.ProductID = uint16(rawInfo.product) + + rawName := make([]byte, 256) + if err := ioctl(fd, ioctlHIDIOCGRAWNAME(len(rawName)), uintptr(unsafe.Pointer(&rawName[0]))); err != nil { + return nil, err + } + d.Product = string(rawName[:bytes.IndexByte(rawName, 0)]) + + if p, err := filepath.EvalSymlinks(filepath.Join("/sys/class/hidraw", filepath.Base(path), "device")); err == nil { + if rawManufacturer, err := ioutil.ReadFile(filepath.Join(p, "/../../manufacturer")); err == nil { + d.Manufacturer = string(bytes.TrimRight(rawManufacturer, "\n")) + } + } + + return d, nil +} + +// very basic report parser that will pull out the usage page, usage, and the +// sizes of the first input and output reports +func (d *DeviceInfo) parseReport(b []byte) { + var reportSize uint16 + + for len(b) > 0 { + // read item size, type, and tag + size := int(b[0] & 0x03) + if size == 3 { + size = 4 + } + typ := (b[0] >> 2) & 0x03 + tag := (b[0] >> 4) & 0x0f + b = b[1:] + + if len(b) < size { + return + } + + // read item value + var v uint64 + for i := 0; i < size; i++ { + v += uint64(b[i]) << (8 * uint(i)) + } + b = b[size:] + + switch { + case typ == 0 && tag == 8 && d.InputReportLength == 0 && reportSize > 0: // input report type + d.InputReportLength = reportSize + reportSize = 0 + case typ == 0 && tag == 9 && d.OutputReportLength == 0 && reportSize > 0: // output report type + d.OutputReportLength = reportSize + reportSize = 0 + case typ == 1 && tag == 0: // usage page + d.UsagePage = uint16(v) + case typ == 1 && tag == 9: // report count + reportSize = uint16(v) + case typ == 2 && tag == 0 && d.Usage == 0: // usage + d.Usage = uint16(v) + } + + if d.UsagePage > 0 && d.Usage > 0 && d.InputReportLength > 0 && d.OutputReportLength > 0 { + return + } + } +} + +func ByPath(path string) (*DeviceInfo, error) { + return getDeviceInfo(path) +} + +func (d *DeviceInfo) Open() (Device, error) { + f, err := os.OpenFile(d.Path, os.O_RDWR, 0) + if err != nil { + return nil, err + } + + return &linuxDevice{f: f, info: d}, nil +} + +func (d *linuxDevice) Close() { + d.f.Close() +} + +func (d *linuxDevice) Write(data []byte) error { + _, err := d.f.Write(data) + return err +} + +func (d *linuxDevice) ReadCh() <-chan []byte { + d.readSetup.Do(func() { + d.readCh = make(chan []byte, 30) + go d.readThread() + }) + return d.readCh +} + +func (d *linuxDevice) ReadError() error { + return d.readErr +} + +func (d *linuxDevice) readThread() { + defer close(d.readCh) + for { + buf := make([]byte, d.info.InputReportLength) + n, err := d.f.Read(buf) + if err != nil { + d.readErr = err + return + } + select { + case d.readCh <- buf[:n]: + default: + } + } +} diff --git a/vendor/github.com/convox/hid/hid_windows.go b/vendor/github.com/convox/hid/hid_windows.go new file mode 100644 index 0000000..85b39dc --- /dev/null +++ b/vendor/github.com/convox/hid/hid_windows.go @@ -0,0 +1,332 @@ +package hid + +/* +#cgo LDFLAGS: -lSetupapi -lhid + +#ifdef __MINGW32__ +#include +#endif + +#include +#include +#include +*/ +import "C" + +import ( + "errors" + "fmt" + "sync" + "syscall" + "unsafe" +) + +type winDevice struct { + handle syscall.Handle + info *DeviceInfo + + readSetup sync.Once + readCh chan []byte + readErr error + readOl *syscall.Overlapped +} + +// returns the casted handle of the device +func (d *winDevice) h() C.HANDLE { + return (C.HANDLE)((unsafe.Pointer)(d.handle)) +} + +// checks if the handle of the device is valid +func (d *winDevice) isValid() bool { + return d.handle != syscall.InvalidHandle +} + +func (d *winDevice) Close() { + // cancel any pending reads and unblock read loop + d.readErr = errors.New("hid: device closed") + C.CancelIo(d.h()) + C.SetEvent(C.HANDLE(unsafe.Pointer(d.readOl.HEvent))) + syscall.CloseHandle(d.readOl.HEvent) + + syscall.CloseHandle(d.handle) + d.handle = syscall.InvalidHandle +} + +func (d *winDevice) Write(data []byte) error { + // first make sure we send the correct amount of data to the device + outSize := int(d.info.OutputReportLength + 1) + if len(data) != outSize { + buf := make([]byte, outSize) + copy(buf, data) + data = buf + } + + ol := new(syscall.Overlapped) + if err := syscall.WriteFile(d.handle, data, nil, ol); err != nil { + // IO Pending is ok we simply wait for it to finish a few lines below + // all other errors should be reported. + if err != syscall.ERROR_IO_PENDING { + return err + } + } + + // now wait for the overlapped device access to finish. + var written C.DWORD + if C.GetOverlappedResult(d.h(), (*C.OVERLAPPED)((unsafe.Pointer)(ol)), &written, C.TRUE) == 0 { + return syscall.GetLastError() + } + + if int(written) != outSize { + return errors.New("written bytes missmatch!") + } + return nil +} + +type callCFn func(buf unsafe.Pointer, bufSize *C.DWORD) unsafe.Pointer + +// simple helper function for this windows +// "call a function twice to get the amount of space that needs to be allocated" stuff +func getCString(fnCall callCFn) string { + var requiredSize C.DWORD + fnCall(nil, &requiredSize) + if requiredSize <= 0 { + return "" + } + + buffer := C.malloc((C.size_t)(requiredSize)) + defer C.free(buffer) + + strPt := fnCall(buffer, &requiredSize) + + return C.GoString((*C.char)(strPt)) +} + +func openDevice(info *DeviceInfo, enumerate bool) (*winDevice, error) { + access := uint32(syscall.GENERIC_WRITE | syscall.GENERIC_READ) + shareMode := uint32(syscall.FILE_SHARE_READ) + if enumerate { + // if we just need a handle to get the device properties + // we should not claim exclusive access on the device + access = 0 + shareMode = uint32(syscall.FILE_SHARE_READ | syscall.FILE_SHARE_WRITE) + } + pPtr, err := syscall.UTF16PtrFromString(info.Path) + if err != nil { + return nil, err + } + + hFile, err := syscall.CreateFile(pPtr, access, shareMode, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED, 0) + if err != nil { + return nil, err + } else { + return &winDevice{ + handle: hFile, + info: info, + readOl: &syscall.Overlapped{ + HEvent: syscall.Handle(C.CreateEvent(nil, C.FALSE, C.FALSE, nil)), + }, + }, nil + } +} + +func getDeviceDetails(deviceInfoSet C.HDEVINFO, deviceInterfaceData *C.SP_DEVICE_INTERFACE_DATA) *DeviceInfo { + devicePath := getCString(func(buffer unsafe.Pointer, size *C.DWORD) unsafe.Pointer { + interfaceDetailData := (*C.SP_DEVICE_INTERFACE_DETAIL_DATA_A)(buffer) + if interfaceDetailData != nil { + interfaceDetailData.cbSize = C.DWORD(unsafe.Sizeof(interfaceDetailData)) + } + C.SetupDiGetDeviceInterfaceDetailA(deviceInfoSet, deviceInterfaceData, interfaceDetailData, *size, size, nil) + if interfaceDetailData != nil { + return (unsafe.Pointer)(&interfaceDetailData.DevicePath[0]) + } else { + return nil + } + }) + if devicePath == "" { + return nil + } + + // Make sure this device is of Setup Class "HIDClass" and has a driver bound to it. + var i C.DWORD + var devinfoData C.SP_DEVINFO_DATA + devinfoData.cbSize = C.DWORD(unsafe.Sizeof(devinfoData)) + isHID := false + for i = 0; ; i++ { + if res := C.SetupDiEnumDeviceInfo(deviceInfoSet, i, &devinfoData); res == 0 { + break + } + + classStr := getCString(func(buffer unsafe.Pointer, size *C.DWORD) unsafe.Pointer { + C.SetupDiGetDeviceRegistryPropertyA(deviceInfoSet, &devinfoData, C.SPDRP_CLASS, nil, (*C.BYTE)(buffer), *size, size) + return buffer + }) + + if classStr == "HIDClass" { + driverName := getCString(func(buffer unsafe.Pointer, size *C.DWORD) unsafe.Pointer { + C.SetupDiGetDeviceRegistryPropertyA(deviceInfoSet, &devinfoData, C.SPDRP_DRIVER, nil, (*C.BYTE)(buffer), *size, size) + return buffer + }) + isHID = driverName != "" + break + } + } + + if !isHID { + return nil + } + d, _ := ByPath(devicePath) + return d +} + +// ByPath gets the device which is bound to the given path. +func ByPath(devicePath string) (*DeviceInfo, error) { + devInfo := &DeviceInfo{Path: devicePath} + dev, err := openDevice(devInfo, true) + if err != nil { + return nil, err + } + defer dev.Close() + if !dev.isValid() { + return nil, errors.New("Failed to open device") + } + + var attrs C.HIDD_ATTRIBUTES + attrs.Size = C.DWORD(unsafe.Sizeof(attrs)) + C.HidD_GetAttributes(dev.h(), &attrs) + + devInfo.VendorID = uint16(attrs.VendorID) + devInfo.ProductID = uint16(attrs.ProductID) + devInfo.VersionNumber = uint16(attrs.VersionNumber) + + const bufLen = 256 + buff := make([]uint16, bufLen) + + C.HidD_GetManufacturerString(dev.h(), (C.PVOID)(&buff[0]), bufLen) + devInfo.Manufacturer = syscall.UTF16ToString(buff) + + C.HidD_GetProductString(dev.h(), (C.PVOID)(&buff[0]), bufLen) + devInfo.Product = syscall.UTF16ToString(buff) + + var preparsedData C.PHIDP_PREPARSED_DATA + if C.HidD_GetPreparsedData(dev.h(), &preparsedData) != 0 { + var caps C.HIDP_CAPS + + if C.HidP_GetCaps(preparsedData, &caps) == C.HIDP_STATUS_SUCCESS { + devInfo.UsagePage = uint16(caps.UsagePage) + devInfo.Usage = uint16(caps.Usage) + devInfo.InputReportLength = uint16(caps.InputReportByteLength - 1) + devInfo.OutputReportLength = uint16(caps.OutputReportByteLength - 1) + } + + C.HidD_FreePreparsedData(preparsedData) + } + + return devInfo, nil +} + +// Devices returns all HID devices which are connected to the system. +func Devices() ([]*DeviceInfo, error) { + var result []*DeviceInfo + var InterfaceClassGuid C.GUID + C.HidD_GetHidGuid(&InterfaceClassGuid) + deviceInfoSet := C.SetupDiGetClassDevsA(&InterfaceClassGuid, nil, nil, C.DIGCF_PRESENT|C.DIGCF_DEVICEINTERFACE) + defer C.SetupDiDestroyDeviceInfoList(deviceInfoSet) + + var deviceIdx C.DWORD = 0 + var deviceInterfaceData C.SP_DEVICE_INTERFACE_DATA + deviceInterfaceData.cbSize = C.DWORD(unsafe.Sizeof(deviceInterfaceData)) + + for ; ; deviceIdx++ { + res := C.SetupDiEnumDeviceInterfaces(deviceInfoSet, nil, &InterfaceClassGuid, deviceIdx, &deviceInterfaceData) + if res == 0 { + break + } + di := getDeviceDetails(deviceInfoSet, &deviceInterfaceData) + if di != nil { + result = append(result, di) + } + } + return result, nil +} + +// Open openes the device for read / write access. +func (di *DeviceInfo) Open() (Device, error) { + d, err := openDevice(di, false) + if err != nil { + return nil, err + } + if d.isValid() { + return d, nil + } else { + d.Close() + err := syscall.GetLastError() + if err == nil { + err = errors.New("Unable to open device!") + } + return nil, err + } +} + +func (d *winDevice) ReadCh() <-chan []byte { + d.readSetup.Do(func() { + d.readCh = make(chan []byte, 30) + go d.readThread() + }) + return d.readCh +} + +func (d *winDevice) ReadError() error { + return d.readErr +} + +func (d *winDevice) readThread() { + defer close(d.readCh) + + for { + buf := make([]byte, d.info.InputReportLength+1) + C.ResetEvent(C.HANDLE(unsafe.Pointer(d.readOl.HEvent))) + + if err := syscall.ReadFile(d.handle, buf, nil, d.readOl); err != nil { + if err != syscall.ERROR_IO_PENDING { + if d.readErr == nil { + d.readErr = err + } + return + } + } + + // Wait for the read to finish + res := C.WaitForSingleObject(C.HANDLE(unsafe.Pointer(d.readOl.HEvent)), C.INFINITE) + if res != C.WAIT_OBJECT_0 { + if d.readErr == nil { + d.readErr = fmt.Errorf("hid: unexpected read wait state %d", res) + } + return + } + + var n C.DWORD + if r := C.GetOverlappedResult(d.h(), (*C.OVERLAPPED)((unsafe.Pointer)(d.readOl)), &n, C.TRUE); r == 0 { + if d.readErr == nil { + d.readErr = fmt.Errorf("hid: unexpected read result state %d", r) + } + return + } + if n == 0 { + if d.readErr == nil { + d.readErr = errors.New("hid: zero byte read") + } + return + } + + if buf[0] == 0 { + // Report numbers are not being used, so remove zero to match other platforms + buf = buf[1:] + } + + select { + case d.readCh <- buf[:int(n-1)]: + default: + } + } + +} diff --git a/vendor/github.com/convox/hid/ioctl_linux.go b/vendor/github.com/convox/hid/ioctl_linux.go new file mode 100644 index 0000000..8763ce5 --- /dev/null +++ b/vendor/github.com/convox/hid/ioctl_linux.go @@ -0,0 +1,80 @@ +package hid + +import "syscall" + +// This file is https://github.com/wolfeidau/gioctl/blob/0a268ca608219d1d45cfcc50ca4dbfe232baaf0d/ioctl.go +// +// Copyright (c) 2014 Mark Wolfe and licenced under the MIT licence. All rights +// not explicitly granted in the MIT license are reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +const ( + typeBits = 8 + numberBits = 8 + sizeBits = 14 + directionBits = 2 + + typeMask = (1 << typeBits) - 1 + numberMask = (1 << numberBits) - 1 + sizeMask = (1 << sizeBits) - 1 + directionMask = (1 << directionBits) - 1 + + directionNone = 0 + directionWrite = 1 + directionRead = 2 + + numberShift = 0 + typeShift = numberShift + numberBits + sizeShift = typeShift + typeBits + directionShift = sizeShift + sizeBits +) + +func ioc(dir, t, nr, size uintptr) uintptr { + return (dir << directionShift) | (t << typeShift) | (nr << numberShift) | (size << sizeShift) +} + +// io used for a simple ioctl that sends nothing but the type and number, and receives back nothing but an (integer) retval. +func io(t, nr uintptr) uintptr { + return ioc(directionNone, t, nr, 0) +} + +// ioR used for an ioctl that reads data from the device driver. The driver will be allowed to return sizeof(data_type) bytes to the user. +func ioR(t, nr, size uintptr) uintptr { + return ioc(directionRead, t, nr, size) +} + +// ioW used for an ioctl that writes data to the device driver. +func ioW(t, nr, size uintptr) uintptr { + return ioc(directionWrite, t, nr, size) +} + +// ioRW a combination of IoR and IoW. That is, data is both written to the driver and then read back from the driver by the client. +func ioRW(t, nr, size uintptr) uintptr { + return ioc(directionRead|directionWrite, t, nr, size) +} + +// ioctl simplified ioct call +func ioctl(fd, op, arg uintptr) error { + _, _, ep := syscall.Syscall(syscall.SYS_IOCTL, fd, op, arg) + if ep != 0 { + return syscall.Errno(ep) + } + return nil +} diff --git a/vendor/github.com/convox/inotify/README.txt b/vendor/github.com/convox/inotify/README.txt new file mode 100644 index 0000000..0a395af --- /dev/null +++ b/vendor/github.com/convox/inotify/README.txt @@ -0,0 +1,7 @@ +Republishing from golang.org/x/exp/inotify to preserve + +https://github.com/golang/exp/tree/292a51b8d262487dab23a588950e8052d63d9113/inotify + +https://github.com/golang/exp/tree/master/inotify + +https://fsnotify.org/ diff --git a/vendor/github.com/convox/inotify/inotify_linux.go b/vendor/github.com/convox/inotify/inotify_linux.go new file mode 100644 index 0000000..aed06c7 --- /dev/null +++ b/vendor/github.com/convox/inotify/inotify_linux.go @@ -0,0 +1,306 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package inotify implements a wrapper for the Linux inotify system. + +Example: + watcher, err := inotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + err = watcher.Watch("/tmp") + if err != nil { + log.Fatal(err) + } + for { + select { + case ev := <-watcher.Event: + log.Println("event:", ev) + case err := <-watcher.Error: + log.Println("error:", err) + } + } + +*/ +package inotify // import "github.com/convox/inotify" + +import ( + "errors" + "fmt" + "os" + "strings" + "sync" + "syscall" + "unsafe" +) + +type Event struct { + Mask uint32 // Mask of events + Cookie uint32 // Unique cookie associating related events (for rename(2)) + Name string // File name (optional) +} + +type watch struct { + wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) + flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) +} + +type Watcher struct { + mu sync.Mutex + fd int // File descriptor (as returned by the inotify_init() syscall) + watches map[string]*watch // Map of inotify watches (key: path) + paths map[int]string // Map of watched paths (key: watch descriptor) + Error chan error // Errors are sent on this channel + Event chan *Event // Events are returned on this channel + done chan bool // Channel for sending a "quit message" to the reader goroutine + isClosed bool // Set to true when Close() is first called +} + +// NewWatcher creates and returns a new inotify instance using inotify_init(2) +func NewWatcher() (*Watcher, error) { + fd, errno := syscall.InotifyInit() + if fd == -1 { + return nil, os.NewSyscallError("inotify_init", errno) + } + w := &Watcher{ + fd: fd, + watches: make(map[string]*watch), + paths: make(map[int]string), + Event: make(chan *Event), + Error: make(chan error), + done: make(chan bool, 1), + } + + go w.readEvents() + return w, nil +} + +// Close closes an inotify watcher instance +// It sends a message to the reader goroutine to quit and removes all watches +// associated with the inotify instance +func (w *Watcher) Close() error { + if w.isClosed { + return nil + } + w.isClosed = true + + // Send "quit" message to the reader goroutine + w.done <- true + for path := range w.watches { + w.RemoveWatch(path) + } + + return nil +} + +// AddWatch adds path to the watched file set. +// The flags are interpreted as described in inotify_add_watch(2). +func (w *Watcher) AddWatch(path string, flags uint32) error { + if w.isClosed { + return errors.New("inotify instance already closed") + } + + watchEntry, found := w.watches[path] + if found { + watchEntry.flags |= flags + flags |= syscall.IN_MASK_ADD + } + + w.mu.Lock() // synchronize with readEvents goroutine + + wd, err := syscall.InotifyAddWatch(w.fd, path, flags) + if err != nil { + w.mu.Unlock() + return &os.PathError{ + Op: "inotify_add_watch", + Path: path, + Err: err, + } + } + + if !found { + w.watches[path] = &watch{wd: uint32(wd), flags: flags} + w.paths[wd] = path + } + w.mu.Unlock() + return nil +} + +// Watch adds path to the watched file set, watching all events. +func (w *Watcher) Watch(path string) error { + return w.AddWatch(path, IN_ALL_EVENTS) +} + +// RemoveWatch removes path from the watched file set. +func (w *Watcher) RemoveWatch(path string) error { + watch, ok := w.watches[path] + if !ok { + return errors.New(fmt.Sprintf("can't remove non-existent inotify watch for: %s", path)) + } + success, errno := syscall.InotifyRmWatch(w.fd, watch.wd) + if success == -1 { + return os.NewSyscallError("inotify_rm_watch", errno) + } + delete(w.watches, path) + // Locking here to protect the read from paths in readEvents. + w.mu.Lock() + delete(w.paths, int(watch.wd)) + w.mu.Unlock() + return nil +} + +// readEvents reads from the inotify file descriptor, converts the +// received events into Event objects and sends them via the Event channel +func (w *Watcher) readEvents() { + var buf [syscall.SizeofInotifyEvent * 4096]byte + + for { + n, err := syscall.Read(w.fd, buf[:]) + // See if there is a message on the "done" channel + var done bool + select { + case done = <-w.done: + default: + } + + // If EOF or a "done" message is received + if n == 0 || done { + // The syscall.Close can be slow. Close + // w.Event first. + close(w.Event) + err := syscall.Close(w.fd) + if err != nil { + w.Error <- os.NewSyscallError("close", err) + } + close(w.Error) + return + } + if n < 0 { + w.Error <- os.NewSyscallError("read", err) + continue + } + if n < syscall.SizeofInotifyEvent { + w.Error <- errors.New("inotify: short read in readEvents()") + continue + } + + var offset uint32 = 0 + // We don't know how many events we just read into the buffer + // While the offset points to at least one whole event... + for offset <= uint32(n-syscall.SizeofInotifyEvent) { + // Point "raw" to the event in the buffer + raw := (*syscall.InotifyEvent)(unsafe.Pointer(&buf[offset])) + event := new(Event) + event.Mask = uint32(raw.Mask) + event.Cookie = uint32(raw.Cookie) + nameLen := uint32(raw.Len) + // If the event happened to the watched directory or the watched file, the kernel + // doesn't append the filename to the event, but we would like to always fill the + // the "Name" field with a valid filename. We retrieve the path of the watch from + // the "paths" map. + w.mu.Lock() + name, ok := w.paths[int(raw.Wd)] + w.mu.Unlock() + if ok { + event.Name = name + if nameLen > 0 { + // Point "bytes" at the first byte of the filename + bytes := (*[syscall.PathMax]byte)(unsafe.Pointer(&buf[offset+syscall.SizeofInotifyEvent])) + // The filename is padded with NUL bytes. TrimRight() gets rid of those. + event.Name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") + } + // Send the event on the events channel + w.Event <- event + } + // Move to the next event in the buffer + offset += syscall.SizeofInotifyEvent + nameLen + } + } +} + +// String formats the event e in the form +// "filename: 0xEventMask = IN_ACCESS|IN_ATTRIB_|..." +func (e *Event) String() string { + var events string = "" + + m := e.Mask + for _, b := range eventBits { + if m&b.Value == b.Value { + m &^= b.Value + events += "|" + b.Name + } + } + + if m != 0 { + events += fmt.Sprintf("|%#x", m) + } + if len(events) > 0 { + events = " == " + events[1:] + } + + return fmt.Sprintf("%q: %#x%s", e.Name, e.Mask, events) +} + +const ( + // Options for inotify_init() are not exported + // IN_CLOEXEC uint32 = syscall.IN_CLOEXEC + // IN_NONBLOCK uint32 = syscall.IN_NONBLOCK + + // Options for AddWatch + IN_DONT_FOLLOW uint32 = syscall.IN_DONT_FOLLOW + IN_ONESHOT uint32 = syscall.IN_ONESHOT + IN_ONLYDIR uint32 = syscall.IN_ONLYDIR + + // The "IN_MASK_ADD" option is not exported, as AddWatch + // adds it automatically, if there is already a watch for the given path + // IN_MASK_ADD uint32 = syscall.IN_MASK_ADD + + // Events + IN_ACCESS uint32 = syscall.IN_ACCESS + IN_ALL_EVENTS uint32 = syscall.IN_ALL_EVENTS + IN_ATTRIB uint32 = syscall.IN_ATTRIB + IN_CLOSE uint32 = syscall.IN_CLOSE + IN_CLOSE_NOWRITE uint32 = syscall.IN_CLOSE_NOWRITE + IN_CLOSE_WRITE uint32 = syscall.IN_CLOSE_WRITE + IN_CREATE uint32 = syscall.IN_CREATE + IN_DELETE uint32 = syscall.IN_DELETE + IN_DELETE_SELF uint32 = syscall.IN_DELETE_SELF + IN_MODIFY uint32 = syscall.IN_MODIFY + IN_MOVE uint32 = syscall.IN_MOVE + IN_MOVED_FROM uint32 = syscall.IN_MOVED_FROM + IN_MOVED_TO uint32 = syscall.IN_MOVED_TO + IN_MOVE_SELF uint32 = syscall.IN_MOVE_SELF + IN_OPEN uint32 = syscall.IN_OPEN + + // Special events + IN_ISDIR uint32 = syscall.IN_ISDIR + IN_IGNORED uint32 = syscall.IN_IGNORED + IN_Q_OVERFLOW uint32 = syscall.IN_Q_OVERFLOW + IN_UNMOUNT uint32 = syscall.IN_UNMOUNT +) + +var eventBits = []struct { + Value uint32 + Name string +}{ + {IN_ACCESS, "IN_ACCESS"}, + {IN_ATTRIB, "IN_ATTRIB"}, + {IN_CLOSE, "IN_CLOSE"}, + {IN_CLOSE_NOWRITE, "IN_CLOSE_NOWRITE"}, + {IN_CLOSE_WRITE, "IN_CLOSE_WRITE"}, + {IN_CREATE, "IN_CREATE"}, + {IN_DELETE, "IN_DELETE"}, + {IN_DELETE_SELF, "IN_DELETE_SELF"}, + {IN_MODIFY, "IN_MODIFY"}, + {IN_MOVE, "IN_MOVE"}, + {IN_MOVED_FROM, "IN_MOVED_FROM"}, + {IN_MOVED_TO, "IN_MOVED_TO"}, + {IN_MOVE_SELF, "IN_MOVE_SELF"}, + {IN_OPEN, "IN_OPEN"}, + {IN_ISDIR, "IN_ISDIR"}, + {IN_IGNORED, "IN_IGNORED"}, + {IN_Q_OVERFLOW, "IN_Q_OVERFLOW"}, + {IN_UNMOUNT, "IN_UNMOUNT"}, +} diff --git a/vendor/github.com/convox/stdcli/command.go b/vendor/github.com/convox/stdcli/command.go new file mode 100644 index 0000000..7cd7794 --- /dev/null +++ b/vendor/github.com/convox/stdcli/command.go @@ -0,0 +1,103 @@ +package stdcli + +import ( + "context" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/spf13/pflag" +) + +type Command struct { + Command []string + Description string + Flags []Flag + Invisible bool + Handler HandlerFunc + Usage string + Validate Validator + + engine *Engine +} + +type CommandOptions struct { + Flags []Flag + Invisible bool + Usage string + Validate Validator +} + +type HandlerFunc func(*Context) error + +// func (c *Command) Execute(args []string) error { +// ctx, cancel := context.WithCancel(context.Background()) +// defer cancel() + +// return c.ExecuteContext(ctx, args) +// } + +func (c *Command) ExecuteContext(ctx context.Context, args []string) error { + fs := pflag.NewFlagSet("", pflag.ContinueOnError) + fs.Usage = func() { helpCommand(c.engine, c) } + + flags := []*Flag{} + + for _, f := range c.Flags { + g := f + flags = append(flags, &g) + flag := fs.VarPF(&g, f.Name, f.Short, f.Description) + if f.Type() == "bool" { + flag.NoOptDefVal = "true" + } + } + + if err := fs.Parse(args); err != nil { + if strings.HasPrefix(err.Error(), "unknown shorthand flag") { + parts := strings.Split(err.Error(), " ") + return fmt.Errorf("unknown flag: %s", parts[len(parts)-1]) + } + if err == pflag.ErrHelp { + return nil + } + return err + } + + cc := &Context{ + Context: ctx, + Args: fs.Args(), + Flags: flags, + engine: c.engine, + } + + if c.Validate != nil { + if err := c.Validate(cc); err != nil { + return err + } + } + + if err := c.Handler(cc); err != nil { + return err + } + + return nil +} + +func (c *Command) FullCommand() string { + return filepath.Base(os.Args[0]) + " " + strings.Join(c.Command, " ") +} + +func (c *Command) Match(args []string) ([]string, bool) { + if len(args) < len(c.Command) { + return args, false + } + + for i := range c.Command { + if args[i] != c.Command[i] { + return args, false + } + } + + return args[len(c.Command):], true +} diff --git a/vendor/github.com/convox/stdcli/context.go b/vendor/github.com/convox/stdcli/context.go new file mode 100644 index 0000000..14c107c --- /dev/null +++ b/vendor/github.com/convox/stdcli/context.go @@ -0,0 +1,254 @@ +package stdcli + +import ( + "context" + "fmt" + "os" + "reflect" + "strings" + "time" + + "golang.org/x/crypto/ssh/terminal" +) + +type Context struct { + context.Context + + Args []string + Flags []*Flag + + engine *Engine +} + +func (c *Context) Execute(cmd string, args ...string) ([]byte, error) { + if c.engine.Executor == nil { + return nil, fmt.Errorf("no executor") + } + + return c.engine.Executor.Execute(cmd, args...) +} + +func (c *Context) Run(cmd string, args ...string) error { + if c.engine.Executor == nil { + return fmt.Errorf("no executor") + } + + return c.engine.Executor.Run(c, cmd, args...) +} + +func (c *Context) Terminal(cmd string, args ...string) error { + if c.engine.Executor == nil { + return fmt.Errorf("no executor") + } + + return c.engine.Executor.Terminal(cmd, args...) +} + +func (c *Context) Version() string { + return c.engine.Version +} + +func (c *Context) Arg(i int) string { + if i < len(c.Args) { + return c.Args[i] + } + + return "" +} + +func (c *Context) Flag(name string) *Flag { + for _, f := range c.Flags { + if f.Name == name { + return f + } + } + return nil +} + +func (c *Context) Bool(name string) bool { + if f := c.Flag(name); f != nil && f.Type() == "bool" { + switch t := f.Value.(type) { + case nil: + v, _ := f.Default.(bool) + return v + case bool: + return t + } + } + return false +} + +func (c *Context) Int(name string) int { + if f := c.Flag(name); f != nil && f.Type() == "int" { + switch t := f.Value.(type) { + case nil: + v, _ := f.Default.(int) + return v + case int: + return t + } + } + return 0 +} + +func (c *Context) String(name string) string { + if f := c.Flag(name); f != nil && f.Type() == "string" { + switch t := f.Value.(type) { + case nil: + v, _ := f.Default.(string) + return v + case string: + return t + } + } + return "" +} + +func (c *Context) Value(name string) interface{} { + if f := c.Flag(name); f != nil { + return f.Value + } + return nil +} + +func (c *Context) Info() *Info { + return &Info{Context: c} +} + +func (c *Context) ReadSecret() (string, error) { + data, err := terminal.ReadPassword(int(os.Stdin.Fd())) + if err != nil { + return "", err + } + + return string(data), nil +} + +func (c *Context) TerminalRaw() func() { + fn := c.Reader().TerminalRaw() + return func() { + if fn() { + c.Writef("\r") + } + } +} + +func (c *Context) TerminalSize() (int, int, error) { + return terminal.GetSize(int(os.Stdout.Fd())) +} + +func (c *Context) Fail(err error) { + if err != nil { + c.Writer().Error(err) + os.Exit(1) + } +} + +func (c *Context) Read(data []byte) (int, error) { + return c.Reader().Read(data) +} + +func (c *Context) Reader() *Reader { + return c.engine.Reader +} + +func (c *Context) LocalSetting(name string) string { + return c.engine.LocalSetting(name) +} + +func (c *Context) SettingDelete(name string) error { + return c.engine.SettingDelete(name) +} + +func (c *Context) SettingRead(name string) (string, error) { + return c.engine.SettingRead(name) +} + +func (c *Context) SettingReadKey(name, key string) (string, error) { + return c.engine.SettingReadKey(name, key) +} + +func (c *Context) SettingWrite(name, value string) error { + return c.engine.SettingWrite(name, value) +} + +func (c *Context) SettingWriteKey(name, key, value string) error { + return c.engine.SettingWriteKey(name, key, value) +} + +func (c *Context) Table(columns ...string) *Table { + return &Table{Columns: columns, Context: c} +} + +func (c *Context) Write(data []byte) (int, error) { + return c.Writer().Write(data) +} + +func (c *Context) Writer() *Writer { + return c.engine.Writer +} + +func (c *Context) OK(id ...string) error { + c.Writer().Writef("OK") + + if len(id) > 0 { + c.Writer().Writef(", %s", strings.Join(id, " ")) + } + + c.Writer().Writef("\n") + + return nil +} + +func (c *Context) Startf(format string, args ...interface{}) { + c.Writer().Writef(fmt.Sprintf("%s... ", format), args...) +} + +func (c *Context) Writef(format string, args ...interface{}) error { + _, err := c.Writer().Writef(format, args...) + return err +} + +func (c *Context) Error(err error) error { + return c.Writer().Error(err) +} + +func (c *Context) Errorf(format string, args ...interface{}) error { + return c.Writer().Errorf(format, args...) +} + +func (c *Context) Options(opts interface{}) error { + v := reflect.ValueOf(opts).Elem() + t := v.Type() + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + u := v.Field(i) + + if n := f.Tag.Get("flag"); n != "" { + name := strings.Split(n, ",")[0] + switch typeString(f.Type.Elem()) { + case "bool": + if x, ok := c.Value(name).(bool); ok { + u.Set(reflect.ValueOf(&x)) + } + case "duration": + if x, ok := c.Value(name).(time.Duration); ok { + u.Set(reflect.ValueOf(&x)) + } + case "int": + if x, ok := c.Value(name).(int); ok { + u.Set(reflect.ValueOf(&x)) + } + case "string": + if x, ok := c.Value(name).(string); ok { + u.Set(reflect.ValueOf(&x)) + } + default: + return fmt.Errorf("unknown flag type: %s", f.Type.Elem().Kind()) + } + } + } + + return nil +} diff --git a/vendor/github.com/convox/stdcli/engine.go b/vendor/github.com/convox/stdcli/engine.go new file mode 100644 index 0000000..187dfe1 --- /dev/null +++ b/vendor/github.com/convox/stdcli/engine.go @@ -0,0 +1,94 @@ +package stdcli + +import ( + "context" + "fmt" + "path/filepath" + "strings" + + homedir "github.com/mitchellh/go-homedir" +) + +type Engine struct { + Commands []Command + Executor Executor + Name string + Reader *Reader + Settings string + Version string + Writer *Writer +} + +func (e *Engine) Command(command, description string, fn HandlerFunc, opts CommandOptions) { + e.Commands = append(e.Commands, Command{ + Command: strings.Split(command, " "), + Description: description, + Handler: fn, + Flags: opts.Flags, + Invisible: opts.Invisible, + Usage: opts.Usage, + Validate: opts.Validate, + engine: e, + }) +} + +func (e *Engine) Execute(args []string) int { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + return e.ExecuteContext(ctx, args) +} + +func (e *Engine) ExecuteContext(ctx context.Context, args []string) int { + if len(args) > 0 && (args[0] == "-v" || args[0] == "--version") { + fmt.Println(e.Version) + return 0 + } + + var m *Command + var cargs []string + + for _, c := range e.Commands { + d := c + if a, ok := d.Match(args); ok { + if m == nil || len(m.Command) < len(c.Command) { + m = &d + cargs = a + } + } + } + + if m == nil { + m = &(e.Commands[0]) + } + + err := m.ExecuteContext(ctx, cargs) + switch t := err.(type) { + case nil: + return 0 + case ExitCoder: + return t.Code() + default: + e.Writer.Errorf("%s", t) + return 1 + } + + return 0 +} + +func (e *Engine) settingFile(name string) (string, error) { + if dir := e.Settings; dir != "" { + return filepath.Join(dir, name), nil + } + + home, err := homedir.Dir() + if err != nil { + return "", err + } + + return filepath.Join(home, fmt.Sprintf(".%s", e.Name), name), nil +} + +func (e *Engine) localSettingDir() string { + return fmt.Sprintf(".%s", e.Name) +} diff --git a/vendor/github.com/convox/stdcli/executor.go b/vendor/github.com/convox/stdcli/executor.go new file mode 100644 index 0000000..54cb696 --- /dev/null +++ b/vendor/github.com/convox/stdcli/executor.go @@ -0,0 +1,39 @@ +package stdcli + +import ( + "io" + "os" + "os/exec" +) + +type Executor interface { + Execute(cmd string, args ...string) ([]byte, error) + Run(w io.Writer, cmd string, args ...string) error + Terminal(cmd string, args ...string) error +} + +type CmdExecutor struct { +} + +func (e *CmdExecutor) Execute(cmd string, args ...string) ([]byte, error) { + return exec.Command(cmd, args...).CombinedOutput() +} + +func (e *CmdExecutor) Run(w io.Writer, cmd string, args ...string) error { + c := exec.Command(cmd, args...) + + c.Stdout = w + c.Stderr = w + + return c.Run() +} + +func (e *CmdExecutor) Terminal(cmd string, args ...string) error { + c := exec.Command(cmd, args...) + + c.Stdin = os.Stdin + c.Stdout = os.Stdout + c.Stderr = os.Stderr + + return c.Run() +} diff --git a/vendor/github.com/convox/stdcli/exit.go b/vendor/github.com/convox/stdcli/exit.go new file mode 100644 index 0000000..caf3ef8 --- /dev/null +++ b/vendor/github.com/convox/stdcli/exit.go @@ -0,0 +1,23 @@ +package stdcli + +import "fmt" + +type ExitCoder interface { + Code() int +} + +type ExitCode struct { + code int +} + +func (e ExitCode) Code() int { + return e.code +} + +func (e ExitCode) Error() string { + return fmt.Sprintf("exit %d", e.code) +} + +func Exit(code int) ExitCode { + return ExitCode{code: code} +} diff --git a/vendor/github.com/convox/stdcli/flag.go b/vendor/github.com/convox/stdcli/flag.go new file mode 100644 index 0000000..9f186aa --- /dev/null +++ b/vendor/github.com/convox/stdcli/flag.go @@ -0,0 +1,153 @@ +package stdcli + +import ( + "fmt" + "reflect" + "strconv" + "strings" + "time" +) + +type Flag struct { + Default interface{} + Description string + Name string + Short string + Value interface{} + + kind string +} + +func BoolFlag(name, short, description string) Flag { + return Flag{ + Description: description, + Name: name, + Short: short, + kind: "bool", + } +} + +func DurationFlag(name, short, description string) Flag { + return Flag{ + Description: description, + Name: name, + Short: short, + kind: "duration", + } +} + +func IntFlag(name, short, description string) Flag { + return Flag{ + Description: description, + Name: name, + Short: short, + kind: "int", + } +} + +func StringFlag(name, short, description string) Flag { + return Flag{ + Description: description, + Name: name, + Short: short, + kind: "string", + } +} + +func (f *Flag) Set(v string) error { + switch f.Type() { + case "bool": + f.Value = (v == "true") + case "duration": + d, err := time.ParseDuration(v) + if err != nil { + return err + } + f.Value = d + case "int": + i, err := strconv.Atoi(v) + if err != nil { + return err + } + f.Value = i + case "string": + f.Value = v + default: + return fmt.Errorf("unknown flag type: %s", f.Type()) + } + + return nil +} + +func (f *Flag) String() string { + return fmt.Sprintf("%s: %v", f.Name, f.Value) +} + +func (f *Flag) Type() string { + return f.kind +} + +func (f *Flag) Usage(v string) string { + switch f.Type() { + case "bool": + return fmt.Sprintf("%s ", v) + case "duration", "int", "string": + return fmt.Sprintf("%s %s", v, f.Name) + default: + panic(fmt.Sprintf("unknown flag type: %s", f.Type())) + } +} + +func (f *Flag) UsageLong() string { + return f.Usage(fmt.Sprintf("--%s", f.Name)) +} + +func (f *Flag) UsageShort() string { + if f.Short == "" { + return "" + } + + return f.Usage(fmt.Sprintf("-%s", f.Short)) +} + +func OptionFlags(opts interface{}) []Flag { + flags := []Flag{} + + v := reflect.ValueOf(opts) + t := v.Type() + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + + if n := f.Tag.Get("flag"); n != "" { + parts := strings.Split(n, ",") + flag := Flag{ + Default: f.Tag.Get("default"), + Description: f.Tag.Get("desc"), + Name: parts[0], + kind: typeString(f.Type.Elem()), + } + if len(parts) > 1 { + flag.Short = parts[1] + } + flags = append(flags, flag) + } + } + + return flags +} + +func typeString(v reflect.Type) string { + switch v.String() { + case "bool": + return "bool" + case "int": + return "int" + case "string": + return "string" + case "time.Duration": + return "duration" + default: + panic(fmt.Sprintf("unknown flag type: %s", v)) + } +} diff --git a/vendor/github.com/convox/stdcli/help.go b/vendor/github.com/convox/stdcli/help.go new file mode 100644 index 0000000..8ef4daa --- /dev/null +++ b/vendor/github.com/convox/stdcli/help.go @@ -0,0 +1,77 @@ +package stdcli + +import ( + "fmt" + "sort" +) + +func Help(c *Context) error { + helpGlobal(c.engine) + return nil +} + +func helpGlobal(e *Engine) { + cs := []Command{} + + for _, cmd := range e.Commands { + if cmd.Invisible { + continue + } + + cs = append(cs, cmd) + } + + sort.Slice(cs, func(i, j int) bool { return cs[i].FullCommand() < cs[j].FullCommand() }) + + l := 7 + + for _, cmd := range cs { + c := cmd.FullCommand() + + if len(c) > l { + l = len(c) + } + } + + // e.Writer.Writef(fmt.Sprintf(fmt.Sprintf("

%%-%ds

%%s

\n", l), "COMMAND", "DESCRIPTION")) + + for _, cmd := range cs { + e.Writer.Writef(fmt.Sprintf(fmt.Sprintf("

%%-%ds

%%s\n", l), cmd.FullCommand(), cmd.Description)) + } +} + +func helpCommand(e *Engine, cmd *Command) { + e.Writer.Writef("

USAGE

\n %s %s\n\n", cmd.FullCommand(), cmd.Usage) + + e.Writer.Writef("

DESCRIPTION

\n %s\n\n", cmd.Description) + + e.Writer.Writef("

OPTIONS

\n") + + ll := 0 + ls := 0 + + fs := []Flag{} + + for _, f := range cmd.Flags { + fs = append(fs, f) + } + + sort.Slice(fs, func(i, j int) bool { return fs[i].Name < fs[j].Name }) + + for _, f := range fs { + l := f.UsageLong() + s := f.UsageShort() + + if len(l) > ll { + ll = len(l) + } + + if len(s) > ls { + ls = len(s) + } + } + + for _, f := range fs { + e.Writer.Writef(fmt.Sprintf(fmt.Sprintf(" %%-%ds %%-%ds\n", ll, ls), f.UsageLong(), f.UsageShort())) + } +} diff --git a/vendor/github.com/convox/stdcli/helpers.go b/vendor/github.com/convox/stdcli/helpers.go new file mode 100644 index 0000000..79e8f4e --- /dev/null +++ b/vendor/github.com/convox/stdcli/helpers.go @@ -0,0 +1,31 @@ +package stdcli + +import ( + "os" + + "golang.org/x/crypto/ssh/terminal" +) + +func coalesce(ss ...string) string { + for _, s := range ss { + if s != "" { + return s + } + } + + return "" +} + +func interfaceSlice(ss []string) []interface{} { + is := make([]interface{}, len(ss)) + + for i, s := range ss { + is[i] = s + } + + return is +} + +func IsTerminal(f *os.File) bool { + return terminal.IsTerminal(int(f.Fd())) +} diff --git a/vendor/github.com/convox/stdcli/info.go b/vendor/github.com/convox/stdcli/info.go new file mode 100644 index 0000000..cafb2cb --- /dev/null +++ b/vendor/github.com/convox/stdcli/info.go @@ -0,0 +1,47 @@ +package stdcli + +import ( + "fmt" + "strings" +) + +type Info struct { + Context *Context + Rows []InfoRow +} + +type InfoRow struct { + Header string + Value string +} + +func (i *Info) Add(header, value string) { + i.Rows = append(i.Rows, InfoRow{Header: header, Value: value}) +} + +func (i *Info) Print() error { + f := i.formatString() + + for _, r := range i.Rows { + value := strings.Replace(r.Value, "\n", fmt.Sprintf(fmt.Sprintf("\n%%%ds ", i.headerWidth()), ""), -1) + i.Context.Writef(f, r.Header, value) + } + + return nil +} + +func (i *Info) formatString() string { + return fmt.Sprintf("

%%-%ds

%%s\n", i.headerWidth()) +} + +func (i *Info) headerWidth() int { + w := 0 + + for _, r := range i.Rows { + if len(r.Header) > w { + w = len(r.Header) + } + } + + return w +} diff --git a/vendor/github.com/convox/stdcli/reader.go b/vendor/github.com/convox/stdcli/reader.go new file mode 100644 index 0000000..1e45fe4 --- /dev/null +++ b/vendor/github.com/convox/stdcli/reader.go @@ -0,0 +1,47 @@ +package stdcli + +import ( + "io" + "os" + + "golang.org/x/crypto/ssh/terminal" +) + +var ( + DefaultReader *Reader +) + +type Reader struct { + io.Reader +} + +func init() { + DefaultReader = &Reader{os.Stdin} +} + +func (r *Reader) IsTerminal() bool { + if f, ok := r.Reader.(*os.File); ok { + return IsTerminal(f) + } + return false +} + +func (r *Reader) TerminalRaw() func() bool { + var fd int + var state *terminal.State + + if f, ok := r.Reader.(*os.File); ok { + fd = int(f.Fd()) + if s, err := terminal.MakeRaw(fd); err == nil { + state = s + } + } + + return func() bool { + if state != nil { + terminal.Restore(fd, state) + return true + } + return false + } +} diff --git a/vendor/github.com/convox/stdcli/setting.go b/vendor/github.com/convox/stdcli/setting.go new file mode 100644 index 0000000..bb02129 --- /dev/null +++ b/vendor/github.com/convox/stdcli/setting.go @@ -0,0 +1,118 @@ +package stdcli + +import ( + "encoding/json" + "io/ioutil" + "os" + "path/filepath" + "strings" +) + +func (e *Engine) LocalSetting(name string) string { + file := filepath.Join(e.localSettingDir(), name) + + if _, err := os.Stat(file); os.IsNotExist(err) { + return "" + } + + data, err := ioutil.ReadFile(file) + if err != nil { + return "" + } + + return strings.TrimSpace(string(data)) +} + +func (e *Engine) SettingDelete(name string) error { + file, err := e.settingFile(name) + if err != nil { + return err + } + + if _, err := os.Stat(file); os.IsNotExist(err) { + return nil + } + + if err := os.Remove(file); err != nil { + return err + } + + return nil +} + +func (e *Engine) SettingRead(name string) (string, error) { + file, err := e.settingFile(name) + if err != nil { + return "", err + } + + data, err := ioutil.ReadFile(file) + if os.IsNotExist(err) { + return "", nil + } + if err != nil { + return "", err + } + + return strings.TrimSpace(string(data)), nil +} + +func (e *Engine) SettingReadKey(name, key string) (string, error) { + s, err := e.SettingRead(name) + if err != nil { + return "", err + } + + data := []byte(coalesce(s, "{}")) + + var kv map[string]string + + if err := json.Unmarshal(data, &kv); err != nil { + return "", err + } + + return kv[key], nil +} + +func (e *Engine) SettingWrite(name, value string) error { + file, err := e.settingFile(name) + if err != nil { + return err + } + + dir := filepath.Dir(file) + + if err := os.MkdirAll(dir, 0700); err != nil { + return err + } + + if err := ioutil.WriteFile(file, []byte(value), 0600); err != nil { + return err + } + + return nil +} + +func (e *Engine) SettingWriteKey(name, key, value string) error { + s, err := e.SettingRead(name) + if err != nil { + return err + } + + data := []byte(coalesce(s, "{}")) + + var kv map[string]string + + if err := json.Unmarshal(data, &kv); err != nil { + return err + } + + kv[key] = value + + data, err = json.MarshalIndent(kv, "", " ") + if err != nil { + return err + } + + return e.SettingWrite(name, string(data)) +} diff --git a/vendor/github.com/convox/stdcli/stdcli.go b/vendor/github.com/convox/stdcli/stdcli.go new file mode 100644 index 0000000..605760e --- /dev/null +++ b/vendor/github.com/convox/stdcli/stdcli.go @@ -0,0 +1,19 @@ +package stdcli + +func New(name, version string) *Engine { + e := &Engine{ + Executor: &CmdExecutor{}, + Name: name, + Reader: DefaultReader, + Version: version, + Writer: DefaultWriter, + } + + e.Command("help", "list commands", Help, CommandOptions{ + Validate: ArgsBetween(0, 1), + }) + + terminalSetup() + + return e +} diff --git a/vendor/github.com/convox/stdcli/table.go b/vendor/github.com/convox/stdcli/table.go new file mode 100644 index 0000000..382ee24 --- /dev/null +++ b/vendor/github.com/convox/stdcli/table.go @@ -0,0 +1,58 @@ +package stdcli + +import ( + "fmt" + "strings" +) + +type Table struct { + Columns []string + Context *Context + Rows [][]string +} + +func (t *Table) AddRow(row ...string) { + t.Rows = append(t.Rows, row) +} + +func (t *Table) Print() error { + f := t.formatString() + + t.Context.Writef(fmt.Sprintf("

%s

\n", f), interfaceSlice(t.Columns)...) + + for _, r := range t.Rows { + t.Context.Writef(fmt.Sprintf("%s\n", f), interfaceSlice(r)...) + } + + return nil +} + +func (t *Table) formatString() string { + f := []string{} + + ws := t.widths() + + for _, w := range ws { + f = append(f, fmt.Sprintf("%%-%ds", w)) + } + + return strings.Join(f, " ") +} + +func (t *Table) widths() []int { + w := make([]int, len(t.Columns)) + + for i, c := range t.Columns { + w[i] = len(stripTag(c)) + + for _, r := range t.Rows { + if len(r) > i { + if lri := len(stripTag(r[i])); lri > w[i] { + w[i] = lri + } + } + } + } + + return w +} diff --git a/vendor/github.com/convox/stdcli/term.go b/vendor/github.com/convox/stdcli/term.go new file mode 100644 index 0000000..bcd155a --- /dev/null +++ b/vendor/github.com/convox/stdcli/term.go @@ -0,0 +1,7 @@ +// +build !windows + +package stdcli + +func terminalSetup() error { + return nil +} diff --git a/vendor/github.com/convox/stdcli/term_windows.go b/vendor/github.com/convox/stdcli/term_windows.go new file mode 100644 index 0000000..e145192 --- /dev/null +++ b/vendor/github.com/convox/stdcli/term_windows.go @@ -0,0 +1,28 @@ +package stdcli + +import ( + "syscall" + + "github.com/Azure/go-ansiterm/winterm" +) + +const enableVirtualTerminalProcessing = 0x0004 + +func terminalSetup() error { + hnd, err := syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE) + if err != nil { + return err + } + + var mode uint32 + + if err := syscall.GetConsoleMode(hnd, &mode); err != nil { + return err + } + + if err := winterm.SetConsoleMode(uintptr(hnd), mode|enableVirtualTerminalProcessing); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/convox/stdcli/validate.go b/vendor/github.com/convox/stdcli/validate.go new file mode 100644 index 0000000..23ba280 --- /dev/null +++ b/vendor/github.com/convox/stdcli/validate.go @@ -0,0 +1,54 @@ +package stdcli + +import ( + "fmt" +) + +type Validator func(c *Context) error + +func Args(num int) Validator { + return func(c *Context) error { + if len(c.Args) != num { + return fmt.Errorf("%d %s required", num, plural("arg", num)) + } + return nil + } +} + +func ArgsBetween(min, max int) Validator { + return func(c *Context) error { + if err := ArgsMin(min)(c); err != nil { + return err + } + if err := ArgsMax(max)(c); err != nil { + return err + } + return nil + } +} + +func ArgsMin(min int) Validator { + return func(c *Context) error { + if len(c.Args) < min { + return fmt.Errorf("at least %d %s required", min, plural("arg", min)) + } + return nil + } +} + +func ArgsMax(max int) Validator { + return func(c *Context) error { + if len(c.Args) > max { + return fmt.Errorf("no more than %d %s expected", max, plural("arg", max)) + } + return nil + } +} + +func plural(noun string, num int) string { + if num == 1 { + return noun + } + + return fmt.Sprintf("%ss", noun) +} diff --git a/vendor/github.com/convox/stdcli/writer.go b/vendor/github.com/convox/stdcli/writer.go new file mode 100644 index 0000000..514ebb6 --- /dev/null +++ b/vendor/github.com/convox/stdcli/writer.go @@ -0,0 +1,121 @@ +package stdcli + +import ( + "fmt" + "io" + "os" + "regexp" +) + +var ( + DefaultWriter *Writer +) + +type Renderer func(string) string + +type Writer struct { + Color bool + Stdout io.Writer + Stderr io.Writer + Tags map[string]Renderer +} + +func init() { + DefaultWriter = &Writer{ + Color: IsTerminal(os.Stdout), + Stdout: os.Stdout, + Stderr: os.Stderr, + Tags: map[string]Renderer{ + "error": renderError, + "header": RenderColors(242), + "h1": RenderColors(244), + "h2": RenderColors(241), + "id": RenderColors(247), + "info": RenderColors(247), + "ok": RenderColors(46), + "start": RenderColors(247), + "u": RenderUnderline(), + "value": RenderColors(251), + }, + } +} + +func (w *Writer) Error(err error) error { + fmt.Fprintf(w.Stderr, w.renderTags("%s\n"), err) + return err +} + +func (w *Writer) Errorf(format string, args ...interface{}) error { + return w.Error(fmt.Errorf(format, args...)) +} + +func (w *Writer) IsTerminal() bool { + if f, ok := w.Stdout.(*os.File); ok { + return IsTerminal(f) + } + + return false +} + +func (w *Writer) Sprintf(format string, args ...interface{}) string { + return fmt.Sprintf(w.renderTags(format), args...) +} + +func (w *Writer) Write(data []byte) (int, error) { + return w.Stdout.Write([]byte(w.renderTags(string(data)))) +} + +func (w *Writer) Writef(format string, args ...interface{}) (int, error) { + return fmt.Fprintf(w.Stdout, w.renderTags(format), args...) +} + +func (w *Writer) renderTags(s string) string { + for tag, render := range w.Tags { + s = regexp.MustCompile(fmt.Sprintf("<%s>(.*?)", tag, tag)).ReplaceAllStringFunc(s, render) + } + + if !w.Color { + s = stripColor(s) + } + + return s +} + +func RenderColors(colors ...int) Renderer { + return func(s string) string { + s = stripTag(s) + for _, c := range colors { + s = fmt.Sprintf("\033[38;5;%dm", c) + s + } + return s + "\033[0m" + } +} + +func RenderUnderline() Renderer { + return func(s string) string { + return fmt.Sprintf("\033[4m%s\033[24m", stripTag(s)) + } +} + +func renderError(s string) string { + return fmt.Sprintf("\033[38;5;124mERROR: \033[38;5;203m%s\033[0m", stripTag(s)) +} + +var ( + colorStripper = regexp.MustCompile("\033\\[[^m]+m") + tagStripper = regexp.MustCompile(`^<[^>?]+>(.*)?]+>$`) +) + +func stripColor(s string) string { + return colorStripper.ReplaceAllString(s, "") +} + +func stripTag(s string) string { + match := tagStripper.FindStringSubmatch(s) + + if len(match) != 2 { + return s + } + + return match[1] +} diff --git a/vendor/github.com/convox/u2f/LICENSE b/vendor/github.com/convox/u2f/LICENSE new file mode 100644 index 0000000..8bb161c --- /dev/null +++ b/vendor/github.com/convox/u2f/LICENSE @@ -0,0 +1,29 @@ +Flynn is a trademark of Prime Directive, Inc. + +Copyright (c) 2016 Prime Directive, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Prime Directive, Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/convox/u2f/u2fhid/hid.go b/vendor/github.com/convox/u2f/u2fhid/hid.go new file mode 100644 index 0000000..b1aea5e --- /dev/null +++ b/vendor/github.com/convox/u2f/u2fhid/hid.go @@ -0,0 +1,281 @@ +// Package u2fhid implements the low-level FIDO U2F HID protocol. +package u2fhid + +import ( + "bytes" + "crypto/rand" + "encoding/binary" + "fmt" + "io" + "sync" + "time" + + "github.com/convox/hid" +) + +const ( + cmdPing = 0x80 | 0x01 + cmdMsg = 0x80 | 0x03 + cmdLock = 0x80 | 0x04 + cmdInit = 0x80 | 0x06 + cmdWink = 0x80 | 0x08 + cmdSync = 0x80 | 0x3c + cmdError = 0x80 | 0x3f + + broadcastChannel = 0xffffffff + + capabilityWink = 1 + + minMessageLen = 7 + maxMessageLen = 7609 + minInitResponseLen = 17 + + responseTimeout = 3 * time.Second + + fidoUsagePage = 0xF1D0 + u2fUsage = 1 +) + +var errorCodes = map[uint8]string{ + 1: "invalid command", + 2: "invalid parameter", + 3: "invalid message length", + 4: "invalid message sequencing", + 5: "message timed out", + 6: "channel busy", + 7: "command requires channel lock", + 8: "sync command failed", +} + +// Devices lists available HID devices that advertise the U2F HID protocol. +func Devices() ([]*hid.DeviceInfo, error) { + devices, err := hid.Devices() + if err != nil { + return nil, err + } + + res := make([]*hid.DeviceInfo, 0, len(devices)) + for _, d := range devices { + if d.UsagePage == fidoUsagePage && d.Usage == u2fUsage { + res = append(res, d) + } + } + + return res, nil +} + +// Open initializes a communication channel with a U2F HID device. +func Open(info *hid.DeviceInfo) (*Device, error) { + hidDev, err := info.Open() + if err != nil { + return nil, err + } + + d := &Device{ + info: info, + device: hidDev, + readCh: hidDev.ReadCh(), + } + + if err := d.init(); err != nil { + return nil, err + } + + return d, nil +} + +// A Device is used to communicate with a U2F HID device. +type Device struct { + ProtocolVersion uint8 + MajorDeviceVersion uint8 + MinorDeviceVersion uint8 + BuildDeviceVersion uint8 + + // RawCapabilities is the raw capabilities byte provided by the device + // during initialization. + RawCapabilities uint8 + + // CapabilityWink is true if the device advertised support for the wink + // command during initilization. Even if this flag is true, the device may + // not actually do anything if the command is called. + CapabilityWink bool + + info *hid.DeviceInfo + device hid.Device + channel uint32 + + mtx sync.Mutex + readCh <-chan []byte + buf []byte +} + +func (d *Device) sendCommand(channel uint32, cmd byte, data []byte) error { + if len(data) > maxMessageLen { + return fmt.Errorf("u2fhid: message is too long") + } + + // zero buffer + for i := range d.buf { + d.buf[i] = 0 + } + + binary.BigEndian.PutUint32(d.buf[1:], channel) + d.buf[5] = cmd + binary.BigEndian.PutUint16(d.buf[6:], uint16(len(data))) + + n := copy(d.buf[8:], data) + data = data[n:] + + if err := d.device.Write(d.buf); err != nil { + return err + } + + var seq uint8 + for len(data) > 0 { + // zero buffer + for i := range d.buf { + d.buf[i] = 0 + } + + binary.BigEndian.PutUint32(d.buf[1:], channel) + d.buf[5] = seq + seq++ + n := copy(d.buf[6:], data) + data = data[n:] + if err := d.device.Write(d.buf); err != nil { + return err + } + } + return nil +} + +func (d *Device) readResponse(channel uint32, cmd byte) ([]byte, error) { + timeout := time.After(responseTimeout) + + haveFirst := false + var buf []byte + var expected int + + for { + select { + case msg, ok := <-d.readCh: + if len(msg) < minMessageLen { + return nil, fmt.Errorf("u2fhid: message is too short, only received %d bytes", len(msg)) + } + if !ok { + return nil, fmt.Errorf("u2fhid: error reading response, device closed") + } + if channel != binary.BigEndian.Uint32(msg) { + continue + } + + if msg[4] == cmdError { + errMsg, ok := errorCodes[msg[7]] + if !ok { + return nil, fmt.Errorf("u2fhid: received unknown error response %d", msg[7]) + } + return nil, fmt.Errorf("u2fhid: received error from device: %s", errMsg) + } + + if !haveFirst { + if msg[4] != cmd { + return nil, fmt.Errorf("u2fhid: error reading response, unexpected command %d, wanted %d", msg[4], cmd) + } + haveFirst = true + expected = int(binary.BigEndian.Uint16(msg[5:])) + buf = make([]byte, 0, expected) + msg = msg[7:] + if len(msg) > expected { + msg = msg[:expected] + } + buf = append(buf, msg...) + } else { + if msg[4]&0x80 != 0 { + return nil, fmt.Errorf("u2fhid: error reading response, unexpected command %d, wanted continuation", msg[4]) + } + msg = msg[5:] + if len(msg) > expected-len(buf) { + msg = msg[:expected-len(buf)] + } + buf = append(buf, msg...) + } + if len(buf) >= expected { + return buf, nil + } + case <-timeout: + return nil, fmt.Errorf("u2fhid: error reading response, read timed out") + } + } +} + +func (d *Device) init() error { + d.buf = make([]byte, d.info.OutputReportLength+1) + + nonce := make([]byte, 8) + if _, err := io.ReadFull(rand.Reader, nonce); err != nil { + return err + } + + if err := d.sendCommand(broadcastChannel, cmdInit, nonce); err != nil { + return err + } + + for { + res, err := d.readResponse(broadcastChannel, cmdInit) + if err != nil { + return err + } + if len(res) < minInitResponseLen { + return fmt.Errorf("u2fhid: init response is short, wanted %d, got %d bytes", minInitResponseLen, len(res)) + } + if !bytes.Equal(nonce, res[:8]) { + // nonce doesn't match, this init reply isn't for us + continue + } + d.channel = binary.BigEndian.Uint32(res[8:]) + + d.ProtocolVersion = res[12] + d.MajorDeviceVersion = res[13] + d.MinorDeviceVersion = res[14] + d.BuildDeviceVersion = res[15] + d.RawCapabilities = res[16] + d.CapabilityWink = d.RawCapabilities&capabilityWink != 0 + break + } + + return nil +} + +// Command sends a command and associated data to the device and returns the +// response. +func (d *Device) Command(cmd byte, data []byte) ([]byte, error) { + d.mtx.Lock() + defer d.mtx.Unlock() + if err := d.sendCommand(d.channel, cmd, data); err != nil { + return nil, err + } + return d.readResponse(d.channel, cmd) +} + +// Ping sends data to the device that should be echoed back verbatim. +func (d *Device) Ping(data []byte) ([]byte, error) { + return d.Command(cmdPing, data) +} + +// Wink performs a vendor-defined action to identify the device, like blinking +// an LED. It is not implemented correctly or at all on all devices. +func (d *Device) Wink() error { + _, err := d.Command(cmdWink, nil) + return err +} + +// Message sends an encapsulated U2F protocol message to the device and returns +// the response. +func (d *Device) Message(data []byte) ([]byte, error) { + return d.Command(cmdMsg, data) +} + +// Close closes the device and frees associated resources. +func (d *Device) Close() { + d.device.Close() +} diff --git a/vendor/github.com/convox/u2f/u2ftoken/token.go b/vendor/github.com/convox/u2f/u2ftoken/token.go new file mode 100644 index 0000000..05f8a47 --- /dev/null +++ b/vendor/github.com/convox/u2f/u2ftoken/token.go @@ -0,0 +1,266 @@ +// Package u2ftoken implements the FIDO U2F raw message protocol used to +// communicate with U2F tokens. +package u2ftoken + +import ( + "encoding/binary" + "errors" + "fmt" +) + +const ( + cmdRegister = 1 + cmdAuthenticate = 2 + cmdVersion = 3 + + tupRequired = 1 // Test of User Presence required + tupConsume = 2 // Consume a Test of User Presence + tupTestOnly = 4 // Check valid key handle only, no test of user presence required + + authEnforce = tupRequired | tupConsume + // This makes zero sense, but the check command is all three flags, not just tupTestOnly + authCheckOnly = tupRequired | tupConsume | tupTestOnly + + statusNoError = 0x9000 + statusWrongLength = 0x6700 + statusInvalidData = 0x6984 + statusConditionsNotSatisfied = 0x6985 + statusWrongData = 0x6a80 + statusInsNotSupported = 0x6d00 +) + +// ErrPresenceRequired is returned by Register and Authenticate if proof of user +// presence must be provide before the operation can be retried successfully. +var ErrPresenceRequired = errors.New("u2ftoken: user presence required") + +// ErrUnknownKeyHandle is returned by Authenticate and CheckAuthenticate if the +// key handle is unknown to the token. +var ErrUnknownKeyHandle = errors.New("u2ftoken: unknown key handle") + +// Device implements a message transport to a concrete U2F device. It is +// implemented in package u2fhid. +type Device interface { + // Message sends a message to the device and returns the response. + Message(data []byte) ([]byte, error) +} + +// NewToken returns a token that will use Device to communicate with the device. +func NewToken(d Device) *Token { + return &Token{d: d} +} + +// A Token implements the FIDO U2F hardware token messages as defined in the Raw +// Message Formats specification. +type Token struct { + d Device +} + +// A RegisterRequest is a message used for token registration. +type RegisterRequest struct { + // Challenge is the 32-byte SHA-256 hash of the Client Data JSON prepared by + // the client. + Challenge []byte + + // Application is the 32-byte SHA-256 hash of the application identity of + // the relying party requesting registration. + Application []byte +} + +// Register registers an application with the token and returns the raw +// registration response message to be passed to the relying party. It returns +// ErrPresenceRequired if the call should be retried after proof of user +// presence is provided to the token. +func (t *Token) Register(req RegisterRequest) ([]byte, error) { + if len(req.Challenge) != 32 { + return nil, fmt.Errorf("u2ftoken: Challenge must be exactly 32 bytes") + } + if len(req.Application) != 32 { + return nil, fmt.Errorf("u2ftoken: Application must be exactly 32 bytes") + } + + res, err := t.Message(Request{ + Param1: authEnforce, + Command: cmdRegister, + Data: append(req.Challenge, req.Application...), + }) + if err != nil { + return nil, err + } + + if res.Status != statusNoError { + switch res.Status { + case statusConditionsNotSatisfied: + return nil, ErrPresenceRequired + default: + return nil, fmt.Errorf("u2ftoken: unexpected error %d during registration", res.Status) + } + } + + return res.Data, nil +} + +// An AuthenticateRequires is a message used for authenticating to a relying party +type AuthenticateRequest struct { + // Challenge is the 32-byte SHA-256 hash of the Client Data JSON prepared by + // the client. + Challenge []byte + + // Application is the 32-byte SHA-256 hash of the application identity of + // the relying party requesting authentication. + Application []byte + + // KeyHandle is the opaque key handle that was provided to the relying party + // during registration. + KeyHandle []byte +} + +// An AuthenticateResponse is a message returned in response to a successful +// authentication request. +type AuthenticateResponse struct { + // Counter is the value of the counter that is incremented by the token + // every time it performs an authentication operation. + Counter uint32 + + // Signature is the P-256 ECDSA signature over the authentication data. + Signature []byte + + // RawResponse is the raw response bytes from the U2F token. + RawResponse []byte +} + +func encodeAuthenticateRequest(req AuthenticateRequest) ([]byte, error) { + if len(req.Challenge) != 32 { + return nil, fmt.Errorf("u2ftoken: Challenge must be exactly 32 bytes") + } + if len(req.Application) != 32 { + return nil, fmt.Errorf("u2ftoken: Application must be exactly 32 bytes") + } + if len(req.KeyHandle) > 256 { + return nil, fmt.Errorf("u2ftoken: KeyHandle is too long") + } + + buf := make([]byte, 0, len(req.Challenge)+len(req.Application)+1+len(req.KeyHandle)) + buf = append(buf, req.Challenge...) + buf = append(buf, req.Application...) + buf = append(buf, byte(len(req.KeyHandle))) + buf = append(buf, req.KeyHandle...) + + return buf, nil +} + +// Authenticate peforms an authentication operation and returns the response to +// provide to the relying party. It returns ErrPresenceRequired if the call +// should be retried after proof of user presence is provided to the token and +// ErrUnknownKeyHandle if the key handle is unknown to the token. +func (t *Token) Authenticate(req AuthenticateRequest) (*AuthenticateResponse, error) { + buf, err := encodeAuthenticateRequest(req) + if err != nil { + return nil, err + } + + res, err := t.Message(Request{ + Command: cmdAuthenticate, + Param1: authEnforce, + Data: buf, + }) + if err != nil { + return nil, err + } + + if res.Status != statusNoError { + if res.Status == statusConditionsNotSatisfied { + return nil, ErrPresenceRequired + } + return nil, fmt.Errorf("u2ftoken: unexpected error %d during authentication", res.Status) + } + + if len(res.Data) < 6 { + return nil, fmt.Errorf("u2ftoken: authenticate response is too short, got %d bytes", len(res.Data)) + } + + return &AuthenticateResponse{ + Counter: binary.BigEndian.Uint32(res.Data[1:]), + Signature: res.Data[5:], + RawResponse: res.Data, + }, nil +} + +// CheckAuthenticate checks if a key handle is known to the token without +// requiring a test for user presence. It returns ErrUnknownKeyHandle if the key +// handle is unknown to the token. +func (t *Token) CheckAuthenticate(req AuthenticateRequest) error { + buf, err := encodeAuthenticateRequest(req) + if err != nil { + return err + } + + res, err := t.Message(Request{ + Command: cmdAuthenticate, + Param1: authCheckOnly, + Data: buf, + }) + if err != nil { + return err + } + + if res.Status != statusConditionsNotSatisfied { + if res.Status == statusWrongData { + return ErrUnknownKeyHandle + } + return fmt.Errorf("u2ftoken: unexpected error %d during auth check", res.Status) + } + + return nil +} + +// Version returns the U2F protocol version implemented by the token. +func (t *Token) Version() (string, error) { + res, err := t.Message(Request{Command: cmdVersion}) + if err != nil { + return "", err + } + + if res.Status != statusNoError { + return "", fmt.Errorf("u2ftoken: unexpected error %d during version request", res.Status) + } + + return string(res.Data), nil +} + +// A Request is a low-level request to the token. +type Request struct { + Command uint8 + Param1 uint8 + Param2 uint8 + Data []byte +} + +// A Response is a low-level response from the token. +type Response struct { + Data []byte + Status uint16 +} + +// Message sends a low-level request to the token and returns the response. +func (t *Token) Message(req Request) (*Response, error) { + buf := make([]byte, 7, 7+len(req.Data)) + buf[1] = req.Command + buf[2] = req.Param1 + buf[3] = req.Param2 + buf[4] = uint8(len(req.Data) >> 16) + buf[5] = uint8(len(req.Data) >> 8) + buf[6] = uint8(len(req.Data)) + buf = append(buf, req.Data...) + + data, err := t.d.Message(buf) + if err != nil { + return nil, err + } + if len(data) < 2 { + return nil, fmt.Errorf("u2ftoken: response is too short, got %d bytes", len(data)) + } + return &Response{ + Data: data[:len(data)-2], + Status: binary.BigEndian.Uint16(data[len(data)-2:]), + }, nil +} diff --git a/vendor/github.com/convox/version/Readme.md b/vendor/github.com/convox/version/Readme.md new file mode 100644 index 0000000..acce5d9 --- /dev/null +++ b/vendor/github.com/convox/version/Readme.md @@ -0,0 +1,7 @@ +# convox/version + +Release management via a version database of JSON in S3. + +`convox/release` uses the library to append new versions to the database. + +`convox/rack` and `convox/rack/cmd/convox` uses the library and data to determine what new versions are available. diff --git a/vendor/github.com/convox/version/version.go b/vendor/github.com/convox/version/version.go new file mode 100644 index 0000000..2f1767e --- /dev/null +++ b/vendor/github.com/convox/version/version.go @@ -0,0 +1,253 @@ +package version + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "os" + "strings" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/s3" +) + +type Version struct { + Version string `json:"version"` + Description string `json:"description"` + Published bool `json:"published"` + Required bool `json:"required"` +} + +type Versions []Version + +var URL = "https://convox.s3.amazonaws.com/release/versions.json" + +func (vs Versions) Resolve(version string) (v Version, err error) { + switch { + case version == "latest" || version == "stable": + v, err = vs.Latest() + case version == "edge": + v = vs[len(vs)-1] + default: + v, err = vs.Find(version) + } + return +} + +// Get all versions as Versions type +func All() (Versions, error) { + res, err := http.Get(URL) + + if err != nil { + return nil, err + } + + defer res.Body.Close() + + b, err := ioutil.ReadAll(res.Body) + + if err != nil { + return nil, err + } + + vs := Versions{} + err = json.Unmarshal(b, &vs) + if err != nil { + return nil, err + } + + return vs, nil +} + +// Get latest published version as a string +func Latest() (string, error) { + vs, err := All() + + if err != nil { + return "", err + } + + v, err := vs.Latest() + + return v.Version, err +} + +// Get next required or latest published version as a string, based on current version string +func Next(curr string) (string, error) { + vs, err := All() + + if err != nil { + return "", err + } + + v, err := vs.Next(curr) + + return v, err +} + +// Append a new version to versions.json file +func AppendVersion(v Version) (Version, error) { + vs, err := All() + + if err != nil { + return v, err + } + + vs = append(vs, v) + + err = putVersions(vs) + + return v, err +} + +func (vs Versions) Len() int { + return len(vs) +} + +func (vs Versions) Less(i, j int) bool { + return vs[i].Version < vs[j].Version +} + +func (vs Versions) Swap(i, j int) { + vs[i], vs[j] = vs[j], vs[i] +} + +func (v Version) Display() string { + return fmt.Sprintf("%s (published: %v, required: %v)", v.Version, v.Published, v.Required) +} + +func UpdateVersion(v Version) (Version, error) { + vs, err := All() + + if err != nil { + return v, err + } + + for i, _ := range vs { + if vs[i].Version == v.Version { + vs[i].Published = v.Published + vs[i].Required = v.Required + + err := putVersions(vs) + + return vs[i], err + } + } + + return v, fmt.Errorf("version %q not found", v.Version) +} + +func (vs Versions) Find(version string) (Version, error) { + for _, v := range vs { + if v.Version == version { + return v, nil + } + } + + return Version{}, fmt.Errorf("version %q not found", version) +} + +func (vs Versions) Latest() (Version, error) { + for i := len(vs) - 1; i >= 0; i-- { + v := vs[i] + + if v.Published { + return v, nil + } + } + + return Version{}, fmt.Errorf("no published versions") +} + +func (vs Versions) Next(curr string) (string, error) { + found := false + published := "" + + for _, v := range vs { + if v.Version == curr { + found = true + continue + } + + if found && v.Published { + published = v.Version + + if v.Required { + return v.Version, nil + } + } + } + + if !found { + return "", fmt.Errorf("current version %q not found", curr) + } + + if published != "" { + return published, nil + } + + return "", fmt.Errorf("current version %q is latest", curr) +} + +// Walk a bucket to create initial versions.json file +func importVersions() (Versions, error) { + S3 := s3.New(session.New(), &aws.Config{ + Region: aws.String(os.Getenv("AWS_DEFAULT_REGION")), + }) + + res, err := S3.ListObjects(&s3.ListObjectsInput{ + Bucket: aws.String("convox"), + Delimiter: aws.String("/"), + Prefix: aws.String("release/"), + }) + + if err != nil { + return nil, err + } + + vs := Versions{} + + for _, p := range res.CommonPrefixes { + parts := strings.Split(*p.Prefix, "/") + version := parts[1] + + if version == "latest" { + continue + } + + vs = append(vs, Version{ + Version: version, + Published: false, + Required: false, + }) + } + + err = putVersions(vs) + + return vs, err +} + +func putVersions(vs Versions) error { + data, err := json.MarshalIndent(vs, "", " ") + + if err != nil { + return err + } + + S3 := s3.New(session.New(), &aws.Config{ + Region: aws.String(os.Getenv("AWS_DEFAULT_REGION")), + }) + + _, err = S3.PutObject(&s3.PutObjectInput{ + ACL: aws.String("public-read"), + Body: bytes.NewReader(data), + Bucket: aws.String("convox"), + ContentLength: aws.Int64(int64(len(data))), + Key: aws.String("release/versions.json"), + }) + + return err +} diff --git a/vendor/github.com/creack/pty/.gitignore b/vendor/github.com/creack/pty/.gitignore new file mode 100644 index 0000000..1f0a99f --- /dev/null +++ b/vendor/github.com/creack/pty/.gitignore @@ -0,0 +1,4 @@ +[568].out +_go* +_test* +_obj diff --git a/vendor/github.com/creack/pty/Dockerfile.riscv b/vendor/github.com/creack/pty/Dockerfile.riscv new file mode 100644 index 0000000..adfdf82 --- /dev/null +++ b/vendor/github.com/creack/pty/Dockerfile.riscv @@ -0,0 +1,14 @@ +FROM golang:1.13 + +# Clone and complie a riscv compatible version of the go compiler. +RUN git clone https://review.gerrithub.io/riscv/riscv-go /riscv-go +# riscvdev branch HEAD as of 2019-06-29. +RUN cd /riscv-go && git checkout 04885fddd096d09d4450726064d06dd107e374bf +ENV PATH=/riscv-go/misc/riscv:/riscv-go/bin:$PATH +RUN cd /riscv-go/src && GOROOT_BOOTSTRAP=$(go env GOROOT) ./make.bash +ENV GOROOT=/riscv-go + +# Make sure we compile. +WORKDIR pty +ADD . . +RUN GOOS=linux GOARCH=riscv go build diff --git a/vendor/github.com/creack/pty/LICENSE b/vendor/github.com/creack/pty/LICENSE new file mode 100644 index 0000000..6b7558b --- /dev/null +++ b/vendor/github.com/creack/pty/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2011 Keith Rarick + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/creack/pty/README.md b/vendor/github.com/creack/pty/README.md new file mode 100644 index 0000000..5275014 --- /dev/null +++ b/vendor/github.com/creack/pty/README.md @@ -0,0 +1,100 @@ +# pty + +Pty is a Go package for using unix pseudo-terminals. + +## Install + + go get github.com/creack/pty + +## Example + +### Command + +```go +package main + +import ( + "github.com/creack/pty" + "io" + "os" + "os/exec" +) + +func main() { + c := exec.Command("grep", "--color=auto", "bar") + f, err := pty.Start(c) + if err != nil { + panic(err) + } + + go func() { + f.Write([]byte("foo\n")) + f.Write([]byte("bar\n")) + f.Write([]byte("baz\n")) + f.Write([]byte{4}) // EOT + }() + io.Copy(os.Stdout, f) +} +``` + +### Shell + +```go +package main + +import ( + "io" + "log" + "os" + "os/exec" + "os/signal" + "syscall" + + "github.com/creack/pty" + "golang.org/x/crypto/ssh/terminal" +) + +func test() error { + // Create arbitrary command. + c := exec.Command("bash") + + // Start the command with a pty. + ptmx, err := pty.Start(c) + if err != nil { + return err + } + // Make sure to close the pty at the end. + defer func() { _ = ptmx.Close() }() // Best effort. + + // Handle pty size. + ch := make(chan os.Signal, 1) + signal.Notify(ch, syscall.SIGWINCH) + go func() { + for range ch { + if err := pty.InheritSize(os.Stdin, ptmx); err != nil { + log.Printf("error resizing pty: %s", err) + } + } + }() + ch <- syscall.SIGWINCH // Initial resize. + + // Set stdin in raw mode. + oldState, err := terminal.MakeRaw(int(os.Stdin.Fd())) + if err != nil { + panic(err) + } + defer func() { _ = terminal.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort. + + // Copy stdin to the pty and the pty to stdout. + go func() { _, _ = io.Copy(ptmx, os.Stdin) }() + _, _ = io.Copy(os.Stdout, ptmx) + + return nil +} + +func main() { + if err := test(); err != nil { + log.Fatal(err) + } +} +``` diff --git a/vendor/github.com/creack/pty/doc.go b/vendor/github.com/creack/pty/doc.go new file mode 100644 index 0000000..190cfbe --- /dev/null +++ b/vendor/github.com/creack/pty/doc.go @@ -0,0 +1,16 @@ +// Package pty provides functions for working with Unix terminals. +package pty + +import ( + "errors" + "os" +) + +// ErrUnsupported is returned if a function is not +// available on the current platform. +var ErrUnsupported = errors.New("unsupported") + +// Opens a pty and its corresponding tty. +func Open() (pty, tty *os.File, err error) { + return open() +} diff --git a/vendor/github.com/creack/pty/go.mod b/vendor/github.com/creack/pty/go.mod new file mode 100644 index 0000000..e48deca --- /dev/null +++ b/vendor/github.com/creack/pty/go.mod @@ -0,0 +1,4 @@ +module github.com/creack/pty + +go 1.13 + diff --git a/vendor/github.com/creack/pty/ioctl.go b/vendor/github.com/creack/pty/ioctl.go new file mode 100644 index 0000000..c85cdcd --- /dev/null +++ b/vendor/github.com/creack/pty/ioctl.go @@ -0,0 +1,13 @@ +// +build !windows,!solaris + +package pty + +import "syscall" + +func ioctl(fd, cmd, ptr uintptr) error { + _, _, e := syscall.Syscall(syscall.SYS_IOCTL, fd, cmd, ptr) + if e != 0 { + return e + } + return nil +} diff --git a/vendor/github.com/creack/pty/ioctl_bsd.go b/vendor/github.com/creack/pty/ioctl_bsd.go new file mode 100644 index 0000000..73b12c5 --- /dev/null +++ b/vendor/github.com/creack/pty/ioctl_bsd.go @@ -0,0 +1,39 @@ +// +build darwin dragonfly freebsd netbsd openbsd + +package pty + +// from +const ( + _IOC_VOID uintptr = 0x20000000 + _IOC_OUT uintptr = 0x40000000 + _IOC_IN uintptr = 0x80000000 + _IOC_IN_OUT uintptr = _IOC_OUT | _IOC_IN + _IOC_DIRMASK = _IOC_VOID | _IOC_OUT | _IOC_IN + + _IOC_PARAM_SHIFT = 13 + _IOC_PARAM_MASK = (1 << _IOC_PARAM_SHIFT) - 1 +) + +func _IOC_PARM_LEN(ioctl uintptr) uintptr { + return (ioctl >> 16) & _IOC_PARAM_MASK +} + +func _IOC(inout uintptr, group byte, ioctl_num uintptr, param_len uintptr) uintptr { + return inout | (param_len&_IOC_PARAM_MASK)<<16 | uintptr(group)<<8 | ioctl_num +} + +func _IO(group byte, ioctl_num uintptr) uintptr { + return _IOC(_IOC_VOID, group, ioctl_num, 0) +} + +func _IOR(group byte, ioctl_num uintptr, param_len uintptr) uintptr { + return _IOC(_IOC_OUT, group, ioctl_num, param_len) +} + +func _IOW(group byte, ioctl_num uintptr, param_len uintptr) uintptr { + return _IOC(_IOC_IN, group, ioctl_num, param_len) +} + +func _IOWR(group byte, ioctl_num uintptr, param_len uintptr) uintptr { + return _IOC(_IOC_IN_OUT, group, ioctl_num, param_len) +} diff --git a/vendor/github.com/creack/pty/ioctl_solaris.go b/vendor/github.com/creack/pty/ioctl_solaris.go new file mode 100644 index 0000000..f63985f --- /dev/null +++ b/vendor/github.com/creack/pty/ioctl_solaris.go @@ -0,0 +1,30 @@ +package pty + +import ( + "golang.org/x/sys/unix" + "unsafe" +) + +const ( + // see /usr/include/sys/stropts.h + I_PUSH = uintptr((int32('S')<<8 | 002)) + I_STR = uintptr((int32('S')<<8 | 010)) + I_FIND = uintptr((int32('S')<<8 | 013)) + // see /usr/include/sys/ptms.h + ISPTM = (int32('P') << 8) | 1 + UNLKPT = (int32('P') << 8) | 2 + PTSSTTY = (int32('P') << 8) | 3 + ZONEPT = (int32('P') << 8) | 4 + OWNERPT = (int32('P') << 8) | 5 +) + +type strioctl struct { + ic_cmd int32 + ic_timout int32 + ic_len int32 + ic_dp unsafe.Pointer +} + +func ioctl(fd, cmd, ptr uintptr) error { + return unix.IoctlSetInt(int(fd), uint(cmd), int(ptr)) +} diff --git a/vendor/github.com/creack/pty/mktypes.bash b/vendor/github.com/creack/pty/mktypes.bash new file mode 100644 index 0000000..82ee167 --- /dev/null +++ b/vendor/github.com/creack/pty/mktypes.bash @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +GOOSARCH="${GOOS}_${GOARCH}" +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +GODEFS="go tool cgo -godefs" + +$GODEFS types.go |gofmt > ztypes_$GOARCH.go + +case $GOOS in +freebsd|dragonfly|openbsd) + $GODEFS types_$GOOS.go |gofmt > ztypes_$GOOSARCH.go + ;; +esac diff --git a/vendor/github.com/creack/pty/pty_darwin.go b/vendor/github.com/creack/pty/pty_darwin.go new file mode 100644 index 0000000..6344b6b --- /dev/null +++ b/vendor/github.com/creack/pty/pty_darwin.go @@ -0,0 +1,65 @@ +package pty + +import ( + "errors" + "os" + "syscall" + "unsafe" +) + +func open() (pty, tty *os.File, err error) { + pFD, err := syscall.Open("/dev/ptmx", syscall.O_RDWR|syscall.O_CLOEXEC, 0) + if err != nil { + return nil, nil, err + } + p := os.NewFile(uintptr(pFD), "/dev/ptmx") + // In case of error after this point, make sure we close the ptmx fd. + defer func() { + if err != nil { + _ = p.Close() // Best effort. + } + }() + + sname, err := ptsname(p) + if err != nil { + return nil, nil, err + } + + if err := grantpt(p); err != nil { + return nil, nil, err + } + + if err := unlockpt(p); err != nil { + return nil, nil, err + } + + t, err := os.OpenFile(sname, os.O_RDWR, 0) + if err != nil { + return nil, nil, err + } + return p, t, nil +} + +func ptsname(f *os.File) (string, error) { + n := make([]byte, _IOC_PARM_LEN(syscall.TIOCPTYGNAME)) + + err := ioctl(f.Fd(), syscall.TIOCPTYGNAME, uintptr(unsafe.Pointer(&n[0]))) + if err != nil { + return "", err + } + + for i, c := range n { + if c == 0 { + return string(n[:i]), nil + } + } + return "", errors.New("TIOCPTYGNAME string not NUL-terminated") +} + +func grantpt(f *os.File) error { + return ioctl(f.Fd(), syscall.TIOCPTYGRANT, 0) +} + +func unlockpt(f *os.File) error { + return ioctl(f.Fd(), syscall.TIOCPTYUNLK, 0) +} diff --git a/vendor/github.com/creack/pty/pty_dragonfly.go b/vendor/github.com/creack/pty/pty_dragonfly.go new file mode 100644 index 0000000..b7d1f20 --- /dev/null +++ b/vendor/github.com/creack/pty/pty_dragonfly.go @@ -0,0 +1,80 @@ +package pty + +import ( + "errors" + "os" + "strings" + "syscall" + "unsafe" +) + +// same code as pty_darwin.go +func open() (pty, tty *os.File, err error) { + p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0) + if err != nil { + return nil, nil, err + } + // In case of error after this point, make sure we close the ptmx fd. + defer func() { + if err != nil { + _ = p.Close() // Best effort. + } + }() + + sname, err := ptsname(p) + if err != nil { + return nil, nil, err + } + + if err := grantpt(p); err != nil { + return nil, nil, err + } + + if err := unlockpt(p); err != nil { + return nil, nil, err + } + + t, err := os.OpenFile(sname, os.O_RDWR, 0) + if err != nil { + return nil, nil, err + } + return p, t, nil +} + +func grantpt(f *os.File) error { + _, err := isptmaster(f.Fd()) + return err +} + +func unlockpt(f *os.File) error { + _, err := isptmaster(f.Fd()) + return err +} + +func isptmaster(fd uintptr) (bool, error) { + err := ioctl(fd, syscall.TIOCISPTMASTER, 0) + return err == nil, err +} + +var ( + emptyFiodgnameArg fiodgnameArg + ioctl_FIODNAME = _IOW('f', 120, unsafe.Sizeof(emptyFiodgnameArg)) +) + +func ptsname(f *os.File) (string, error) { + name := make([]byte, _C_SPECNAMELEN) + fa := fiodgnameArg{Name: (*byte)(unsafe.Pointer(&name[0])), Len: _C_SPECNAMELEN, Pad_cgo_0: [4]byte{0, 0, 0, 0}} + + err := ioctl(f.Fd(), ioctl_FIODNAME, uintptr(unsafe.Pointer(&fa))) + if err != nil { + return "", err + } + + for i, c := range name { + if c == 0 { + s := "/dev/" + string(name[:i]) + return strings.Replace(s, "ptm", "pts", -1), nil + } + } + return "", errors.New("TIOCPTYGNAME string not NUL-terminated") +} diff --git a/vendor/github.com/creack/pty/pty_freebsd.go b/vendor/github.com/creack/pty/pty_freebsd.go new file mode 100644 index 0000000..63b6d91 --- /dev/null +++ b/vendor/github.com/creack/pty/pty_freebsd.go @@ -0,0 +1,78 @@ +package pty + +import ( + "errors" + "os" + "syscall" + "unsafe" +) + +func posixOpenpt(oflag int) (fd int, err error) { + r0, _, e1 := syscall.Syscall(syscall.SYS_POSIX_OPENPT, uintptr(oflag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return fd, err +} + +func open() (pty, tty *os.File, err error) { + fd, err := posixOpenpt(syscall.O_RDWR | syscall.O_CLOEXEC) + if err != nil { + return nil, nil, err + } + p := os.NewFile(uintptr(fd), "/dev/pts") + // In case of error after this point, make sure we close the pts fd. + defer func() { + if err != nil { + _ = p.Close() // Best effort. + } + }() + + sname, err := ptsname(p) + if err != nil { + return nil, nil, err + } + + t, err := os.OpenFile("/dev/"+sname, os.O_RDWR, 0) + if err != nil { + return nil, nil, err + } + return p, t, nil +} + +func isptmaster(fd uintptr) (bool, error) { + err := ioctl(fd, syscall.TIOCPTMASTER, 0) + return err == nil, err +} + +var ( + emptyFiodgnameArg fiodgnameArg + ioctlFIODGNAME = _IOW('f', 120, unsafe.Sizeof(emptyFiodgnameArg)) +) + +func ptsname(f *os.File) (string, error) { + master, err := isptmaster(f.Fd()) + if err != nil { + return "", err + } + if !master { + return "", syscall.EINVAL + } + + const n = _C_SPECNAMELEN + 1 + var ( + buf = make([]byte, n) + arg = fiodgnameArg{Len: n, Buf: (*byte)(unsafe.Pointer(&buf[0]))} + ) + if err := ioctl(f.Fd(), ioctlFIODGNAME, uintptr(unsafe.Pointer(&arg))); err != nil { + return "", err + } + + for i, c := range buf { + if c == 0 { + return string(buf[:i]), nil + } + } + return "", errors.New("FIODGNAME string not NUL-terminated") +} diff --git a/vendor/github.com/creack/pty/pty_linux.go b/vendor/github.com/creack/pty/pty_linux.go new file mode 100644 index 0000000..4a833de --- /dev/null +++ b/vendor/github.com/creack/pty/pty_linux.go @@ -0,0 +1,51 @@ +package pty + +import ( + "os" + "strconv" + "syscall" + "unsafe" +) + +func open() (pty, tty *os.File, err error) { + p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0) + if err != nil { + return nil, nil, err + } + // In case of error after this point, make sure we close the ptmx fd. + defer func() { + if err != nil { + _ = p.Close() // Best effort. + } + }() + + sname, err := ptsname(p) + if err != nil { + return nil, nil, err + } + + if err := unlockpt(p); err != nil { + return nil, nil, err + } + + t, err := os.OpenFile(sname, os.O_RDWR|syscall.O_NOCTTY, 0) + if err != nil { + return nil, nil, err + } + return p, t, nil +} + +func ptsname(f *os.File) (string, error) { + var n _C_uint + err := ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n))) + if err != nil { + return "", err + } + return "/dev/pts/" + strconv.Itoa(int(n)), nil +} + +func unlockpt(f *os.File) error { + var u _C_int + // use TIOCSPTLCK with a pointer to zero to clear the lock + return ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u))) +} diff --git a/vendor/github.com/creack/pty/pty_openbsd.go b/vendor/github.com/creack/pty/pty_openbsd.go new file mode 100644 index 0000000..a6a35d1 --- /dev/null +++ b/vendor/github.com/creack/pty/pty_openbsd.go @@ -0,0 +1,33 @@ +package pty + +import ( + "os" + "syscall" + "unsafe" +) + +func open() (pty, tty *os.File, err error) { + /* + * from ptm(4): + * The PTMGET command allocates a free pseudo terminal, changes its + * ownership to the caller, revokes the access privileges for all previous + * users, opens the file descriptors for the pty and tty devices and + * returns them to the caller in struct ptmget. + */ + + p, err := os.OpenFile("/dev/ptm", os.O_RDWR|syscall.O_CLOEXEC, 0) + if err != nil { + return nil, nil, err + } + defer p.Close() + + var ptm ptmget + if err := ioctl(p.Fd(), uintptr(ioctl_PTMGET), uintptr(unsafe.Pointer(&ptm))); err != nil { + return nil, nil, err + } + + pty = os.NewFile(uintptr(ptm.Cfd), "/dev/ptm") + tty = os.NewFile(uintptr(ptm.Sfd), "/dev/ptm") + + return pty, tty, nil +} diff --git a/vendor/github.com/creack/pty/pty_solaris.go b/vendor/github.com/creack/pty/pty_solaris.go new file mode 100644 index 0000000..09ec1b7 --- /dev/null +++ b/vendor/github.com/creack/pty/pty_solaris.go @@ -0,0 +1,139 @@ +package pty + +/* based on: +http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libc/port/gen/pt.c +*/ + +import ( + "errors" + "golang.org/x/sys/unix" + "os" + "strconv" + "syscall" + "unsafe" +) + +const NODEV = ^uint64(0) + +func open() (pty, tty *os.File, err error) { + masterfd, err := syscall.Open("/dev/ptmx", syscall.O_RDWR|unix.O_NOCTTY, 0) + //masterfd, err := syscall.Open("/dev/ptmx", syscall.O_RDWR|syscall.O_CLOEXEC|unix.O_NOCTTY, 0) + if err != nil { + return nil, nil, err + } + p := os.NewFile(uintptr(masterfd), "/dev/ptmx") + + sname, err := ptsname(p) + if err != nil { + return nil, nil, err + } + + err = grantpt(p) + if err != nil { + return nil, nil, err + } + + err = unlockpt(p) + if err != nil { + return nil, nil, err + } + + slavefd, err := syscall.Open(sname, os.O_RDWR|unix.O_NOCTTY, 0) + if err != nil { + return nil, nil, err + } + t := os.NewFile(uintptr(slavefd), sname) + + // pushing terminal driver STREAMS modules as per pts(7) + for _, mod := range([]string{"ptem", "ldterm", "ttcompat"}) { + err = streams_push(t, mod) + if err != nil { + return nil, nil, err + } + } + + return p, t, nil +} + +func minor(x uint64) uint64 { + return x & 0377 +} + +func ptsdev(fd uintptr) uint64 { + istr := strioctl{ISPTM, 0, 0, nil} + err := ioctl(fd, I_STR, uintptr(unsafe.Pointer(&istr))) + if err != nil { + return NODEV + } + var status unix.Stat_t + err = unix.Fstat(int(fd), &status) + if err != nil { + return NODEV + } + return uint64(minor(status.Rdev)) +} + +func ptsname(f *os.File) (string, error) { + dev := ptsdev(f.Fd()) + if dev == NODEV { + return "", errors.New("not a master pty") + } + fn := "/dev/pts/" + strconv.FormatInt(int64(dev), 10) + // access(2) creates the slave device (if the pty exists) + // F_OK == 0 (unistd.h) + err := unix.Access(fn, 0) + if err != nil { + return "", err + } + return fn, nil +} + +type pt_own struct { + pto_ruid int32 + pto_rgid int32 +} + +func grantpt(f *os.File) error { + if ptsdev(f.Fd()) == NODEV { + return errors.New("not a master pty") + } + var pto pt_own + pto.pto_ruid = int32(os.Getuid()) + // XXX should first attempt to get gid of DEFAULT_TTY_GROUP="tty" + pto.pto_rgid = int32(os.Getgid()) + var istr strioctl + istr.ic_cmd = OWNERPT + istr.ic_timout = 0 + istr.ic_len = int32(unsafe.Sizeof(istr)) + istr.ic_dp = unsafe.Pointer(&pto) + err := ioctl(f.Fd(), I_STR, uintptr(unsafe.Pointer(&istr))) + if err != nil { + return errors.New("access denied") + } + return nil +} + +func unlockpt(f *os.File) error { + istr := strioctl{UNLKPT, 0, 0, nil} + return ioctl(f.Fd(), I_STR, uintptr(unsafe.Pointer(&istr))) +} + +// push STREAMS modules if not already done so +func streams_push(f *os.File, mod string) error { + var err error + buf := []byte(mod) + // XXX I_FIND is not returning an error when the module + // is already pushed even though truss reports a return + // value of 1. A bug in the Go Solaris syscall interface? + // XXX without this we are at risk of the issue + // https://www.illumos.org/issues/9042 + // but since we are not using libc or XPG4.2, we should not be + // double-pushing modules + + err = ioctl(f.Fd(), I_FIND, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return nil + } + err = ioctl(f.Fd(), I_PUSH, uintptr(unsafe.Pointer(&buf[0]))) + return err +} diff --git a/vendor/github.com/creack/pty/pty_unsupported.go b/vendor/github.com/creack/pty/pty_unsupported.go new file mode 100644 index 0000000..ceb425b --- /dev/null +++ b/vendor/github.com/creack/pty/pty_unsupported.go @@ -0,0 +1,11 @@ +// +build !linux,!darwin,!freebsd,!dragonfly,!openbsd,!solaris + +package pty + +import ( + "os" +) + +func open() (pty, tty *os.File, err error) { + return nil, nil, ErrUnsupported +} diff --git a/vendor/github.com/creack/pty/run.go b/vendor/github.com/creack/pty/run.go new file mode 100644 index 0000000..959be26 --- /dev/null +++ b/vendor/github.com/creack/pty/run.go @@ -0,0 +1,57 @@ +// +build !windows + +package pty + +import ( + "os" + "os/exec" + "syscall" +) + +// Start assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout, +// and c.Stderr, calls c.Start, and returns the File of the tty's +// corresponding pty. +func Start(c *exec.Cmd) (pty *os.File, err error) { + return StartWithSize(c, nil) +} + +// StartWithSize assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout, +// and c.Stderr, calls c.Start, and returns the File of the tty's +// corresponding pty. +// +// This will resize the pty to the specified size before starting the command +func StartWithSize(c *exec.Cmd, sz *Winsize) (pty *os.File, err error) { + pty, tty, err := Open() + if err != nil { + return nil, err + } + defer tty.Close() + if sz != nil { + err = Setsize(pty, sz) + if err != nil { + pty.Close() + return nil, err + } + } + if c.Stdout == nil { + c.Stdout = tty + } + if c.Stderr == nil { + c.Stderr = tty + } + if c.Stdin == nil { + c.Stdin = tty + } + if c.SysProcAttr == nil { + c.SysProcAttr = &syscall.SysProcAttr{} + } + c.SysProcAttr.Setctty = true + c.SysProcAttr.Setsid = true + c.SysProcAttr.Ctty = int(tty.Fd()) + err = c.Start() + if err != nil { + pty.Close() + return nil, err + } + return pty, err +} diff --git a/vendor/github.com/creack/pty/test_crosscompile.sh b/vendor/github.com/creack/pty/test_crosscompile.sh new file mode 100644 index 0000000..f0b1dca --- /dev/null +++ b/vendor/github.com/creack/pty/test_crosscompile.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env sh + +# Test script checking that all expected os/arch compile properly. +# Does not actually test the logic, just the compilation so we make sure we don't break code depending on the lib. + +echo2() { + echo $@ >&2 +} + +trap end 0 +end() { + [ "$?" = 0 ] && echo2 "Pass." || (echo2 "Fail."; exit 1) +} + +cross() { + os=$1 + shift + echo2 "Build for $os." + for arch in $@; do + echo2 " - $os/$arch" + GOOS=$os GOARCH=$arch go build + done + echo2 +} + +set -e + +cross linux amd64 386 arm arm64 ppc64 ppc64le s390x mips mipsle mips64 mips64le +cross darwin amd64 386 arm arm64 +cross freebsd amd64 386 arm +cross netbsd amd64 386 arm +cross openbsd amd64 386 +cross dragonfly amd64 +cross solaris amd64 + +# Not expected to work but should still compile. +cross windows amd64 386 arm + +# TODO: Fix compilation error on openbsd/arm. +# TODO: Merge the solaris PR. + +# Some os/arch require a different compiler. Run in docker. +if ! hash docker; then + # If docker is not present, stop here. + return +fi + +echo2 "Build for linux." +echo2 " - linux/riscv" +docker build -t test -f Dockerfile.riscv . diff --git a/vendor/github.com/creack/pty/util.go b/vendor/github.com/creack/pty/util.go new file mode 100644 index 0000000..8fdde0b --- /dev/null +++ b/vendor/github.com/creack/pty/util.go @@ -0,0 +1,64 @@ +// +build !windows,!solaris + +package pty + +import ( + "os" + "syscall" + "unsafe" +) + +// InheritSize applies the terminal size of pty to tty. This should be run +// in a signal handler for syscall.SIGWINCH to automatically resize the tty when +// the pty receives a window size change notification. +func InheritSize(pty, tty *os.File) error { + size, err := GetsizeFull(pty) + if err != nil { + return err + } + err = Setsize(tty, size) + if err != nil { + return err + } + return nil +} + +// Setsize resizes t to s. +func Setsize(t *os.File, ws *Winsize) error { + return windowRectCall(ws, t.Fd(), syscall.TIOCSWINSZ) +} + +// GetsizeFull returns the full terminal size description. +func GetsizeFull(t *os.File) (size *Winsize, err error) { + var ws Winsize + err = windowRectCall(&ws, t.Fd(), syscall.TIOCGWINSZ) + return &ws, err +} + +// Getsize returns the number of rows (lines) and cols (positions +// in each line) in terminal t. +func Getsize(t *os.File) (rows, cols int, err error) { + ws, err := GetsizeFull(t) + return int(ws.Rows), int(ws.Cols), err +} + +// Winsize describes the terminal size. +type Winsize struct { + Rows uint16 // ws_row: Number of rows (in cells) + Cols uint16 // ws_col: Number of columns (in cells) + X uint16 // ws_xpixel: Width in pixels + Y uint16 // ws_ypixel: Height in pixels +} + +func windowRectCall(ws *Winsize, fd, a2 uintptr) error { + _, _, errno := syscall.Syscall( + syscall.SYS_IOCTL, + fd, + a2, + uintptr(unsafe.Pointer(ws)), + ) + if errno != 0 { + return syscall.Errno(errno) + } + return nil +} diff --git a/vendor/github.com/creack/pty/util_solaris.go b/vendor/github.com/creack/pty/util_solaris.go new file mode 100644 index 0000000..e889692 --- /dev/null +++ b/vendor/github.com/creack/pty/util_solaris.go @@ -0,0 +1,51 @@ +// + +package pty + +import ( + "os" + "golang.org/x/sys/unix" +) + +const ( + TIOCGWINSZ = 21608 // 'T' << 8 | 104 + TIOCSWINSZ = 21607 // 'T' << 8 | 103 +) + +// Winsize describes the terminal size. +type Winsize struct { + Rows uint16 // ws_row: Number of rows (in cells) + Cols uint16 // ws_col: Number of columns (in cells) + X uint16 // ws_xpixel: Width in pixels + Y uint16 // ws_ypixel: Height in pixels +} + +// GetsizeFull returns the full terminal size description. +func GetsizeFull(t *os.File) (size *Winsize, err error) { + var wsz *unix.Winsize + wsz, err = unix.IoctlGetWinsize(int(t.Fd()), TIOCGWINSZ) + + if err != nil { + return nil, err + } else { + return &Winsize{wsz.Row, wsz.Col, wsz.Xpixel, wsz.Ypixel}, nil + } +} + +// Get Windows Size +func Getsize(t *os.File) (rows, cols int, err error) { + var wsz *unix.Winsize + wsz, err = unix.IoctlGetWinsize(int(t.Fd()), TIOCGWINSZ) + + if err != nil { + return 80, 25, err + } else { + return int(wsz.Row), int(wsz.Col), nil + } +} + +// Setsize resizes t to s. +func Setsize(t *os.File, ws *Winsize) error { + wsz := unix.Winsize{ws.Rows, ws.Cols, ws.X, ws.Y} + return unix.IoctlSetWinsize(int(t.Fd()), TIOCSWINSZ, &wsz) +} diff --git a/vendor/github.com/creack/pty/ztypes_386.go b/vendor/github.com/creack/pty/ztypes_386.go new file mode 100644 index 0000000..ff0b8fd --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_386.go @@ -0,0 +1,9 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/creack/pty/ztypes_amd64.go b/vendor/github.com/creack/pty/ztypes_amd64.go new file mode 100644 index 0000000..ff0b8fd --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_amd64.go @@ -0,0 +1,9 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/creack/pty/ztypes_arm.go b/vendor/github.com/creack/pty/ztypes_arm.go new file mode 100644 index 0000000..ff0b8fd --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_arm.go @@ -0,0 +1,9 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/creack/pty/ztypes_arm64.go b/vendor/github.com/creack/pty/ztypes_arm64.go new file mode 100644 index 0000000..6c29a4b --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_arm64.go @@ -0,0 +1,11 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +// +build arm64 + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/creack/pty/ztypes_dragonfly_amd64.go b/vendor/github.com/creack/pty/ztypes_dragonfly_amd64.go new file mode 100644 index 0000000..6b0ba03 --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_dragonfly_amd64.go @@ -0,0 +1,14 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_dragonfly.go + +package pty + +const ( + _C_SPECNAMELEN = 0x3f +) + +type fiodgnameArg struct { + Name *byte + Len uint32 + Pad_cgo_0 [4]byte +} diff --git a/vendor/github.com/creack/pty/ztypes_freebsd_386.go b/vendor/github.com/creack/pty/ztypes_freebsd_386.go new file mode 100644 index 0000000..d997537 --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_freebsd_386.go @@ -0,0 +1,13 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_freebsd.go + +package pty + +const ( + _C_SPECNAMELEN = 0x3f +) + +type fiodgnameArg struct { + Len int32 + Buf *byte +} diff --git a/vendor/github.com/creack/pty/ztypes_freebsd_amd64.go b/vendor/github.com/creack/pty/ztypes_freebsd_amd64.go new file mode 100644 index 0000000..5fa102f --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_freebsd_amd64.go @@ -0,0 +1,14 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_freebsd.go + +package pty + +const ( + _C_SPECNAMELEN = 0x3f +) + +type fiodgnameArg struct { + Len int32 + Pad_cgo_0 [4]byte + Buf *byte +} diff --git a/vendor/github.com/creack/pty/ztypes_freebsd_arm.go b/vendor/github.com/creack/pty/ztypes_freebsd_arm.go new file mode 100644 index 0000000..d997537 --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_freebsd_arm.go @@ -0,0 +1,13 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_freebsd.go + +package pty + +const ( + _C_SPECNAMELEN = 0x3f +) + +type fiodgnameArg struct { + Len int32 + Buf *byte +} diff --git a/vendor/github.com/creack/pty/ztypes_mipsx.go b/vendor/github.com/creack/pty/ztypes_mipsx.go new file mode 100644 index 0000000..f0ce740 --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_mipsx.go @@ -0,0 +1,12 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +// +build linux +// +build mips mipsle mips64 mips64le + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/creack/pty/ztypes_openbsd_386.go b/vendor/github.com/creack/pty/ztypes_openbsd_386.go new file mode 100644 index 0000000..ccb3aab --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_openbsd_386.go @@ -0,0 +1,13 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_openbsd.go + +package pty + +type ptmget struct { + Cfd int32 + Sfd int32 + Cn [16]int8 + Sn [16]int8 +} + +var ioctl_PTMGET = 0x40287401 diff --git a/vendor/github.com/creack/pty/ztypes_openbsd_amd64.go b/vendor/github.com/creack/pty/ztypes_openbsd_amd64.go new file mode 100644 index 0000000..e670516 --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_openbsd_amd64.go @@ -0,0 +1,13 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_openbsd.go + +package pty + +type ptmget struct { + Cfd int32 + Sfd int32 + Cn [16]int8 + Sn [16]int8 +} + +var ioctl_PTMGET = 0x40287401 diff --git a/vendor/github.com/creack/pty/ztypes_ppc64.go b/vendor/github.com/creack/pty/ztypes_ppc64.go new file mode 100644 index 0000000..4e1af84 --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_ppc64.go @@ -0,0 +1,11 @@ +// +build ppc64 + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/creack/pty/ztypes_ppc64le.go b/vendor/github.com/creack/pty/ztypes_ppc64le.go new file mode 100644 index 0000000..e6780f4 --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_ppc64le.go @@ -0,0 +1,11 @@ +// +build ppc64le + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/creack/pty/ztypes_riscvx.go b/vendor/github.com/creack/pty/ztypes_riscvx.go new file mode 100644 index 0000000..99eec8e --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_riscvx.go @@ -0,0 +1,11 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs types.go + +// +build riscv riscv64 + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/creack/pty/ztypes_s390x.go b/vendor/github.com/creack/pty/ztypes_s390x.go new file mode 100644 index 0000000..a7452b6 --- /dev/null +++ b/vendor/github.com/creack/pty/ztypes_s390x.go @@ -0,0 +1,11 @@ +// +build s390x + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/docker/engine/AUTHORS b/vendor/github.com/docker/engine/AUTHORS new file mode 100644 index 0000000..c5f725b --- /dev/null +++ b/vendor/github.com/docker/engine/AUTHORS @@ -0,0 +1,2080 @@ +# This file lists all individuals having contributed content to the repository. +# For how it is generated, see `hack/generate-authors.sh`. + +Aanand Prasad +Aaron Davidson +Aaron Feng +Aaron Huslage +Aaron L. Xu +Aaron Lehmann +Aaron Welch +Aaron.L.Xu +Abel Muiño +Abhijeet Kasurde +Abhinandan Prativadi +Abhinav Ajgaonkar +Abhishek Chanda +Abhishek Sharma +Abin Shahab +Adam Avilla +Adam Eijdenberg +Adam Kunk +Adam Miller +Adam Mills +Adam Pointer +Adam Singer +Adam Walz +Addam Hardy +Aditi Rajagopal +Aditya +Adnan Khan +Adolfo Ochagavía +Adria Casas +Adrian Moisey +Adrian Mouat +Adrian Oprea +Adrien Folie +Adrien Gallouët +Ahmed Kamal +Ahmet Alp Balkan +Aidan Feldman +Aidan Hobson Sayers +AJ Bowen +Ajey Charantimath +ajneu +Akash Gupta +Akihiro Matsushima +Akihiro Suda +Akim Demaille +Akira Koyasu +Akshay Karle +Al Tobey +alambike +Alan Scherger +Alan Thompson +Albert Callarisa +Albert Zhang +Alejandro González Hevia +Aleksa Sarai +Aleksandrs Fadins +Alena Prokharchyk +Alessandro Boch +Alessio Biancalana +Alex Chan +Alex Chen +Alex Coventry +Alex Crawford +Alex Ellis +Alex Gaynor +Alex Goodman +Alex Olshansky +Alex Samorukov +Alex Warhawk +Alexander Artemenko +Alexander Boyd +Alexander Larsson +Alexander Midlash +Alexander Morozov +Alexander Shopov +Alexandre Beslic +Alexandre Garnier +Alexandre González +Alexandre Jomin +Alexandru Sfirlogea +Alexei Margasov +Alexey Guskov +Alexey Kotlyarov +Alexey Shamrin +Alexis THOMAS +Alfred Landrum +Ali Dehghani +Alicia Lauerman +Alihan Demir +Allen Madsen +Allen Sun +almoehi +Alvaro Saurin +Alvin Deng +Alvin Richards +amangoel +Amen Belayneh +Amir Goldstein +Amit Bakshi +Amit Krishnan +Amit Shukla +Amr Gawish +Amy Lindburg +Anand Patil +AnandkumarPatel +Anatoly Borodin +Anchal Agrawal +Anda Xu +Anders Janmyr +Andre Dublin <81dublin@gmail.com> +Andre Granovsky +Andrea Luzzardi +Andrea Turli +Andreas Elvers +Andreas Köhler +Andreas Savvides +Andreas Tiefenthaler +Andrei Gherzan +Andrei Vagin +Andrew C. Bodine +Andrew Clay Shafer +Andrew Duckworth +Andrew France +Andrew Gerrand +Andrew Guenther +Andrew He +Andrew Hsu +Andrew Kuklewicz +Andrew Macgregor +Andrew Macpherson +Andrew Martin +Andrew McDonnell +Andrew Munsell +Andrew Pennebaker +Andrew Po +Andrew Weiss +Andrew Williams +Andrews Medina +Andrey Kolomentsev +Andrey Petrov +Andrey Stolbovsky +André Martins +andy +Andy Chambers +andy diller +Andy Goldstein +Andy Kipp +Andy Rothfusz +Andy Smith +Andy Wilson +Anes Hasicic +Anil Belur +Anil Madhavapeddy +Ankit Jain +Ankush Agarwal +Anonmily +Anran Qiao +Anshul Pundir +Anthon van der Neut +Anthony Baire +Anthony Bishopric +Anthony Dahanne +Anthony Sottile +Anton Löfgren +Anton Nikitin +Anton Polonskiy +Anton Tiurin +Antonio Murdaca +Antonis Kalipetis +Antony Messerli +Anuj Bahuguna +Anusha Ragunathan +apocas +Arash Deshmeh +ArikaChen +Arnaud Lefebvre +Arnaud Porterie +Arthur Barr +Arthur Gautier +Artur Meyster +Arun Gupta +Asad Saeeduddin +Asbjørn Enge +averagehuman +Avi Das +Avi Kivity +Avi Miller +Avi Vaid +ayoshitake +Azat Khuyiyakhmetov +Bardia Keyoumarsi +Barnaby Gray +Barry Allard +Bartłomiej Piotrowski +Bastiaan Bakker +bdevloed +Ben Bonnefoy +Ben Firshman +Ben Golub +Ben Gould +Ben Hall +Ben Sargent +Ben Severson +Ben Toews +Ben Wiklund +Benjamin Atkin +Benjamin Baker +Benjamin Boudreau +Benjamin Yolken +Benoit Chesneau +Bernerd Schaefer +Bernhard M. Wiedemann +Bert Goethals +Bevisy Zhang +Bharath Thiruveedula +Bhiraj Butala +Bhumika Bayani +Bilal Amarni +Bill Wang +Bily Zhang +Bin Liu +Bingshen Wang +Blake Geno +Boaz Shuster +bobby abbott +Boris Pruessmann +Boshi Lian +Bouke Haarsma +Boyd Hemphill +boynux +Bradley Cicenas +Bradley Wright +Brandon Liu +Brandon Philips +Brandon Rhodes +Brendan Dixon +Brent Salisbury +Brett Higgins +Brett Kochendorfer +Brett Randall +Brian (bex) Exelbierd +Brian Bland +Brian DeHamer +Brian Dorsey +Brian Flad +Brian Goff +Brian McCallister +Brian Olsen +Brian Schwind +Brian Shumate +Brian Torres-Gil +Brian Trump +Brice Jaglin +Briehan Lombaard +Brielle Broder +Bruno Bigras +Bruno Binet +Bruno Gazzera +Bruno Renié +Bruno Tavares +Bryan Bess +Bryan Boreham +Bryan Matsuo +Bryan Murphy +Burke Libbey +Byung Kang +Caleb Spare +Calen Pennington +Cameron Boehmer +Cameron Spear +Campbell Allen +Candid Dauth +Cao Weiwei +Carl Henrik Lunde +Carl Loa Odin +Carl X. Su +Carlo Mion +Carlos Alexandro Becker +Carlos Sanchez +Carol Fager-Higgins +Cary +Casey Bisson +Catalin Pirvu +Ce Gao +Cedric Davies +Cezar Sa Espinola +Chad Swenson +Chance Zibolski +Chander Govindarajan +Chanhun Jeong +Chao Wang +Charles Chan +Charles Hooper +Charles Law +Charles Lindsay +Charles Merriam +Charles Sarrazin +Charles Smith +Charlie Drage +Charlie Lewis +Chase Bolt +ChaYoung You +Chen Chao +Chen Chuanliang +Chen Hanxiao +Chen Min +Chen Mingjie +Chen Qiu +Cheng-mean Liu +Chengfei Shang +Chengguang Xu +chenyuzhu +Chetan Birajdar +Chewey +Chia-liang Kao +chli +Cholerae Hu +Chris Alfonso +Chris Armstrong +Chris Dias +Chris Dituri +Chris Fordham +Chris Gavin +Chris Gibson +Chris Khoo +Chris McKinnel +Chris McKinnel +Chris Seto +Chris Snow +Chris St. Pierre +Chris Stivers +Chris Swan +Chris Telfer +Chris Wahl +Chris Weyl +Chris White +Christian Berendt +Christian Brauner +Christian Böhme +Christian Muehlhaeuser +Christian Persson +Christian Rotzoll +Christian Simon +Christian Stefanescu +Christophe Mehay +Christophe Troestler +Christophe Vidal +Christopher Biscardi +Christopher Crone +Christopher Currie +Christopher Jones +Christopher Latham +Christopher Rigor +Christy Perez +Chun Chen +Ciro S. Costa +Clayton Coleman +Clinton Kitson +Cody Roseborough +Coenraad Loubser +Colin Dunklau +Colin Hebert +Colin Panisset +Colin Rice +Colin Walters +Collin Guarino +Colm Hally +companycy +Corbin Coleman +Corey Farrell +Cory Forsyth +cressie176 +CrimsonGlory +Cristian Staretu +cristiano balducci +Cruceru Calin-Cristian +CUI Wei +Cyprian Gracz +Cyril F +Daan van Berkel +Daehyeok Mun +Dafydd Crosby +dalanlan +Damian Smyth +Damien Nadé +Damien Nozay +Damjan Georgievski +Dan Anolik +Dan Buch +Dan Cotora +Dan Feldman +Dan Griffin +Dan Hirsch +Dan Keder +Dan Levy +Dan McPherson +Dan Stine +Dan Williams +Dani Hodovic +Dani Louca +Daniel Antlinger +Daniel Dao +Daniel Exner +Daniel Farrell +Daniel Garcia +Daniel Gasienica +Daniel Grunwell +Daniel Hiltgen +Daniel J Walsh +Daniel Menet +Daniel Mizyrycki +Daniel Nephin +Daniel Norberg +Daniel Nordberg +Daniel Robinson +Daniel S +Daniel Von Fange +Daniel Watkins +Daniel X Moore +Daniel YC Lin +Daniel Zhang +Danny Berger +Danny Yates +Danyal Khaliq +Darren Coxall +Darren Shepherd +Darren Stahl +Dattatraya Kumbhar +Davanum Srinivas +Dave Barboza +Dave Goodchild +Dave Henderson +Dave MacDonald +Dave Tucker +David Anderson +David Calavera +David Chung +David Corking +David Cramer +David Currie +David Davis +David Dooling +David Gageot +David Gebler +David Glasser +David Lawrence +David Lechner +David M. Karr +David Mackey +David Mat +David Mcanulty +David McKay +David P Hilton +David Pelaez +David R. Jenni +David Röthlisberger +David Sheets +David Sissitka +David Trott +David Wang <00107082@163.com> +David Williamson +David Xia +David Young +Davide Ceretti +Dawn Chen +dbdd +dcylabs +Debayan De +Deborah Gertrude Digges +deed02392 +Deep Debroy +Deng Guangxing +Deni Bertovic +Denis Defreyne +Denis Gladkikh +Denis Ollier +Dennis Chen +Dennis Chen +Dennis Docter +Derek +Derek +Derek Ch +Derek McGowan +Deric Crago +Deshi Xiao +devmeyster +Devvyn Murphy +Dharmit Shah +Dhawal Yogesh Bhanushali +Diego Romero +Diego Siqueira +Dieter Reuter +Dillon Dixon +Dima Stopel +Dimitri John Ledkov +Dimitris Mandalidis +Dimitris Rozakis +Dimitry Andric +Dinesh Subhraveti +Ding Fei +Diogo Monica +DiuDiugirl +Djibril Koné +dkumor +Dmitri Logvinenko +Dmitri Shuralyov +Dmitry Demeshchuk +Dmitry Gusev +Dmitry Kononenko +Dmitry Sharshakov +Dmitry Shyshkin +Dmitry Smirnov +Dmitry V. Krivenok +Dmitry Vorobev +Dolph Mathews +Dominik Dingel +Dominik Finkbeiner +Dominik Honnef +Don Kirkby +Don Kjer +Don Spaulding +Donald Huang +Dong Chen +Donghwa Kim +Donovan Jones +Doron Podoleanu +Doug Davis +Doug MacEachern +Doug Tangren +Douglas Curtis +Dr Nic Williams +dragon788 +Dražen Lučanin +Drew Erny +Drew Hubl +Dustin Sallings +Ed Costello +Edmund Wagner +Eiichi Tsukata +Eike Herzbach +Eivin Giske Skaaren +Eivind Uggedal +Elan Ruusamäe +Elango Sivanandam +Elena Morozova +Eli Uriegas +Elias Faxö +Elias Probst +Elijah Zupancic +eluck +Elvir Kuric +Emil Davtyan +Emil Hernvall +Emily Maier +Emily Rose +Emir Ozer +Enguerran +Eohyung Lee +epeterso +Eric Barch +Eric Curtin +Eric G. Noriega +Eric Hanchrow +Eric Lee +Eric Myhre +Eric Paris +Eric Rafaloff +Eric Rosenberg +Eric Sage +Eric Soderstrom +Eric Yang +Eric-Olivier Lamey +Erica Windisch +Erik Bray +Erik Dubbelboer +Erik Hollensbe +Erik Inge Bolsø +Erik Kristensen +Erik St. Martin +Erik Weathers +Erno Hopearuoho +Erwin van der Koogh +Ethan Bell +Euan Kemp +Eugen Krizo +Eugene Yakubovich +Evan Allrich +Evan Carmi +Evan Hazlett +Evan Krall +Evan Phoenix +Evan Wies +Evelyn Xu +Everett Toews +Evgeny Shmarnev +Evgeny Vereshchagin +Ewa Czechowska +Eystein Måløy Stenberg +ezbercih +Ezra Silvera +Fabian Kramm +Fabian Lauer +Fabian Raetz +Fabiano Rosas +Fabio Falci +Fabio Kung +Fabio Rapposelli +Fabio Rehm +Fabrizio Regini +Fabrizio Soppelsa +Faiz Khan +falmp +Fangming Fang +Fangyuan Gao <21551127@zju.edu.cn> +fanjiyun +Fareed Dudhia +Fathi Boudra +Federico Gimenez +Felipe Oliveira +Felix Abecassis +Felix Geisendörfer +Felix Hupfeld +Felix Rabe +Felix Ruess +Felix Schindler +Feng Yan +Fengtu Wang +Ferenc Szabo +Fernando +Fero Volar +Ferran Rodenas +Filipe Brandenburger +Filipe Oliveira +Flavio Castelli +Flavio Crisciani +Florian +Florian Klein +Florian Maier +Florian Noeding +Florian Weingarten +Florin Asavoaie +Florin Patan +fonglh +Foysal Iqbal +Francesc Campoy +Francesco Mari +Francis Chuang +Francisco Carriedo +Francisco Souza +Frank Groeneveld +Frank Herrmann +Frank Macreery +Frank Rosquin +Fred Lifton +Frederick F. Kautz IV +Frederik Loeffert +Frederik Nordahl Jul Sabroe +Freek Kalter +Frieder Bluemle +Fu JinLin +Félix Baylac-Jacqué +Félix Cantournet +Gabe Rosenhouse +Gabor Nagy +Gabriel Linder +Gabriel Monroy +Gabriel Nicolas Avellaneda +Gaetan de Villele +Galen Sampson +Gang Qiao +Gareth Rushgrove +Garrett Barboza +Gary Schaetz +Gaurav +gautam, prasanna +Gaël PORTAY +Genki Takiuchi +GennadySpb +Geoffrey Bachelet +Geon Kim +George Kontridze +George MacRorie +George Xie +Georgi Hristozov +Gereon Frey +German DZ +Gert van Valkenhoef +Gerwim Feiken +Ghislain Bourgeois +Giampaolo Mancini +Gianluca Borello +Gildas Cuisinier +Giovan Isa Musthofa +gissehel +Giuseppe Mazzotta +Gleb Fotengauer-Malinovskiy +Gleb M Borisov +Glyn Normington +GoBella +Goffert van Gool +Gopikannan Venugopalsamy +Gosuke Miyashita +Gou Rao +Govinda Fichtner +Grant Millar +Grant Reaber +Graydon Hoare +Greg Fausak +Greg Pflaum +Greg Stephens +Greg Thornton +Grzegorz Jaśkiewicz +Guilhem Lettron +Guilherme Salgado +Guillaume Dufour +Guillaume J. Charmes +guoxiuyan +Guri +Gurjeet Singh +Guruprasad +Gustav Sinder +gwx296173 +Günter Zöchbauer +haikuoliu +Hakan Özler +Hamish Hutchings +Hans Kristian Flaatten +Hans Rødtang +Hao Shu Wei +Hao Zhang <21521210@zju.edu.cn> +Harald Albers +Harley Laue +Harold Cooper +Harrison Turton +Harry Zhang +Harshal Patil +Harshal Patil +He Simei +He Xiaoxi +He Xin +heartlock <21521209@zju.edu.cn> +Hector Castro +Helen Xie +Henning Sprang +Hiroshi Hatake +Hiroyuki Sasagawa +Hobofan +Hollie Teal +Hong Xu +Hongbin Lu +hsinko <21551195@zju.edu.cn> +Hu Keping +Hu Tao +Huanzhong Zhang +Huayi Zhang +Hugo Duncan +Hugo Marisco <0x6875676f@gmail.com> +Hunter Blanks +huqun +Huu Nguyen +hyeongkyu.lee +Hyzhou Zhy +Iago López Galeiras +Ian Babrou +Ian Bishop +Ian Bull +Ian Calvert +Ian Campbell +Ian Chen +Ian Lee +Ian Main +Ian Philpot +Ian Truslove +Iavael +Icaro Seara +Ignacio Capurro +Igor Dolzhikov +Igor Karpovich +Iliana Weller +Ilkka Laukkanen +Ilya Dmitrichenko +Ilya Gusev +Ilya Khlopotov +imre Fitos +inglesp +Ingo Gottwald +Innovimax +Isaac Dupree +Isabel Jimenez +Isao Jonas +Iskander Sharipov +Ivan Babrou +Ivan Fraixedes +Ivan Grcic +Ivan Markin +J Bruni +J. Nunn +Jack Danger Canty +Jack Laxson +Jacob Atzen +Jacob Edelman +Jacob Tomlinson +Jacob Vallejo +Jacob Wen +Jaivish Kothari +Jake Champlin +Jake Moshenko +Jake Sanders +jakedt +James Allen +James Carey +James Carr +James DeFelice +James Harrison Fisher +James Kyburz +James Kyle +James Lal +James Mills +James Nesbitt +James Nugent +James Turnbull +James Watkins-Harvey +Jamie Hannaford +Jamshid Afshar +Jan Keromnes +Jan Koprowski +Jan Pazdziora +Jan Toebes +Jan-Gerd Tenberge +Jan-Jaap Driessen +Jana Radhakrishnan +Jannick Fahlbusch +Januar Wayong +Jared Biel +Jared Hocutt +Jaroslaw Zabiello +jaseg +Jasmine Hegman +Jason Divock +Jason Giedymin +Jason Green +Jason Hall +Jason Heiss +Jason Livesay +Jason McVetta +Jason Plum +Jason Shepherd +Jason Smith +Jason Sommer +Jason Stangroome +jaxgeller +Jay +Jay +Jay Kamat +Jean Rouge +Jean-Baptiste Barth +Jean-Baptiste Dalido +Jean-Christophe Berthon +Jean-Paul Calderone +Jean-Pierre Huynh +Jean-Tiare Le Bigot +Jeeva S. Chelladhurai +Jeff Anderson +Jeff Hajewski +Jeff Johnston +Jeff Lindsay +Jeff Mickey +Jeff Minard +Jeff Nickoloff +Jeff Silberman +Jeff Welch +Jeffrey Bolle +Jeffrey Morgan +Jeffrey van Gogh +Jenny Gebske +Jeremy Chambers +Jeremy Grosser +Jeremy Price +Jeremy Qian +Jeremy Unruh +Jeremy Yallop +Jeroen Franse +Jeroen Jacobs +Jesse Dearing +Jesse Dubay +Jessica Frazelle +Jezeniel Zapanta +Jhon Honce +Ji.Zhilong +Jian Liao +Jian Zhang +Jiang Jinyang +Jie Luo +Jihyun Hwang +Jilles Oldenbeuving +Jim Alateras +Jim Galasyn +Jim Minter +Jim Perrin +Jimmy Cuadra +Jimmy Puckett +Jimmy Song +Jinsoo Park +Jintao Zhang +Jiri Appl +Jiri Popelka +Jiuyue Ma +Jiří Župka +Joao Fernandes +Joao Trindade +Joe Beda +Joe Doliner +Joe Ferguson +Joe Gordon +Joe Shaw +Joe Van Dyk +Joel Friedly +Joel Handwell +Joel Hansson +Joel Wurtz +Joey Geiger +Joey Geiger +Joey Gibson +Joffrey F +Johan Euphrosine +Johan Rydberg +Johanan Lieberman +Johannes 'fish' Ziemke +John Costa +John Feminella +John Gardiner Myers +John Gossman +John Harris +John Howard (VM) +John Laswell +John Maguire +John Mulhausen +John OBrien III +John Starks +John Stephens +John Tims +John V. Martinez +John Warwick +John Willis +Jon Johnson +Jon Surrell +Jon Wedaman +Jonas Pfenniger +Jonathan A. Schweder +Jonathan A. Sternberg +Jonathan Boulle +Jonathan Camp +Jonathan Choy +Jonathan Dowland +Jonathan Lebon +Jonathan Lomas +Jonathan McCrohan +Jonathan Mueller +Jonathan Pares +Jonathan Rudenberg +Jonathan Stoppani +Jonh Wendell +Joni Sar +Joost Cassee +Jordan Arentsen +Jordan Jennings +Jordan Sissel +Jorge Marin +Jorit Kleine-Möllhoff +Jose Diaz-Gonzalez +Joseph Anthony Pasquale Holsten +Joseph Hager +Joseph Kern +Joseph Rothrock +Josh +Josh Bodah +Josh Bonczkowski +Josh Chorlton +Josh Eveleth +Josh Hawn +Josh Horwitz +Josh Poimboeuf +Josh Soref +Josh Wilson +Josiah Kiehl +José Tomás Albornoz +Joyce Jang +JP +Julian Taylor +Julien Barbier +Julien Bisconti +Julien Bordellier +Julien Dubois +Julien Kassar +Julien Maitrehenry +Julien Pervillé +Julio Montes +Jun-Ru Chang +Jussi Nummelin +Justas Brazauskas +Justin Cormack +Justin Force +Justin Menga +Justin Plock +Justin Simonelis +Justin Terry +Justyn Temme +Jyrki Puttonen +Jérôme Petazzoni +Jörg Thalheim +K. Heller +Kai Blin +Kai Qiang Wu (Kennan) +Kamil Domański +Kamjar Gerami +Kanstantsin Shautsou +Kara Alexandra +Karan Lyons +Kareem Khazem +kargakis +Karl Grzeszczak +Karol Duleba +Karthik Karanth +Karthik Nayak +Kasper Fabæch Brandt +Kate Heddleston +Katie McLaughlin +Kato Kazuyoshi +Katrina Owen +Kawsar Saiyeed +Kay Yan +kayrus +Kazuhiro Sera +Ke Li +Ke Xu +Kei Ohmura +Keith Hudgins +Keli Hu +Ken Cochrane +Ken Herner +Ken ICHIKAWA +Ken Reese +Kenfe-Mickaël Laventure +Kenjiro Nakayama +Kent Johnson +Kevin "qwazerty" Houdebert +Kevin Burke +Kevin Clark +Kevin Feyrer +Kevin J. Lynagh +Kevin Jing Qiu +Kevin Kern +Kevin Menard +Kevin Meredith +Kevin P. Kucharczyk +Kevin Richardson +Kevin Shi +Kevin Wallace +Kevin Yap +Keyvan Fatehi +kies +Kim BKC Carlbacker +Kim Eik +Kimbro Staken +Kir Kolyshkin +Kiran Gangadharan +Kirill SIbirev +knappe +Kohei Tsuruta +Koichi Shiraishi +Konrad Kleine +Konstantin Gribov +Konstantin L +Konstantin Pelykh +Krasi Georgiev +Krasimir Georgiev +Kris-Mikael Krister +Kristian Haugene +Kristina Zabunova +Krystian Wojcicki +Kun Zhang +Kunal Kushwaha +Kunal Tyagi +Kyle Conroy +Kyle Linden +Kyle Wuolle +kyu +Lachlan Coote +Lai Jiangshan +Lajos Papp +Lakshan Perera +Lalatendu Mohanty +Lance Chen +Lance Kinley +Lars Butler +Lars Kellogg-Stedman +Lars R. Damerow +Lars-Magnus Skog +Laszlo Meszaros +Laura Frank +Laurent Erignoux +Laurie Voss +Leandro Siqueira +Lee Chao <932819864@qq.com> +Lee, Meng-Han +leeplay +Lei Gong +Lei Jitang +Len Weincier +Lennie +Leo Gallucci +Leszek Kowalski +Levi Blackstone +Levi Gross +Lewis Daly +Lewis Marshall +Lewis Peckover +Li Yi +Liam Macgillavry +Liana Lo +Liang Mingqiang +Liang-Chi Hsieh +Liao Qingwei +Lifubang +Lihua Tang +Lily Guo +limsy +Lin Lu +LingFaKe +Linus Heckemann +Liran Tal +Liron Levin +Liu Bo +Liu Hua +liwenqi +lixiaobing10051267 +Liz Zhang +LIZAO LI +Lizzie Dixon <_@lizzie.io> +Lloyd Dewolf +Lokesh Mandvekar +longliqiang88 <394564827@qq.com> +Lorenz Leutgeb +Lorenzo Fontana +Lotus Fenn +Louis Opter +Luca Favatella +Luca Marturana +Luca Orlandi +Luca-Bogdan Grigorescu +Lucas Chan +Lucas Chi +Lucas Molas +Luciano Mores +Luis Martínez de Bartolomé Izquierdo +Luiz Svoboda +Lukas Waslowski +lukaspustina +Lukasz Zajaczkowski +Luke Marsden +Lyn +Lynda O'Leary +Lénaïc Huard +Ma Müller +Ma Shimiao +Mabin +Madhan Raj Mookkandy +Madhav Puri +Madhu Venugopal +Mageee +Mahesh Tiyyagura +malnick +Malte Janduda +Manfred Touron +Manfred Zabarauskas +Manjunath A Kumatagi +Mansi Nahar +Manuel Meurer +Manuel Rüger +Manuel Woelker +mapk0y +Marc Abramowitz +Marc Kuo +Marc Tamsky +Marcel Edmund Franke +Marcelo Horacio Fortino +Marcelo Salazar +Marco Hennings +Marcus Cobden +Marcus Farkas +Marcus Linke +Marcus Martins +Marcus Ramberg +Marek Goldmann +Marian Marinov +Marianna Tessel +Mario Loriedo +Marius Gundersen +Marius Sturm +Marius Voila +Mark Allen +Mark Jeromin +Mark McGranaghan +Mark McKinstry +Mark Milstein +Mark Oates +Mark Parker +Mark West +Markan Patel +Marko Mikulicic +Marko Tibold +Markus Fix +Markus Kortlang +Martijn Dwars +Martijn van Oosterhout +Martin Honermeyer +Martin Kelly +Martin Mosegaard Amdisen +Martin Muzatko +Martin Redmond +Mary Anthony +Masahito Zembutsu +Masato Ohba +Masayuki Morita +Mason Malone +Mateusz Sulima +Mathias Monnerville +Mathieu Champlon +Mathieu Le Marec - Pasquet +Mathieu Parent +Matt Apperson +Matt Bachmann +Matt Bentley +Matt Haggard +Matt Hoyle +Matt McCormick +Matt Moore +Matt Richardson +Matt Rickard +Matt Robenolt +Matt Schurenko +Matt Williams +Matthew Heon +Matthew Lapworth +Matthew Mayer +Matthew Mosesohn +Matthew Mueller +Matthew Riley +Matthias Klumpp +Matthias Kühnle +Matthias Rampke +Matthieu Hauglustaine +Mattias Jernberg +Mauricio Garavaglia +mauriyouth +Max Shytikov +Maxim Fedchyshyn +Maxim Ivanov +Maxim Kulkin +Maxim Treskin +Maxime Petazzoni +Maximiliano Maccanti +Maxwell +Meaglith Ma +meejah +Megan Kostick +Mehul Kar +Mei ChunTao +Mengdi Gao +Mert Yazıcıoğlu +mgniu +Micah Zoltu +Michael A. Smith +Michael Bridgen +Michael Brown +Michael Chiang +Michael Crosby +Michael Currie +Michael Friis +Michael Gorsuch +Michael Grauer +Michael Holzheu +Michael Hudson-Doyle +Michael Huettermann +Michael Irwin +Michael Käufl +Michael Neale +Michael Nussbaum +Michael Prokop +Michael Scharf +Michael Spetsiotis +Michael Stapelberg +Michael Steinert +Michael Thies +Michael West +Michal Fojtik +Michal Gebauer +Michal Jemala +Michal Minář +Michal Wieczorek +Michaël Pailloncy +Michał Czeraszkiewicz +Michał Gryko +Michiel de Jong +Mickaël Fortunato +Mickaël Remars +Miguel Angel Fernández +Miguel Morales +Mihai Borobocea +Mihuleacc Sergiu +Mike Brown +Mike Casas +Mike Chelen +Mike Danese +Mike Dillon +Mike Dougherty +Mike Estes +Mike Gaffney +Mike Goelzer +Mike Leone +Mike Lundy +Mike MacCana +Mike Naberezny +Mike Snitzer +mikelinjie <294893458@qq.com> +Mikhail Sobolev +Miklos Szegedi +Milind Chawre +Miloslav Trmač +mingqing +Mingzhen Feng +Misty Stanley-Jones +Mitch Capper +Mizuki Urushida +mlarcher +Mohammad Banikazemi +Mohammad Nasirifar +Mohammed Aaqib Ansari +Mohit Soni +Moorthy RS +Morgan Bauer +Morgante Pell +Morgy93 +Morten Siebuhr +Morton Fox +Moysés Borges +mrfly +Mrunal Patel +Muayyad Alsadi +Mustafa Akın +Muthukumar R +Máximo Cuadros +Médi-Rémi Hashim +Nace Oroz +Nahum Shalman +Nakul Pathak +Nalin Dahyabhai +Nan Monnand Deng +Naoki Orii +Natalie Parker +Natanael Copa +Natasha Jarus +Nate Brennand +Nate Eagleson +Nate Jones +Nathan Hsieh +Nathan Kleyn +Nathan LeClaire +Nathan McCauley +Nathan Williams +Naveed Jamil +Neal McBurnett +Neil Horman +Neil Peterson +Nelson Chen +Neyazul Haque +Nghia Tran +Niall O'Higgins +Nicholas E. Rabenau +Nick DeCoursin +Nick Irvine +Nick Neisen +Nick Parker +Nick Payne +Nick Russo +Nick Stenning +Nick Stinemates +NickrenREN +Nicola Kabar +Nicolas Borboën +Nicolas De Loof +Nicolas Dudebout +Nicolas Goy +Nicolas Kaiser +Nicolas Sterchele +Nicolas V Castet +Nicolás Hock Isaza +Nigel Poulton +Nik Nyby +Nikhil Chawla +NikolaMandic +Nikolas Garofil +Nikolay Milovanov +Nirmal Mehta +Nishant Totla +NIWA Hideyuki +Noah Meyerhans +Noah Treuhaft +NobodyOnSE +noducks +Nolan Darilek +Noriki Nakamura +nponeccop +Nuutti Kotivuori +nzwsch +O.S. Tezer +objectified +Oguz Bilgic +Oh Jinkyun +Ohad Schneider +ohmystack +Ole Reifschneider +Oliver Neal +Oliver Reason +Olivier Gambier +Olle Jonsson +Olli Janatuinen +Omri Shiv +Oriol Francès +Oskar Niburski +Otto Kekäläinen +Ouyang Liduo +Ovidio Mallo +Panagiotis Moustafellos +Paolo G. Giarrusso +Pascal +Pascal Borreli +Pascal Hartig +Patrick Böänziger +Patrick Devine +Patrick Hemmer +Patrick Stapleton +Patrik Cyvoct +pattichen +Paul +paul +Paul Annesley +Paul Bellamy +Paul Bowsher +Paul Furtado +Paul Hammond +Paul Jimenez +Paul Kehrer +Paul Lietar +Paul Liljenberg +Paul Morie +Paul Nasrat +Paul Weaver +Paulo Ribeiro +Pavel Lobashov +Pavel Pletenev +Pavel Pospisil +Pavel Sutyrin +Pavel Tikhomirov +Pavlos Ratis +Pavol Vargovcik +Pawel Konczalski +Peeyush Gupta +Peggy Li +Pei Su +Peng Tao +Penghan Wang +Per Weijnitz +perhapszzy@sina.com +Peter Bourgon +Peter Braden +Peter Bücker +Peter Choi +Peter Dave Hello +Peter Edge +Peter Ericson +Peter Esbensen +Peter Jaffe +Peter Kang +Peter Malmgren +Peter Salvatore +Peter Volpe +Peter Waller +Petr Švihlík +Phil +Phil Estes +Phil Spitler +Philip Alexander Etling +Philip Monroe +Philipp Gillé +Philipp Wahala +Philipp Weissensteiner +Phillip Alexander +phineas +pidster +Piergiuliano Bossi +Pierre +Pierre Carrier +Pierre Dal-Pra +Pierre Wacrenier +Pierre-Alain RIVIERE +Piotr Bogdan +pixelistik +Porjo +Poul Kjeldager Sørensen +Pradeep Chhetri +Pradip Dhara +Prasanna Gautam +Pratik Karki +Prayag Verma +Priya Wadhwa +Projjol Banerji +Przemek Hejman +Pure White +pysqz +Qiang Huang +Qinglan Peng +qudongfang +Quentin Brossard +Quentin Perez +Quentin Tayssier +r0n22 +Radostin Stoyanov +Rafal Jeczalik +Rafe Colton +Raghavendra K T +Raghuram Devarakonda +Raja Sami +Rajat Pandit +Rajdeep Dua +Ralf Sippl +Ralle +Ralph Bean +Ramkumar Ramachandra +Ramon Brooker +Ramon van Alteren +RaviTeja Pothana +Ray Tsang +ReadmeCritic +Recursive Madman +Reficul +Regan McCooey +Remi Rampin +Remy Suen +Renato Riccieri Santos Zannon +Renaud Gaubert +Rhys Hiltner +Ri Xu +Ricardo N Feliciano +Rich Moyse +Rich Seymour +Richard +Richard Burnison +Richard Harvey +Richard Mathie +Richard Metzler +Richard Scothern +Richo Healey +Rick Bradley +Rick van de Loo +Rick Wieman +Rik Nijessen +Riku Voipio +Riley Guerin +Ritesh H Shukla +Riyaz Faizullabhoy +Rob Vesse +Robert Bachmann +Robert Bittle +Robert Obryk +Robert Schneider +Robert Stern +Robert Terhaar +Robert Wallis +Roberto G. Hashioka +Roberto Muñoz Fernández +Robin Naundorf +Robin Schneider +Robin Speekenbrink +robpc +Rodolfo Carvalho +Rodrigo Vaz +Roel Van Nyen +Roger Peppe +Rohit Jnagal +Rohit Kadam +Rohit Kapur +Rojin George +Roland Huß +Roland Kammerer +Roland Moriz +Roma Sokolov +Roman Dudin +Roman Strashkin +Ron Smits +Ron Williams +Rong Gao +Rong Zhang +Rongxiang Song +root +root +root +root +Rory Hunter +Rory McCune +Ross Boucher +Rovanion Luckey +Royce Remer +Rozhnov Alexandr +Rudolph Gottesheim +Rui Cao +Rui Lopes +Runshen Zhu +Russ Magee +Ryan Abrams +Ryan Anderson +Ryan Aslett +Ryan Belgrave +Ryan Detzel +Ryan Fowler +Ryan Liu +Ryan McLaughlin +Ryan O'Donnell +Ryan Seto +Ryan Simmen +Ryan Stelly +Ryan Thomas +Ryan Trauntvein +Ryan Wallner +Ryan Zhang +ryancooper7 +RyanDeng +Ryo Nakao +Rémy Greinhofer +s. rannou +s00318865 +Sabin Basyal +Sachin Joshi +Sagar Hani +Sainath Grandhi +Sakeven Jiang +Salahuddin Khan +Sally O'Malley +Sam Abed +Sam Alba +Sam Bailey +Sam J Sharpe +Sam Neirinck +Sam Reis +Sam Rijs +Sambuddha Basu +Sami Wagiaalla +Samuel Andaya +Samuel Dion-Girardeau +Samuel Karp +Samuel PHAN +Sandeep Bansal +Sankar சங்கர் +Sanket Saurav +Santhosh Manohar +sapphiredev +Sargun Dhillon +Sascha Andres +Sascha Grunert +Satnam Singh +Satoshi Amemiya +Satoshi Tagomori +Scott Bessler +Scott Collier +Scott Johnston +Scott Stamp +Scott Walls +sdreyesg +Sean Christopherson +Sean Cronin +Sean Lee +Sean McIntyre +Sean OMeara +Sean P. Kane +Sean Rodman +Sebastiaan van Steenis +Sebastiaan van Stijn +Senthil Kumar Selvaraj +Senthil Kumaran +SeongJae Park +Seongyeol Lim +Serge Hallyn +Sergey Alekseev +Sergey Evstifeev +Sergii Kabashniuk +Sergio Lopez +Serhat Gülçiçek +SeungUkLee +Sevki Hasirci +Shane Canon +Shane da Silva +Shaun Kaasten +shaunol +Shawn Landden +Shawn Siefkas +shawnhe +Shayne Wang +Shekhar Gulati +Sheng Yang +Shengbo Song +Shev Yan +Shih-Yuan Lee +Shijiang Wei +Shijun Qin +Shishir Mahajan +Shoubhik Bose +Shourya Sarcar +shuai-z +Shukui Yang +Shuwei Hao +Sian Lerk Lau +Sidhartha Mani +sidharthamani +Silas Sewell +Silvan Jegen +Simão Reis +Simei He +Simon Eskildsen +Simon Ferquel +Simon Leinen +Simon Menke +Simon Taranto +Simon Vikstrom +Sindhu S +Sjoerd Langkemper +Solganik Alexander +Solomon Hykes +Song Gao +Soshi Katsuta +Soulou +Spencer Brown +Spencer Smith +Sridatta Thatipamala +Sridhar Ratnakumar +Srini Brahmaroutu +Srinivasan Srivatsan +Stanislav Bondarenko +Steeve Morin +Stefan Berger +Stefan J. Wernli +Stefan Praszalowicz +Stefan S. +Stefan Scherer +Stefan Staudenmeyer +Stefan Weil +Stephan Spindler +Stephen Crosby +Stephen Day +Stephen Drake +Stephen Rust +Steve Desmond +Steve Dougherty +Steve Durrheimer +Steve Francia +Steve Koch +Steven Burgess +Steven Erenst +Steven Hartland +Steven Iveson +Steven Merrill +Steven Richards +Steven Taylor +Subhajit Ghosh +Sujith Haridasan +Sun Gengze <690388648@qq.com> +Sun Jianbo +Sunny Gogoi +Suryakumar Sudar +Sven Dowideit +Swapnil Daingade +Sylvain Baubeau +Sylvain Bellemare +Sébastien +Sébastien HOUZÉ +Sébastien Luttringer +Sébastien Stormacq +Tabakhase +Tadej Janež +TAGOMORI Satoshi +tang0th +Tangi Colin +Tatsuki Sugiura +Tatsushi Inagaki +Taylan Isikdemir +Taylor Jones +Ted M. Young +Tehmasp Chaudhri +Tejaswini Duggaraju +Tejesh Mehta +terryding77 <550147740@qq.com> +tgic +Thatcher Peskens +theadactyl +Thell 'Bo' Fowler +Thermionix +Thijs Terlouw +Thomas Bikeev +Thomas Frössman +Thomas Gazagnaire +Thomas Grainger +Thomas Hansen +Thomas Leonard +Thomas Léveil +Thomas Orozco +Thomas Riccardi +Thomas Schroeter +Thomas Sjögren +Thomas Swift +Thomas Tanaka +Thomas Texier +Ti Zhou +Tianon Gravi +Tianyi Wang +Tibor Vass +Tiffany Jernigan +Tiffany Low +Tim Bart +Tim Bosse +Tim Dettrick +Tim Düsterhus +Tim Hockin +Tim Potter +Tim Ruffles +Tim Smith +Tim Terhorst +Tim Wang +Tim Waugh +Tim Wraight +Tim Zju <21651152@zju.edu.cn> +timfeirg +Timothy Hobbs +tjwebb123 +tobe +Tobias Bieniek +Tobias Bradtke +Tobias Gesellchen +Tobias Klauser +Tobias Munk +Tobias Schmidt +Tobias Schwab +Todd Crane +Todd Lunter +Todd Whiteman +Toli Kuznets +Tom Barlow +Tom Booth +Tom Denham +Tom Fotherby +Tom Howe +Tom Hulihan +Tom Maaswinkel +Tom Sweeney +Tom Wilkie +Tom X. Tobin +Tomas Tomecek +Tomasz Kopczynski +Tomasz Lipinski +Tomasz Nurkiewicz +Tommaso Visconti +Tomáš Hrčka +Tonny Xu +Tony Abboud +Tony Daws +Tony Miller +toogley +Torstein Husebø +Tõnis Tiigi +tpng +tracylihui <793912329@qq.com> +Trapier Marshall +Travis Cline +Travis Thieman +Trent Ogren +Trevor +Trevor Pounds +Trevor Sullivan +Trishna Guha +Tristan Carel +Troy Denton +Tycho Andersen +Tyler Brock +Tyler Brown +Tzu-Jung Lee +uhayate +Ulysse Carion +Umesh Yadav +Utz Bacher +vagrant +Vaidas Jablonskis +vanderliang +Veres Lajos +Victor Algaze +Victor Coisne +Victor Costan +Victor I. Wood +Victor Lyuboslavsky +Victor Marmol +Victor Palma +Victor Vieux +Victoria Bialas +Vijaya Kumar K +Viktor Stanchev +Viktor Vojnovski +VinayRaghavanKS +Vincent Batts +Vincent Bernat +Vincent Demeester +Vincent Giersch +Vincent Mayers +Vincent Woo +Vinod Kulkarni +Vishal Doshi +Vishnu Kannan +Vitaly Ostrosablin +Vitor Monteiro +Vivek Agarwal +Vivek Dasgupta +Vivek Goyal +Vladimir Bulyga +Vladimir Kirillov +Vladimir Pouzanov +Vladimir Rutsky +Vladimir Varankin +VladimirAus +Vlastimil Zeman +Vojtech Vitek (V-Teq) +waitingkuo +Walter Leibbrandt +Walter Stanish +Wang Chao +Wang Guoliang +Wang Jie +Wang Long +Wang Ping +Wang Xing +Wang Yuexiao +Ward Vandewege +WarheadsSE +Wassim Dhif +Wayne Chang +Wayne Song +Weerasak Chongnguluam +Wei Fu +Wei Wu +Wei-Ting Kuo +weipeng +weiyan +Weiyang Zhu +Wen Cheng Ma +Wendel Fleming +Wenjun Tang +Wenkai Yin +Wentao Zhang +Wenxuan Zhao +Wenyu You <21551128@zju.edu.cn> +Wenzhi Liang +Wes Morgan +Wewang Xiaorenfine +Will Dietz +Will Rouesnel +Will Weaver +willhf +William Delanoue +William Henry +William Hubbs +William Martin +William Riancho +William Thurston +WiseTrem +Wolfgang Powisch +Wonjun Kim +xamyzhao +Xian Chaobo +Xianglin Gao +Xianlu Bird +Xiao YongBiao +XiaoBing Jiang +Xiaodong Zhang +Xiaoxi He +Xiaoxu Chen +Xiaoyu Zhang +xichengliudui <1693291525@qq.com> +xiekeyang +Ximo Guanter Gonzálbez +Xinbo Weng +Xinzi Zhou +Xiuming Chen +Xuecong Liao +xuzhaokui +Yadnyawalkya Tale +Yahya +YAMADA Tsuyoshi +Yamasaki Masahide +Yan Feng +Yang Bai +Yang Pengfei +yangchenliang +Yanqiang Miao +Yao Zaiyong +Yassine Tijani +Yasunori Mahata +Yazhong Liu +Yestin Sun +Yi EungJun +Yibai Zhang +Yihang Ho +Ying Li +Yohei Ueda +Yong Tang +Yongxin Li +Yongzhi Pan +Yosef Fertel +You-Sheng Yang (楊有勝) +Youcef YEKHLEF +Yu Changchun +Yu Chengxia +Yu Peng +Yu-Ju Hong +Yuan Sun +Yuanhong Peng +Yue Zhang +Yuhao Fang +Yuichiro Kaneko +Yunxiang Huang +Yurii Rashkovskii +Yusuf Tarık Günaydın +Yves Junqueira +Zac Dover +Zach Borboa +Zachary Jaffee +Zain Memon +Zaiste! +Zane DeGraffenried +Zefan Li +Zen Lin(Zhinan Lin) +Zhang Kun +Zhang Wei +Zhang Wentao +ZhangHang +zhangxianwei +Zhenan Ye <21551168@zju.edu.cn> +zhenghenghuo +Zhenhai Gao +Zhenkun Bi +Zhou Hao +Zhoulin Xie +Zhu Guihua +Zhu Kunjia +Zhuoyun Wei +Zilin Du +zimbatm +Ziming Dong +ZJUshuaizhou <21551191@zju.edu.cn> +zmarouf +Zoltan Tombol +Zou Yu +zqh +Zuhayr Elahi +Zunayed Ali +Álex González +Álvaro Lázaro +Átila Camurça Alves +尹吉峰 +徐俊杰 +慕陶 +搏通 +黄艳红00139573 diff --git a/vendor/github.com/docker/engine/LICENSE b/vendor/github.com/docker/engine/LICENSE new file mode 100644 index 0000000..6d8d58f --- /dev/null +++ b/vendor/github.com/docker/engine/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2013-2018 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/docker/engine/NOTICE b/vendor/github.com/docker/engine/NOTICE new file mode 100644 index 0000000..0c74e15 --- /dev/null +++ b/vendor/github.com/docker/engine/NOTICE @@ -0,0 +1,19 @@ +Docker +Copyright 2012-2017 Docker, Inc. + +This product includes software developed at Docker, Inc. (https://www.docker.com). + +This product contains software (https://github.com/kr/pty) developed +by Keith Rarick, licensed under the MIT License. + +The following is courtesy of our legal counsel: + + +Use and transfer of Docker may be subject to certain restrictions by the +United States and other governments. +It is your responsibility to ensure that your use and/or transfer does not +violate applicable laws. + +For more information, please see https://www.bis.doc.gov + +See also https://www.apache.org/dev/crypto.html and/or seek legal counsel. diff --git a/vendor/github.com/docker/engine/pkg/fileutils/fileutils.go b/vendor/github.com/docker/engine/pkg/fileutils/fileutils.go new file mode 100644 index 0000000..34f1c72 --- /dev/null +++ b/vendor/github.com/docker/engine/pkg/fileutils/fileutils.go @@ -0,0 +1,298 @@ +package fileutils // import "github.com/docker/docker/pkg/fileutils" + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "regexp" + "strings" + "text/scanner" + + "github.com/sirupsen/logrus" +) + +// PatternMatcher allows checking paths against a list of patterns +type PatternMatcher struct { + patterns []*Pattern + exclusions bool +} + +// NewPatternMatcher creates a new matcher object for specific patterns that can +// be used later to match against patterns against paths +func NewPatternMatcher(patterns []string) (*PatternMatcher, error) { + pm := &PatternMatcher{ + patterns: make([]*Pattern, 0, len(patterns)), + } + for _, p := range patterns { + // Eliminate leading and trailing whitespace. + p = strings.TrimSpace(p) + if p == "" { + continue + } + p = filepath.Clean(p) + newp := &Pattern{} + if p[0] == '!' { + if len(p) == 1 { + return nil, errors.New("illegal exclusion pattern: \"!\"") + } + newp.exclusion = true + p = p[1:] + pm.exclusions = true + } + // Do some syntax checking on the pattern. + // filepath's Match() has some really weird rules that are inconsistent + // so instead of trying to dup their logic, just call Match() for its + // error state and if there is an error in the pattern return it. + // If this becomes an issue we can remove this since its really only + // needed in the error (syntax) case - which isn't really critical. + if _, err := filepath.Match(p, "."); err != nil { + return nil, err + } + newp.cleanedPattern = p + newp.dirs = strings.Split(p, string(os.PathSeparator)) + pm.patterns = append(pm.patterns, newp) + } + return pm, nil +} + +// Matches matches path against all the patterns. Matches is not safe to be +// called concurrently +func (pm *PatternMatcher) Matches(file string) (bool, error) { + matched := false + file = filepath.FromSlash(file) + parentPath := filepath.Dir(file) + parentPathDirs := strings.Split(parentPath, string(os.PathSeparator)) + + for _, pattern := range pm.patterns { + negative := false + + if pattern.exclusion { + negative = true + } + + match, err := pattern.match(file) + if err != nil { + return false, err + } + + if !match && parentPath != "." { + // Check to see if the pattern matches one of our parent dirs. + if len(pattern.dirs) <= len(parentPathDirs) { + match, _ = pattern.match(strings.Join(parentPathDirs[:len(pattern.dirs)], string(os.PathSeparator))) + } + } + + if match { + matched = !negative + } + } + + if matched { + logrus.Debugf("Skipping excluded path: %s", file) + } + + return matched, nil +} + +// Exclusions returns true if any of the patterns define exclusions +func (pm *PatternMatcher) Exclusions() bool { + return pm.exclusions +} + +// Patterns returns array of active patterns +func (pm *PatternMatcher) Patterns() []*Pattern { + return pm.patterns +} + +// Pattern defines a single regexp used to filter file paths. +type Pattern struct { + cleanedPattern string + dirs []string + regexp *regexp.Regexp + exclusion bool +} + +func (p *Pattern) String() string { + return p.cleanedPattern +} + +// Exclusion returns true if this pattern defines exclusion +func (p *Pattern) Exclusion() bool { + return p.exclusion +} + +func (p *Pattern) match(path string) (bool, error) { + + if p.regexp == nil { + if err := p.compile(); err != nil { + return false, filepath.ErrBadPattern + } + } + + b := p.regexp.MatchString(path) + + return b, nil +} + +func (p *Pattern) compile() error { + regStr := "^" + pattern := p.cleanedPattern + // Go through the pattern and convert it to a regexp. + // We use a scanner so we can support utf-8 chars. + var scan scanner.Scanner + scan.Init(strings.NewReader(pattern)) + + sl := string(os.PathSeparator) + escSL := sl + if sl == `\` { + escSL += `\` + } + + for scan.Peek() != scanner.EOF { + ch := scan.Next() + + if ch == '*' { + if scan.Peek() == '*' { + // is some flavor of "**" + scan.Next() + + // Treat **/ as ** so eat the "/" + if string(scan.Peek()) == sl { + scan.Next() + } + + if scan.Peek() == scanner.EOF { + // is "**EOF" - to align with .gitignore just accept all + regStr += ".*" + } else { + // is "**" + // Note that this allows for any # of /'s (even 0) because + // the .* will eat everything, even /'s + regStr += "(.*" + escSL + ")?" + } + } else { + // is "*" so map it to anything but "/" + regStr += "[^" + escSL + "]*" + } + } else if ch == '?' { + // "?" is any char except "/" + regStr += "[^" + escSL + "]" + } else if ch == '.' || ch == '$' { + // Escape some regexp special chars that have no meaning + // in golang's filepath.Match + regStr += `\` + string(ch) + } else if ch == '\\' { + // escape next char. Note that a trailing \ in the pattern + // will be left alone (but need to escape it) + if sl == `\` { + // On windows map "\" to "\\", meaning an escaped backslash, + // and then just continue because filepath.Match on + // Windows doesn't allow escaping at all + regStr += escSL + continue + } + if scan.Peek() != scanner.EOF { + regStr += `\` + string(scan.Next()) + } else { + regStr += `\` + } + } else { + regStr += string(ch) + } + } + + regStr += "$" + + re, err := regexp.Compile(regStr) + if err != nil { + return err + } + + p.regexp = re + return nil +} + +// Matches returns true if file matches any of the patterns +// and isn't excluded by any of the subsequent patterns. +func Matches(file string, patterns []string) (bool, error) { + pm, err := NewPatternMatcher(patterns) + if err != nil { + return false, err + } + file = filepath.Clean(file) + + if file == "." { + // Don't let them exclude everything, kind of silly. + return false, nil + } + + return pm.Matches(file) +} + +// CopyFile copies from src to dst until either EOF is reached +// on src or an error occurs. It verifies src exists and removes +// the dst if it exists. +func CopyFile(src, dst string) (int64, error) { + cleanSrc := filepath.Clean(src) + cleanDst := filepath.Clean(dst) + if cleanSrc == cleanDst { + return 0, nil + } + sf, err := os.Open(cleanSrc) + if err != nil { + return 0, err + } + defer sf.Close() + if err := os.Remove(cleanDst); err != nil && !os.IsNotExist(err) { + return 0, err + } + df, err := os.Create(cleanDst) + if err != nil { + return 0, err + } + defer df.Close() + return io.Copy(df, sf) +} + +// ReadSymlinkedDirectory returns the target directory of a symlink. +// The target of the symbolic link may not be a file. +func ReadSymlinkedDirectory(path string) (string, error) { + var realPath string + var err error + if realPath, err = filepath.Abs(path); err != nil { + return "", fmt.Errorf("unable to get absolute path for %s: %s", path, err) + } + if realPath, err = filepath.EvalSymlinks(realPath); err != nil { + return "", fmt.Errorf("failed to canonicalise path for %s: %s", path, err) + } + realPathInfo, err := os.Stat(realPath) + if err != nil { + return "", fmt.Errorf("failed to stat target '%s' of '%s': %s", realPath, path, err) + } + if !realPathInfo.Mode().IsDir() { + return "", fmt.Errorf("canonical path points to a file '%s'", realPath) + } + return realPath, nil +} + +// CreateIfNotExists creates a file or a directory only if it does not already exist. +func CreateIfNotExists(path string, isDir bool) error { + if _, err := os.Stat(path); err != nil { + if os.IsNotExist(err) { + if isDir { + return os.MkdirAll(path, 0755) + } + if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { + return err + } + f, err := os.OpenFile(path, os.O_CREATE, 0755) + if err != nil { + return err + } + f.Close() + } + } + return nil +} diff --git a/vendor/github.com/docker/engine/pkg/fileutils/fileutils_darwin.go b/vendor/github.com/docker/engine/pkg/fileutils/fileutils_darwin.go new file mode 100644 index 0000000..e40cc27 --- /dev/null +++ b/vendor/github.com/docker/engine/pkg/fileutils/fileutils_darwin.go @@ -0,0 +1,27 @@ +package fileutils // import "github.com/docker/docker/pkg/fileutils" + +import ( + "os" + "os/exec" + "strconv" + "strings" +) + +// GetTotalUsedFds returns the number of used File Descriptors by +// executing `lsof -p PID` +func GetTotalUsedFds() int { + pid := os.Getpid() + + cmd := exec.Command("lsof", "-p", strconv.Itoa(pid)) + + output, err := cmd.CombinedOutput() + if err != nil { + return -1 + } + + outputStr := strings.TrimSpace(string(output)) + + fds := strings.Split(outputStr, "\n") + + return len(fds) - 1 +} diff --git a/vendor/github.com/docker/engine/pkg/fileutils/fileutils_unix.go b/vendor/github.com/docker/engine/pkg/fileutils/fileutils_unix.go new file mode 100644 index 0000000..565396f --- /dev/null +++ b/vendor/github.com/docker/engine/pkg/fileutils/fileutils_unix.go @@ -0,0 +1,22 @@ +// +build linux freebsd + +package fileutils // import "github.com/docker/docker/pkg/fileutils" + +import ( + "fmt" + "io/ioutil" + "os" + + "github.com/sirupsen/logrus" +) + +// GetTotalUsedFds Returns the number of used File Descriptors by +// reading it via /proc filesystem. +func GetTotalUsedFds() int { + if fds, err := ioutil.ReadDir(fmt.Sprintf("/proc/%d/fd", os.Getpid())); err != nil { + logrus.Errorf("Error opening /proc/%d/fd: %s", os.Getpid(), err) + } else { + return len(fds) + } + return -1 +} diff --git a/vendor/github.com/docker/engine/pkg/fileutils/fileutils_windows.go b/vendor/github.com/docker/engine/pkg/fileutils/fileutils_windows.go new file mode 100644 index 0000000..3f1ebb6 --- /dev/null +++ b/vendor/github.com/docker/engine/pkg/fileutils/fileutils_windows.go @@ -0,0 +1,7 @@ +package fileutils // import "github.com/docker/docker/pkg/fileutils" + +// GetTotalUsedFds Returns the number of used File Descriptors. Not supported +// on Windows. +func GetTotalUsedFds() int { + return -1 +} diff --git a/vendor/github.com/inconshreveable/go-update/LICENSE b/vendor/github.com/inconshreveable/go-update/LICENSE new file mode 100644 index 0000000..418a5d1 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/LICENSE @@ -0,0 +1,13 @@ +Copyright 2015 Alan Shreve + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/github.com/inconshreveable/go-update/README.md b/vendor/github.com/inconshreveable/go-update/README.md new file mode 100644 index 0000000..438ffd4 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/README.md @@ -0,0 +1,65 @@ +# go-update: Build self-updating Go programs [![godoc reference](https://godoc.org/github.com/inconshreveable/go-update?status.png)](https://godoc.org/github.com/inconshreveable/go-update) + +Package update provides functionality to implement secure, self-updating Go programs (or other single-file targets) +A program can update itself by replacing its executable file with a new version. + +It provides the flexibility to implement different updating user experiences +like auto-updating, or manual user-initiated updates. It also boasts +advanced features like binary patching and code signing verification. + +Example of updating from a URL: + +```go +import ( + "fmt" + "net/http" + + "github.com/inconshreveable/go-update" +) + +func doUpdate(url string) error { + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + err := update.Apply(resp.Body, update.Options{}) + if err != nil { + // error handling + } + return err +} +``` + +## Features + +- Cross platform support (Windows too!) +- Binary patch application +- Checksum verification +- Code signing verification +- Support for updating arbitrary files + +## [equinox.io](https://equinox.io) +[equinox.io](https://equinox.io) is a complete ready-to-go updating solution built on top of go-update that provides: + +- Hosted updates +- Update channels (stable, beta, nightly, ...) +- Dynamically computed binary diffs +- Automatic key generation and code +- Release tooling with proper code signing +- Update/download metrics + +## API Compatibility Promises +The master branch of `go-update` is *not* guaranteed to have a stable API over time. For any production application, you should vendor +your dependency on `go-update` with a tool like git submodules, [gb](http://getgb.io/) or [govendor](https://github.com/kardianos/govendor). + +The `go-update` package makes the following promises about API compatibility: +1. A list of all API-breaking changes will be documented in this README. +1. `go-update` will strive for as few API-breaking changes as possible. + +## API Breaking Changes +- **Sept 3, 2015**: The `Options` struct passed to `Apply` was changed to be passed by value instead of passed by pointer. Old API at `28de026`. +- **Aug 9, 2015**: 2.0 API. Old API at `221d034` or `gopkg.in/inconshreveable/go-update.v0`. + +## License +Apache diff --git a/vendor/github.com/inconshreveable/go-update/apply.go b/vendor/github.com/inconshreveable/go-update/apply.go new file mode 100644 index 0000000..b26dae1 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/apply.go @@ -0,0 +1,322 @@ +package update + +import ( + "bytes" + "crypto" + "crypto/x509" + "encoding/pem" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + + "github.com/inconshreveable/go-update/internal/osext" +) + +var ( + openFile = os.OpenFile +) + +// Apply performs an update of the current executable (or opts.TargetFile, if set) with the contents of the given io.Reader. +// +// Apply performs the following actions to ensure a safe cross-platform update: +// +// 1. If configured, applies the contents of the update io.Reader as a binary patch. +// +// 2. If configured, computes the checksum of the new executable and verifies it matches. +// +// 3. If configured, verifies the signature with a public key. +// +// 4. Creates a new file, /path/to/.target.new with the TargetMode with the contents of the updated file +// +// 5. Renames /path/to/target to /path/to/.target.old +// +// 6. Renames /path/to/.target.new to /path/to/target +// +// 7. If the final rename is successful, deletes /path/to/.target.old, returns no error. On Windows, +// the removal of /path/to/target.old always fails, so instead Apply hides the old file instead. +// +// 8. If the final rename fails, attempts to roll back by renaming /path/to/.target.old +// back to /path/to/target. +// +// If the roll back operation fails, the file system is left in an inconsistent state (betweet steps 5 and 6) where +// there is no new executable file and the old executable file could not be be moved to its original location. In this +// case you should notify the user of the bad news and ask them to recover manually. Applications can determine whether +// the rollback failed by calling RollbackError, see the documentation on that function for additional detail. +func Apply(update io.Reader, opts Options) error { + // validate + verify := false + switch { + case opts.Signature != nil && opts.PublicKey != nil: + // okay + verify = true + case opts.Signature != nil: + return errors.New("no public key to verify signature with") + case opts.PublicKey != nil: + return errors.New("No signature to verify with") + } + + // set defaults + if opts.Hash == 0 { + opts.Hash = crypto.SHA256 + } + if opts.Verifier == nil { + opts.Verifier = NewECDSAVerifier() + } + if opts.TargetMode == 0 { + opts.TargetMode = 0755 + } + + // get target path + var err error + opts.TargetPath, err = opts.getPath() + if err != nil { + return err + } + + var newBytes []byte + if opts.Patcher != nil { + if newBytes, err = opts.applyPatch(update); err != nil { + return err + } + } else { + // no patch to apply, go on through + if newBytes, err = ioutil.ReadAll(update); err != nil { + return err + } + } + + // verify checksum if requested + if opts.Checksum != nil { + if err = opts.verifyChecksum(newBytes); err != nil { + return err + } + } + + if verify { + if err = opts.verifySignature(newBytes); err != nil { + return err + } + } + + // get the directory the executable exists in + updateDir := filepath.Dir(opts.TargetPath) + filename := filepath.Base(opts.TargetPath) + + // Copy the contents of newbinary to a new executable file + newPath := filepath.Join(updateDir, fmt.Sprintf(".%s.new", filename)) + fp, err := openFile(newPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, opts.TargetMode) + if err != nil { + return err + } + defer fp.Close() + + _, err = io.Copy(fp, bytes.NewReader(newBytes)) + if err != nil { + return err + } + + // if we don't call fp.Close(), windows won't let us move the new executable + // because the file will still be "in use" + fp.Close() + + // this is where we'll move the executable to so that we can swap in the updated replacement + oldPath := opts.OldSavePath + removeOld := opts.OldSavePath == "" + if removeOld { + oldPath = filepath.Join(updateDir, fmt.Sprintf(".%s.old", filename)) + } + + // delete any existing old exec file - this is necessary on Windows for two reasons: + // 1. after a successful update, Windows can't remove the .old file because the process is still running + // 2. windows rename operations fail if the destination file already exists + _ = os.Remove(oldPath) + + // move the existing executable to a new file in the same directory + err = os.Rename(opts.TargetPath, oldPath) + if err != nil { + return err + } + + // move the new exectuable in to become the new program + err = os.Rename(newPath, opts.TargetPath) + + if err != nil { + // move unsuccessful + // + // The filesystem is now in a bad state. We have successfully + // moved the existing binary to a new location, but we couldn't move the new + // binary to take its place. That means there is no file where the current executable binary + // used to be! + // Try to rollback by restoring the old binary to its original path. + rerr := os.Rename(oldPath, opts.TargetPath) + if rerr != nil { + return &rollbackErr{err, rerr} + } + + return err + } + + // move successful, remove the old binary if needed + if removeOld { + errRemove := os.Remove(oldPath) + + // windows has trouble with removing old binaries, so hide it instead + if errRemove != nil { + _ = hideFile(oldPath) + } + } + + return nil +} + +// RollbackError takes an error value returned by Apply and returns the error, if any, +// that occurred when attempting to roll back from a failed update. Applications should +// always call this function on any non-nil errors returned by Apply. +// +// If no rollback was needed or if the rollback was successful, RollbackError returns nil, +// otherwise it returns the error encountered when trying to roll back. +func RollbackError(err error) error { + if err == nil { + return nil + } + if rerr, ok := err.(*rollbackErr); ok { + return rerr.rollbackErr + } + return nil +} + +type rollbackErr struct { + error // original error + rollbackErr error // error encountered while rolling back +} + +type Options struct { + // TargetPath defines the path to the file to update. + // The emptry string means 'the executable file of the running program'. + TargetPath string + + // Create TargetPath replacement with this file mode. If zero, defaults to 0755. + TargetMode os.FileMode + + // Checksum of the new binary to verify against. If nil, no checksum or signature verification is done. + Checksum []byte + + // Public key to use for signature verification. If nil, no signature verification is done. + PublicKey crypto.PublicKey + + // Signature to verify the updated file. If nil, no signature verification is done. + Signature []byte + + // Pluggable signature verification algorithm. If nil, ECDSA is used. + Verifier Verifier + + // Use this hash function to generate the checksum. If not set, SHA256 is used. + Hash crypto.Hash + + // If nil, treat the update as a complete replacement for the contents of the file at TargetPath. + // If non-nil, treat the update contents as a patch and use this object to apply the patch. + Patcher Patcher + + // Store the old executable file at this path after a successful update. + // The empty string means the old executable file will be removed after the update. + OldSavePath string +} + +// CheckPermissions determines whether the process has the correct permissions to +// perform the requested update. If the update can proceed, it returns nil, otherwise +// it returns the error that would occur if an update were attempted. +func (o *Options) CheckPermissions() error { + // get the directory the file exists in + path, err := o.getPath() + if err != nil { + return err + } + + fileDir := filepath.Dir(path) + fileName := filepath.Base(path) + + // attempt to open a file in the file's directory + newPath := filepath.Join(fileDir, fmt.Sprintf(".%s.new", fileName)) + fp, err := openFile(newPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, o.TargetMode) + if err != nil { + return err + } + fp.Close() + + _ = os.Remove(newPath) + return nil +} + +// SetPublicKeyPEM is a convenience method to set the PublicKey property +// used for checking a completed update's signature by parsing a +// Public Key formatted as PEM data. +func (o *Options) SetPublicKeyPEM(pembytes []byte) error { + block, _ := pem.Decode(pembytes) + if block == nil { + return errors.New("couldn't parse PEM data") + } + + pub, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return err + } + o.PublicKey = pub + return nil +} + +func (o *Options) getPath() (string, error) { + if o.TargetPath == "" { + return osext.Executable() + } else { + return o.TargetPath, nil + } +} + +func (o *Options) applyPatch(patch io.Reader) ([]byte, error) { + // open the file to patch + old, err := os.Open(o.TargetPath) + if err != nil { + return nil, err + } + defer old.Close() + + // apply the patch + var applied bytes.Buffer + if err = o.Patcher.Patch(old, &applied, patch); err != nil { + return nil, err + } + + return applied.Bytes(), nil +} + +func (o *Options) verifyChecksum(updated []byte) error { + checksum, err := checksumFor(o.Hash, updated) + if err != nil { + return err + } + + if !bytes.Equal(o.Checksum, checksum) { + return fmt.Errorf("Updated file has wrong checksum. Expected: %x, got: %x", o.Checksum, checksum) + } + return nil +} + +func (o *Options) verifySignature(updated []byte) error { + checksum, err := checksumFor(o.Hash, updated) + if err != nil { + return err + } + return o.Verifier.VerifySignature(checksum, o.Signature, o.Hash, o.PublicKey) +} + +func checksumFor(h crypto.Hash, payload []byte) ([]byte, error) { + if !h.Available() { + return nil, errors.New("requested hash function not available") + } + hash := h.New() + hash.Write(payload) // guaranteed not to error + return hash.Sum([]byte{}), nil +} diff --git a/vendor/github.com/inconshreveable/go-update/doc.go b/vendor/github.com/inconshreveable/go-update/doc.go new file mode 100644 index 0000000..468411f --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/doc.go @@ -0,0 +1,172 @@ +/* +Package update provides functionality to implement secure, self-updating Go programs (or other single-file targets). + +For complete updating solutions please see Equinox (https://equinox.io) and go-tuf (https://github.com/flynn/go-tuf). + +Basic Example + +This example shows how to update a program remotely from a URL. + + import ( + "fmt" + "net/http" + + "github.com/inconshreveable/go-update" + ) + + func doUpdate(url string) error { + // request the new file + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + err := update.Apply(resp.Body, update.Options{}) + if err != nil { + if rerr := update.RollbackError(err); rerr != nil { + fmt.Println("Failed to rollback from bad update: %v", rerr) + } + } + return err + } + + +Binary Patching + +Go binaries can often be large. It can be advantageous to only ship a binary patch to a client +instead of the complete program text of a new version. + +This example shows how to update a program with a bsdiff binary patch. Other patch formats +may be applied by implementing the Patcher interface. + + import ( + "encoding/hex" + "io" + + "github.com/inconshreveable/go-update" + ) + + func updateWithPatch(patch io.Reader) error { + err := update.Apply(patch, update.Options{ + Patcher: update.NewBSDiffPatcher() + }) + if err != nil { + // error handling + } + return err + } + +Checksum Verification + +Updating executable code on a computer can be a dangerous operation unless you +take the appropriate steps to guarantee the authenticity of the new code. While +checksum verification is important, it should always be combined with signature +verification (next section) to guarantee that the code came from a trusted party. + +go-update validates SHA256 checksums by default, but this is pluggable via the Hash +property on the Options struct. + +This example shows how to guarantee that the newly-updated binary is verified to +have an appropriate checksum (that was otherwise retrived via a secure channel) +specified as a hex string. + + import ( + "crypto" + _ "crypto/sha256" + "encoding/hex" + "io" + + "github.com/inconshreveable/go-update" + ) + + func updateWithChecksum(binary io.Reader, hexChecksum string) error { + checksum, err := hex.DecodeString(hexChecksum) + if err != nil { + return err + } + err = update.Apply(binary, update.Options{ + Hash: crypto.SHA256, // this is the default, you don't need to specify it + Checksum: checksum, + }) + if err != nil { + // error handling + } + return err + } + +Cryptographic Signature Verification + +Cryptographic verification of new code from an update is an extremely important way to guarantee the +security and integrity of your updates. + +Verification is performed by validating the signature of a hash of the new file. This +means nothing changes if you apply your update with a patch. + +This example shows how to add signature verification to your updates. To make all of this work +an application distributor must first create a public/private key pair and embed the public key +into their application. When they issue a new release, the issuer must sign the new executable file +with the private key and distribute the signature along with the update. + + import ( + "crypto" + _ "crypto/sha256" + "encoding/hex" + "io" + + "github.com/inconshreveable/go-update" + ) + + var publicKey = []byte(` + -----BEGIN PUBLIC KEY----- + MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtrVmBxQvheRArXjg2vG1xIprWGuCyESx + MMY8pjmjepSy2kuz+nl9aFLqmr+rDNdYvEBqQaZrYMc6k29gjvoQnQ== + -----END PUBLIC KEY----- + `) + + func verifiedUpdate(binary io.Reader, hexChecksum, hexSignature string) { + checksum, err := hex.DecodeString(hexChecksum) + if err != nil { + return err + } + signature, err := hex.DecodeString(hexSignature) + if err != nil { + return err + } + opts := update.Options{ + Checksum: checksum, + Signature: signature, + Hash: crypto.SHA256, // this is the default, you don't need to specify it + Verifier: update.NewECDSAVerifier(), // this is the default, you don't need to specify it + } + err = opts.SetPublicKeyPEM(publicKey) + if err != nil { + return err + } + err = update.Apply(binary, opts) + if err != nil { + // error handling + } + return err + } + + +Building Single-File Go Binaries + +In order to update a Go application with go-update, you must distributed it as a single executable. +This is often easy, but some applications require static assets (like HTML and CSS asset files or TLS certificates). +In order to update applications like these, you'll want to make sure to embed those asset files into +the distributed binary with a tool like go-bindata (my favorite): https://github.com/jteeuwen/go-bindata + +Non-Goals + +Mechanisms and protocols for determining whether an update should be applied and, if so, which one are +out of scope for this package. Please consult go-tuf (https://github.com/flynn/go-tuf) or Equinox (https://equinox.io) +for more complete solutions. + +go-update only works for self-updating applications that are distributed as a single binary, i.e. +applications that do not have additional assets or dependency files. +Updating application that are distributed as mutliple on-disk files is out of scope, although this +may change in future versions of this library. + +*/ +package update diff --git a/vendor/github.com/inconshreveable/go-update/hide_noop.go b/vendor/github.com/inconshreveable/go-update/hide_noop.go new file mode 100644 index 0000000..3707756 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/hide_noop.go @@ -0,0 +1,7 @@ +// +build !windows + +package update + +func hideFile(path string) error { + return nil +} diff --git a/vendor/github.com/inconshreveable/go-update/hide_windows.go b/vendor/github.com/inconshreveable/go-update/hide_windows.go new file mode 100644 index 0000000..c368b9c --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/hide_windows.go @@ -0,0 +1,19 @@ +package update + +import ( + "syscall" + "unsafe" +) + +func hideFile(path string) error { + kernel32 := syscall.NewLazyDLL("kernel32.dll") + setFileAttributes := kernel32.NewProc("SetFileAttributesW") + + r1, _, err := setFileAttributes.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(path))), 2) + + if r1 == 0 { + return err + } else { + return nil + } +} diff --git a/vendor/github.com/inconshreveable/go-update/internal/binarydist/License b/vendor/github.com/inconshreveable/go-update/internal/binarydist/License new file mode 100644 index 0000000..183c389 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/binarydist/License @@ -0,0 +1,22 @@ +Copyright 2012 Keith Rarick + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/inconshreveable/go-update/internal/binarydist/Readme.md b/vendor/github.com/inconshreveable/go-update/internal/binarydist/Readme.md new file mode 100644 index 0000000..dadc368 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/binarydist/Readme.md @@ -0,0 +1,7 @@ +# binarydist + +Package binarydist implements binary diff and patch as described on +. It reads and writes files +compatible with the tools there. + +Documentation at . diff --git a/vendor/github.com/inconshreveable/go-update/internal/binarydist/bzip2.go b/vendor/github.com/inconshreveable/go-update/internal/binarydist/bzip2.go new file mode 100644 index 0000000..a2516b8 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/binarydist/bzip2.go @@ -0,0 +1,40 @@ +package binarydist + +import ( + "io" + "os/exec" +) + +type bzip2Writer struct { + c *exec.Cmd + w io.WriteCloser +} + +func (w bzip2Writer) Write(b []byte) (int, error) { + return w.w.Write(b) +} + +func (w bzip2Writer) Close() error { + if err := w.w.Close(); err != nil { + return err + } + return w.c.Wait() +} + +// Package compress/bzip2 implements only decompression, +// so we'll fake it by running bzip2 in another process. +func newBzip2Writer(w io.Writer) (wc io.WriteCloser, err error) { + var bw bzip2Writer + bw.c = exec.Command("bzip2", "-c") + bw.c.Stdout = w + + if bw.w, err = bw.c.StdinPipe(); err != nil { + return nil, err + } + + if err = bw.c.Start(); err != nil { + return nil, err + } + + return bw, nil +} diff --git a/vendor/github.com/inconshreveable/go-update/internal/binarydist/diff.go b/vendor/github.com/inconshreveable/go-update/internal/binarydist/diff.go new file mode 100644 index 0000000..1d2d951 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/binarydist/diff.go @@ -0,0 +1,408 @@ +package binarydist + +import ( + "bytes" + "encoding/binary" + "io" + "io/ioutil" +) + +func swap(a []int, i, j int) { a[i], a[j] = a[j], a[i] } + +func split(I, V []int, start, length, h int) { + var i, j, k, x, jj, kk int + + if length < 16 { + for k = start; k < start+length; k += j { + j = 1 + x = V[I[k]+h] + for i = 1; k+i < start+length; i++ { + if V[I[k+i]+h] < x { + x = V[I[k+i]+h] + j = 0 + } + if V[I[k+i]+h] == x { + swap(I, k+i, k+j) + j++ + } + } + for i = 0; i < j; i++ { + V[I[k+i]] = k + j - 1 + } + if j == 1 { + I[k] = -1 + } + } + return + } + + x = V[I[start+length/2]+h] + jj = 0 + kk = 0 + for i = start; i < start+length; i++ { + if V[I[i]+h] < x { + jj++ + } + if V[I[i]+h] == x { + kk++ + } + } + jj += start + kk += jj + + i = start + j = 0 + k = 0 + for i < jj { + if V[I[i]+h] < x { + i++ + } else if V[I[i]+h] == x { + swap(I, i, jj+j) + j++ + } else { + swap(I, i, kk+k) + k++ + } + } + + for jj+j < kk { + if V[I[jj+j]+h] == x { + j++ + } else { + swap(I, jj+j, kk+k) + k++ + } + } + + if jj > start { + split(I, V, start, jj-start, h) + } + + for i = 0; i < kk-jj; i++ { + V[I[jj+i]] = kk - 1 + } + if jj == kk-1 { + I[jj] = -1 + } + + if start+length > kk { + split(I, V, kk, start+length-kk, h) + } +} + +func qsufsort(obuf []byte) []int { + var buckets [256]int + var i, h int + I := make([]int, len(obuf)+1) + V := make([]int, len(obuf)+1) + + for _, c := range obuf { + buckets[c]++ + } + for i = 1; i < 256; i++ { + buckets[i] += buckets[i-1] + } + copy(buckets[1:], buckets[:]) + buckets[0] = 0 + + for i, c := range obuf { + buckets[c]++ + I[buckets[c]] = i + } + + I[0] = len(obuf) + for i, c := range obuf { + V[i] = buckets[c] + } + + V[len(obuf)] = 0 + for i = 1; i < 256; i++ { + if buckets[i] == buckets[i-1]+1 { + I[buckets[i]] = -1 + } + } + I[0] = -1 + + for h = 1; I[0] != -(len(obuf) + 1); h += h { + var n int + for i = 0; i < len(obuf)+1; { + if I[i] < 0 { + n -= I[i] + i -= I[i] + } else { + if n != 0 { + I[i-n] = -n + } + n = V[I[i]] + 1 - i + split(I, V, i, n, h) + i += n + n = 0 + } + } + if n != 0 { + I[i-n] = -n + } + } + + for i = 0; i < len(obuf)+1; i++ { + I[V[i]] = i + } + return I +} + +func matchlen(a, b []byte) (i int) { + for i < len(a) && i < len(b) && a[i] == b[i] { + i++ + } + return i +} + +func search(I []int, obuf, nbuf []byte, st, en int) (pos, n int) { + if en-st < 2 { + x := matchlen(obuf[I[st]:], nbuf) + y := matchlen(obuf[I[en]:], nbuf) + + if x > y { + return I[st], x + } else { + return I[en], y + } + } + + x := st + (en-st)/2 + if bytes.Compare(obuf[I[x]:], nbuf) < 0 { + return search(I, obuf, nbuf, x, en) + } else { + return search(I, obuf, nbuf, st, x) + } + panic("unreached") +} + +// Diff computes the difference between old and new, according to the bsdiff +// algorithm, and writes the result to patch. +func Diff(old, new io.Reader, patch io.Writer) error { + obuf, err := ioutil.ReadAll(old) + if err != nil { + return err + } + + nbuf, err := ioutil.ReadAll(new) + if err != nil { + return err + } + + pbuf, err := diffBytes(obuf, nbuf) + if err != nil { + return err + } + + _, err = patch.Write(pbuf) + return err +} + +func diffBytes(obuf, nbuf []byte) ([]byte, error) { + var patch seekBuffer + err := diff(obuf, nbuf, &patch) + if err != nil { + return nil, err + } + return patch.buf, nil +} + +func diff(obuf, nbuf []byte, patch io.WriteSeeker) error { + var lenf int + I := qsufsort(obuf) + db := make([]byte, len(nbuf)) + eb := make([]byte, len(nbuf)) + var dblen, eblen int + + var hdr header + hdr.Magic = magic + hdr.NewSize = int64(len(nbuf)) + err := binary.Write(patch, signMagLittleEndian{}, &hdr) + if err != nil { + return err + } + + // Compute the differences, writing ctrl as we go + pfbz2, err := newBzip2Writer(patch) + if err != nil { + return err + } + var scan, pos, length int + var lastscan, lastpos, lastoffset int + for scan < len(nbuf) { + var oldscore int + scan += length + for scsc := scan; scan < len(nbuf); scan++ { + pos, length = search(I, obuf, nbuf[scan:], 0, len(obuf)) + + for ; scsc < scan+length; scsc++ { + if scsc+lastoffset < len(obuf) && + obuf[scsc+lastoffset] == nbuf[scsc] { + oldscore++ + } + } + + if (length == oldscore && length != 0) || length > oldscore+8 { + break + } + + if scan+lastoffset < len(obuf) && obuf[scan+lastoffset] == nbuf[scan] { + oldscore-- + } + } + + if length != oldscore || scan == len(nbuf) { + var s, Sf int + lenf = 0 + for i := 0; lastscan+i < scan && lastpos+i < len(obuf); { + if obuf[lastpos+i] == nbuf[lastscan+i] { + s++ + } + i++ + if s*2-i > Sf*2-lenf { + Sf = s + lenf = i + } + } + + lenb := 0 + if scan < len(nbuf) { + var s, Sb int + for i := 1; (scan >= lastscan+i) && (pos >= i); i++ { + if obuf[pos-i] == nbuf[scan-i] { + s++ + } + if s*2-i > Sb*2-lenb { + Sb = s + lenb = i + } + } + } + + if lastscan+lenf > scan-lenb { + overlap := (lastscan + lenf) - (scan - lenb) + s := 0 + Ss := 0 + lens := 0 + for i := 0; i < overlap; i++ { + if nbuf[lastscan+lenf-overlap+i] == obuf[lastpos+lenf-overlap+i] { + s++ + } + if nbuf[scan-lenb+i] == obuf[pos-lenb+i] { + s-- + } + if s > Ss { + Ss = s + lens = i + 1 + } + } + + lenf += lens - overlap + lenb -= lens + } + + for i := 0; i < lenf; i++ { + db[dblen+i] = nbuf[lastscan+i] - obuf[lastpos+i] + } + for i := 0; i < (scan-lenb)-(lastscan+lenf); i++ { + eb[eblen+i] = nbuf[lastscan+lenf+i] + } + + dblen += lenf + eblen += (scan - lenb) - (lastscan + lenf) + + err = binary.Write(pfbz2, signMagLittleEndian{}, int64(lenf)) + if err != nil { + pfbz2.Close() + return err + } + + val := (scan - lenb) - (lastscan + lenf) + err = binary.Write(pfbz2, signMagLittleEndian{}, int64(val)) + if err != nil { + pfbz2.Close() + return err + } + + val = (pos - lenb) - (lastpos + lenf) + err = binary.Write(pfbz2, signMagLittleEndian{}, int64(val)) + if err != nil { + pfbz2.Close() + return err + } + + lastscan = scan - lenb + lastpos = pos - lenb + lastoffset = pos - scan + } + } + err = pfbz2.Close() + if err != nil { + return err + } + + // Compute size of compressed ctrl data + l64, err := patch.Seek(0, 1) + if err != nil { + return err + } + hdr.CtrlLen = int64(l64 - 32) + + // Write compressed diff data + pfbz2, err = newBzip2Writer(patch) + if err != nil { + return err + } + n, err := pfbz2.Write(db[:dblen]) + if err != nil { + pfbz2.Close() + return err + } + if n != dblen { + pfbz2.Close() + return io.ErrShortWrite + } + err = pfbz2.Close() + if err != nil { + return err + } + + // Compute size of compressed diff data + n64, err := patch.Seek(0, 1) + if err != nil { + return err + } + hdr.DiffLen = n64 - l64 + + // Write compressed extra data + pfbz2, err = newBzip2Writer(patch) + if err != nil { + return err + } + n, err = pfbz2.Write(eb[:eblen]) + if err != nil { + pfbz2.Close() + return err + } + if n != eblen { + pfbz2.Close() + return io.ErrShortWrite + } + err = pfbz2.Close() + if err != nil { + return err + } + + // Seek to the beginning, write the header, and close the file + _, err = patch.Seek(0, 0) + if err != nil { + return err + } + err = binary.Write(patch, signMagLittleEndian{}, &hdr) + if err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/inconshreveable/go-update/internal/binarydist/doc.go b/vendor/github.com/inconshreveable/go-update/internal/binarydist/doc.go new file mode 100644 index 0000000..3c92d87 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/binarydist/doc.go @@ -0,0 +1,24 @@ +// Package binarydist implements binary diff and patch as described on +// http://www.daemonology.net/bsdiff/. It reads and writes files +// compatible with the tools there. +package binarydist + +var magic = [8]byte{'B', 'S', 'D', 'I', 'F', 'F', '4', '0'} + +// File format: +// 0 8 "BSDIFF40" +// 8 8 X +// 16 8 Y +// 24 8 sizeof(newfile) +// 32 X bzip2(control block) +// 32+X Y bzip2(diff block) +// 32+X+Y ??? bzip2(extra block) +// with control block a set of triples (x,y,z) meaning "add x bytes +// from oldfile to x bytes from the diff block; copy y bytes from the +// extra block; seek forwards in oldfile by z bytes". +type header struct { + Magic [8]byte + CtrlLen int64 + DiffLen int64 + NewSize int64 +} diff --git a/vendor/github.com/inconshreveable/go-update/internal/binarydist/encoding.go b/vendor/github.com/inconshreveable/go-update/internal/binarydist/encoding.go new file mode 100644 index 0000000..75ba585 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/binarydist/encoding.go @@ -0,0 +1,53 @@ +package binarydist + +// SignMagLittleEndian is the numeric encoding used by the bsdiff tools. +// It implements binary.ByteOrder using a sign-magnitude format +// and little-endian byte order. Only methods Uint64 and String +// have been written; the rest panic. +type signMagLittleEndian struct{} + +func (signMagLittleEndian) Uint16(b []byte) uint16 { panic("unimplemented") } + +func (signMagLittleEndian) PutUint16(b []byte, v uint16) { panic("unimplemented") } + +func (signMagLittleEndian) Uint32(b []byte) uint32 { panic("unimplemented") } + +func (signMagLittleEndian) PutUint32(b []byte, v uint32) { panic("unimplemented") } + +func (signMagLittleEndian) Uint64(b []byte) uint64 { + y := int64(b[0]) | + int64(b[1])<<8 | + int64(b[2])<<16 | + int64(b[3])<<24 | + int64(b[4])<<32 | + int64(b[5])<<40 | + int64(b[6])<<48 | + int64(b[7]&0x7f)<<56 + + if b[7]&0x80 != 0 { + y = -y + } + return uint64(y) +} + +func (signMagLittleEndian) PutUint64(b []byte, v uint64) { + x := int64(v) + neg := x < 0 + if neg { + x = -x + } + + b[0] = byte(x) + b[1] = byte(x >> 8) + b[2] = byte(x >> 16) + b[3] = byte(x >> 24) + b[4] = byte(x >> 32) + b[5] = byte(x >> 40) + b[6] = byte(x >> 48) + b[7] = byte(x >> 56) + if neg { + b[7] |= 0x80 + } +} + +func (signMagLittleEndian) String() string { return "signMagLittleEndian" } diff --git a/vendor/github.com/inconshreveable/go-update/internal/binarydist/patch.go b/vendor/github.com/inconshreveable/go-update/internal/binarydist/patch.go new file mode 100644 index 0000000..eb03225 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/binarydist/patch.go @@ -0,0 +1,109 @@ +package binarydist + +import ( + "bytes" + "compress/bzip2" + "encoding/binary" + "errors" + "io" + "io/ioutil" +) + +var ErrCorrupt = errors.New("corrupt patch") + +// Patch applies patch to old, according to the bspatch algorithm, +// and writes the result to new. +func Patch(old io.Reader, new io.Writer, patch io.Reader) error { + var hdr header + err := binary.Read(patch, signMagLittleEndian{}, &hdr) + if err != nil { + return err + } + if hdr.Magic != magic { + return ErrCorrupt + } + if hdr.CtrlLen < 0 || hdr.DiffLen < 0 || hdr.NewSize < 0 { + return ErrCorrupt + } + + ctrlbuf := make([]byte, hdr.CtrlLen) + _, err = io.ReadFull(patch, ctrlbuf) + if err != nil { + return err + } + cpfbz2 := bzip2.NewReader(bytes.NewReader(ctrlbuf)) + + diffbuf := make([]byte, hdr.DiffLen) + _, err = io.ReadFull(patch, diffbuf) + if err != nil { + return err + } + dpfbz2 := bzip2.NewReader(bytes.NewReader(diffbuf)) + + // The entire rest of the file is the extra block. + epfbz2 := bzip2.NewReader(patch) + + obuf, err := ioutil.ReadAll(old) + if err != nil { + return err + } + + nbuf := make([]byte, hdr.NewSize) + + var oldpos, newpos int64 + for newpos < hdr.NewSize { + var ctrl struct{ Add, Copy, Seek int64 } + err = binary.Read(cpfbz2, signMagLittleEndian{}, &ctrl) + if err != nil { + return err + } + + // Sanity-check + if newpos+ctrl.Add > hdr.NewSize { + return ErrCorrupt + } + + // Read diff string + _, err = io.ReadFull(dpfbz2, nbuf[newpos:newpos+ctrl.Add]) + if err != nil { + return ErrCorrupt + } + + // Add old data to diff string + for i := int64(0); i < ctrl.Add; i++ { + if oldpos+i >= 0 && oldpos+i < int64(len(obuf)) { + nbuf[newpos+i] += obuf[oldpos+i] + } + } + + // Adjust pointers + newpos += ctrl.Add + oldpos += ctrl.Add + + // Sanity-check + if newpos+ctrl.Copy > hdr.NewSize { + return ErrCorrupt + } + + // Read extra string + _, err = io.ReadFull(epfbz2, nbuf[newpos:newpos+ctrl.Copy]) + if err != nil { + return ErrCorrupt + } + + // Adjust pointers + newpos += ctrl.Copy + oldpos += ctrl.Seek + } + + // Write the new file + for len(nbuf) > 0 { + n, err := new.Write(nbuf) + if err != nil { + return err + } + nbuf = nbuf[n:] + } + + return nil +} diff --git a/vendor/github.com/inconshreveable/go-update/internal/binarydist/seek.go b/vendor/github.com/inconshreveable/go-update/internal/binarydist/seek.go new file mode 100644 index 0000000..96c0346 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/binarydist/seek.go @@ -0,0 +1,43 @@ +package binarydist + +import ( + "errors" +) + +type seekBuffer struct { + buf []byte + pos int +} + +func (b *seekBuffer) Write(p []byte) (n int, err error) { + n = copy(b.buf[b.pos:], p) + if n == len(p) { + b.pos += n + return n, nil + } + b.buf = append(b.buf, p[n:]...) + b.pos += len(p) + return len(p), nil +} + +func (b *seekBuffer) Seek(offset int64, whence int) (ret int64, err error) { + var abs int64 + switch whence { + case 0: + abs = offset + case 1: + abs = int64(b.pos) + offset + case 2: + abs = int64(len(b.buf)) + offset + default: + return 0, errors.New("binarydist: invalid whence") + } + if abs < 0 { + return 0, errors.New("binarydist: negative position") + } + if abs >= 1<<31 { + return 0, errors.New("binarydist: position out of range") + } + b.pos = int(abs) + return abs, nil +} diff --git a/vendor/github.com/inconshreveable/go-update/internal/osext/LICENSE b/vendor/github.com/inconshreveable/go-update/internal/osext/LICENSE new file mode 100644 index 0000000..7448756 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/osext/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/inconshreveable/go-update/internal/osext/README.md b/vendor/github.com/inconshreveable/go-update/internal/osext/README.md new file mode 100644 index 0000000..61350ba --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/osext/README.md @@ -0,0 +1,16 @@ +### Extensions to the "os" package. + +## Find the current Executable and ExecutableFolder. + +There is sometimes utility in finding the current executable file +that is running. This can be used for upgrading the current executable +or finding resources located relative to the executable file. Both +working directory and the os.Args[0] value are arbitrary and cannot +be relied on; os.Args[0] can be "faked". + +Multi-platform and supports: + * Linux + * OS X + * Windows + * Plan 9 + * BSDs. diff --git a/vendor/github.com/inconshreveable/go-update/internal/osext/osext.go b/vendor/github.com/inconshreveable/go-update/internal/osext/osext.go new file mode 100644 index 0000000..7bef46f --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/osext/osext.go @@ -0,0 +1,27 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Extensions to the standard "os" package. +package osext + +import "path/filepath" + +// Executable returns an absolute path that can be used to +// re-invoke the current program. +// It may not be valid after the current program exits. +func Executable() (string, error) { + p, err := executable() + return filepath.Clean(p), err +} + +// Returns same path as Executable, returns just the folder +// path. Excludes the executable name and any trailing slash. +func ExecutableFolder() (string, error) { + p, err := Executable() + if err != nil { + return "", err + } + + return filepath.Dir(p), nil +} diff --git a/vendor/github.com/inconshreveable/go-update/internal/osext/osext_plan9.go b/vendor/github.com/inconshreveable/go-update/internal/osext/osext_plan9.go new file mode 100644 index 0000000..655750c --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/osext/osext_plan9.go @@ -0,0 +1,20 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package osext + +import ( + "os" + "strconv" + "syscall" +) + +func executable() (string, error) { + f, err := os.Open("/proc/" + strconv.Itoa(os.Getpid()) + "/text") + if err != nil { + return "", err + } + defer f.Close() + return syscall.Fd2path(int(f.Fd())) +} diff --git a/vendor/github.com/inconshreveable/go-update/internal/osext/osext_procfs.go b/vendor/github.com/inconshreveable/go-update/internal/osext/osext_procfs.go new file mode 100644 index 0000000..b2598bc --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/osext/osext_procfs.go @@ -0,0 +1,36 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux netbsd openbsd solaris dragonfly + +package osext + +import ( + "errors" + "fmt" + "os" + "runtime" + "strings" +) + +func executable() (string, error) { + switch runtime.GOOS { + case "linux": + const deletedTag = " (deleted)" + execpath, err := os.Readlink("/proc/self/exe") + if err != nil { + return execpath, err + } + execpath = strings.TrimSuffix(execpath, deletedTag) + execpath = strings.TrimPrefix(execpath, deletedTag) + return execpath, nil + case "netbsd": + return os.Readlink("/proc/curproc/exe") + case "openbsd", "dragonfly": + return os.Readlink("/proc/curproc/file") + case "solaris": + return os.Readlink(fmt.Sprintf("/proc/%d/path/a.out", os.Getpid())) + } + return "", errors.New("ExecPath not implemented for " + runtime.GOOS) +} diff --git a/vendor/github.com/inconshreveable/go-update/internal/osext/osext_sysctl.go b/vendor/github.com/inconshreveable/go-update/internal/osext/osext_sysctl.go new file mode 100644 index 0000000..b66cac8 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/osext/osext_sysctl.go @@ -0,0 +1,79 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin freebsd + +package osext + +import ( + "os" + "path/filepath" + "runtime" + "syscall" + "unsafe" +) + +var initCwd, initCwdErr = os.Getwd() + +func executable() (string, error) { + var mib [4]int32 + switch runtime.GOOS { + case "freebsd": + mib = [4]int32{1 /* CTL_KERN */, 14 /* KERN_PROC */, 12 /* KERN_PROC_PATHNAME */, -1} + case "darwin": + mib = [4]int32{1 /* CTL_KERN */, 38 /* KERN_PROCARGS */, int32(os.Getpid()), -1} + } + + n := uintptr(0) + // Get length. + _, _, errNum := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, 0, uintptr(unsafe.Pointer(&n)), 0, 0) + if errNum != 0 { + return "", errNum + } + if n == 0 { // This shouldn't happen. + return "", nil + } + buf := make([]byte, n) + _, _, errNum = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, uintptr(unsafe.Pointer(&buf[0])), uintptr(unsafe.Pointer(&n)), 0, 0) + if errNum != 0 { + return "", errNum + } + if n == 0 { // This shouldn't happen. + return "", nil + } + for i, v := range buf { + if v == 0 { + buf = buf[:i] + break + } + } + var err error + execPath := string(buf) + // execPath will not be empty due to above checks. + // Try to get the absolute path if the execPath is not rooted. + if execPath[0] != '/' { + execPath, err = getAbs(execPath) + if err != nil { + return execPath, err + } + } + // For darwin KERN_PROCARGS may return the path to a symlink rather than the + // actual executable. + if runtime.GOOS == "darwin" { + if execPath, err = filepath.EvalSymlinks(execPath); err != nil { + return execPath, err + } + } + return execPath, nil +} + +func getAbs(execPath string) (string, error) { + if initCwdErr != nil { + return execPath, initCwdErr + } + // The execPath may begin with a "../" or a "./" so clean it first. + // Join the two paths, trailing and starting slashes undetermined, so use + // the generic Join function. + return filepath.Join(initCwd, filepath.Clean(execPath)), nil +} diff --git a/vendor/github.com/inconshreveable/go-update/internal/osext/osext_windows.go b/vendor/github.com/inconshreveable/go-update/internal/osext/osext_windows.go new file mode 100644 index 0000000..72d282c --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/internal/osext/osext_windows.go @@ -0,0 +1,34 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package osext + +import ( + "syscall" + "unicode/utf16" + "unsafe" +) + +var ( + kernel = syscall.MustLoadDLL("kernel32.dll") + getModuleFileNameProc = kernel.MustFindProc("GetModuleFileNameW") +) + +// GetModuleFileName() with hModule = NULL +func executable() (exePath string, err error) { + return getModuleFileName() +} + +func getModuleFileName() (string, error) { + var n uint32 + b := make([]uint16, syscall.MAX_PATH) + size := uint32(len(b)) + + r0, _, e1 := getModuleFileNameProc.Call(0, uintptr(unsafe.Pointer(&b[0])), uintptr(size)) + n = uint32(r0) + if n == 0 { + return "", e1 + } + return string(utf16.Decode(b[0:n])), nil +} diff --git a/vendor/github.com/inconshreveable/go-update/patcher.go b/vendor/github.com/inconshreveable/go-update/patcher.go new file mode 100644 index 0000000..1da89cb --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/patcher.go @@ -0,0 +1,24 @@ +package update + +import ( + "io" + + "github.com/inconshreveable/go-update/internal/binarydist" +) + +// Patcher defines an interface for applying binary patches to an old item to get an updated item. +type Patcher interface { + Patch(old io.Reader, new io.Writer, patch io.Reader) error +} + +type patchFn func(io.Reader, io.Writer, io.Reader) error + +func (fn patchFn) Patch(old io.Reader, new io.Writer, patch io.Reader) error { + return fn(old, new, patch) +} + +// NewBSDifferPatcher returns a new Patcher that applies binary patches using +// the bsdiff algorithm. See http://www.daemonology.net/bsdiff/ +func NewBSDiffPatcher() Patcher { + return patchFn(binarydist.Patch) +} diff --git a/vendor/github.com/inconshreveable/go-update/verifier.go b/vendor/github.com/inconshreveable/go-update/verifier.go new file mode 100644 index 0000000..af1fc57 --- /dev/null +++ b/vendor/github.com/inconshreveable/go-update/verifier.go @@ -0,0 +1,74 @@ +package update + +import ( + "crypto" + "crypto/dsa" + "crypto/ecdsa" + "crypto/rsa" + "encoding/asn1" + "errors" + "math/big" +) + +// Verifier defines an interface for verfiying an update's signature with a public key. +type Verifier interface { + VerifySignature(checksum, signature []byte, h crypto.Hash, publicKey crypto.PublicKey) error +} + +type verifyFn func([]byte, []byte, crypto.Hash, crypto.PublicKey) error + +func (fn verifyFn) VerifySignature(checksum []byte, signature []byte, hash crypto.Hash, publicKey crypto.PublicKey) error { + return fn(checksum, signature, hash, publicKey) +} + +// NewRSAVerifier returns a Verifier that uses the RSA algorithm to verify updates. +func NewRSAVerifier() Verifier { + return verifyFn(func(checksum, signature []byte, hash crypto.Hash, publicKey crypto.PublicKey) error { + key, ok := publicKey.(*rsa.PublicKey) + if !ok { + return errors.New("not a valid RSA public key") + } + return rsa.VerifyPKCS1v15(key, hash, checksum, signature) + }) +} + +type rsDER struct { + R *big.Int + S *big.Int +} + +// NewECDSAVerifier returns a Verifier that uses the ECDSA algorithm to verify updates. +func NewECDSAVerifier() Verifier { + return verifyFn(func(checksum, signature []byte, hash crypto.Hash, publicKey crypto.PublicKey) error { + key, ok := publicKey.(*ecdsa.PublicKey) + if !ok { + return errors.New("not a valid ECDSA public key") + } + var rs rsDER + if _, err := asn1.Unmarshal(signature, &rs); err != nil { + return err + } + if !ecdsa.Verify(key, checksum, rs.R, rs.S) { + return errors.New("failed to verify ecsda signature") + } + return nil + }) +} + +// NewDSAVerifier returns a Verifier that uses the DSA algorithm to verify updates. +func NewDSAVerifier() Verifier { + return verifyFn(func(checksum, signature []byte, hash crypto.Hash, publicKey crypto.PublicKey) error { + key, ok := publicKey.(*dsa.PublicKey) + if !ok { + return errors.New("not a valid DSA public key") + } + var rs rsDER + if _, err := asn1.Unmarshal(signature, &rs); err != nil { + return err + } + if !dsa.Verify(key, checksum, rs.R, rs.S) { + return errors.New("failed to verify ecsda signature") + } + return nil + }) +} diff --git a/vendor/github.com/mitchellh/go-homedir/LICENSE b/vendor/github.com/mitchellh/go-homedir/LICENSE new file mode 100644 index 0000000..f9c841a --- /dev/null +++ b/vendor/github.com/mitchellh/go-homedir/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Mitchell Hashimoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/mitchellh/go-homedir/README.md b/vendor/github.com/mitchellh/go-homedir/README.md new file mode 100644 index 0000000..d70706d --- /dev/null +++ b/vendor/github.com/mitchellh/go-homedir/README.md @@ -0,0 +1,14 @@ +# go-homedir + +This is a Go library for detecting the user's home directory without +the use of cgo, so the library can be used in cross-compilation environments. + +Usage is incredibly simple, just call `homedir.Dir()` to get the home directory +for a user, and `homedir.Expand()` to expand the `~` in a path to the home +directory. + +**Why not just use `os/user`?** The built-in `os/user` package requires +cgo on Darwin systems. This means that any Go code that uses that package +cannot cross compile. But 99% of the time the use for `os/user` is just to +retrieve the home directory, which we can do for the current user without +cgo. This library does that, enabling cross-compilation. diff --git a/vendor/github.com/mitchellh/go-homedir/go.mod b/vendor/github.com/mitchellh/go-homedir/go.mod new file mode 100644 index 0000000..7efa09a --- /dev/null +++ b/vendor/github.com/mitchellh/go-homedir/go.mod @@ -0,0 +1 @@ +module github.com/mitchellh/go-homedir diff --git a/vendor/github.com/mitchellh/go-homedir/homedir.go b/vendor/github.com/mitchellh/go-homedir/homedir.go new file mode 100644 index 0000000..2537853 --- /dev/null +++ b/vendor/github.com/mitchellh/go-homedir/homedir.go @@ -0,0 +1,167 @@ +package homedir + +import ( + "bytes" + "errors" + "os" + "os/exec" + "path/filepath" + "runtime" + "strconv" + "strings" + "sync" +) + +// DisableCache will disable caching of the home directory. Caching is enabled +// by default. +var DisableCache bool + +var homedirCache string +var cacheLock sync.RWMutex + +// Dir returns the home directory for the executing user. +// +// This uses an OS-specific method for discovering the home directory. +// An error is returned if a home directory cannot be detected. +func Dir() (string, error) { + if !DisableCache { + cacheLock.RLock() + cached := homedirCache + cacheLock.RUnlock() + if cached != "" { + return cached, nil + } + } + + cacheLock.Lock() + defer cacheLock.Unlock() + + var result string + var err error + if runtime.GOOS == "windows" { + result, err = dirWindows() + } else { + // Unix-like system, so just assume Unix + result, err = dirUnix() + } + + if err != nil { + return "", err + } + homedirCache = result + return result, nil +} + +// Expand expands the path to include the home directory if the path +// is prefixed with `~`. If it isn't prefixed with `~`, the path is +// returned as-is. +func Expand(path string) (string, error) { + if len(path) == 0 { + return path, nil + } + + if path[0] != '~' { + return path, nil + } + + if len(path) > 1 && path[1] != '/' && path[1] != '\\' { + return "", errors.New("cannot expand user-specific home dir") + } + + dir, err := Dir() + if err != nil { + return "", err + } + + return filepath.Join(dir, path[1:]), nil +} + +// Reset clears the cache, forcing the next call to Dir to re-detect +// the home directory. This generally never has to be called, but can be +// useful in tests if you're modifying the home directory via the HOME +// env var or something. +func Reset() { + cacheLock.Lock() + defer cacheLock.Unlock() + homedirCache = "" +} + +func dirUnix() (string, error) { + homeEnv := "HOME" + if runtime.GOOS == "plan9" { + // On plan9, env vars are lowercase. + homeEnv = "home" + } + + // First prefer the HOME environmental variable + if home := os.Getenv(homeEnv); home != "" { + return home, nil + } + + var stdout bytes.Buffer + + // If that fails, try OS specific commands + if runtime.GOOS == "darwin" { + cmd := exec.Command("sh", "-c", `dscl -q . -read /Users/"$(whoami)" NFSHomeDirectory | sed 's/^[^ ]*: //'`) + cmd.Stdout = &stdout + if err := cmd.Run(); err == nil { + result := strings.TrimSpace(stdout.String()) + if result != "" { + return result, nil + } + } + } else { + cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid())) + cmd.Stdout = &stdout + if err := cmd.Run(); err != nil { + // If the error is ErrNotFound, we ignore it. Otherwise, return it. + if err != exec.ErrNotFound { + return "", err + } + } else { + if passwd := strings.TrimSpace(stdout.String()); passwd != "" { + // username:password:uid:gid:gecos:home:shell + passwdParts := strings.SplitN(passwd, ":", 7) + if len(passwdParts) > 5 { + return passwdParts[5], nil + } + } + } + } + + // If all else fails, try the shell + stdout.Reset() + cmd := exec.Command("sh", "-c", "cd && pwd") + cmd.Stdout = &stdout + if err := cmd.Run(); err != nil { + return "", err + } + + result := strings.TrimSpace(stdout.String()) + if result == "" { + return "", errors.New("blank output when reading home directory") + } + + return result, nil +} + +func dirWindows() (string, error) { + // First prefer the HOME environmental variable + if home := os.Getenv("HOME"); home != "" { + return home, nil + } + + // Prefer standard environment variable USERPROFILE + if home := os.Getenv("USERPROFILE"); home != "" { + return home, nil + } + + drive := os.Getenv("HOMEDRIVE") + path := os.Getenv("HOMEPATH") + home := drive + path + if drive == "" || path == "" { + return "", errors.New("HOMEDRIVE, HOMEPATH, or USERPROFILE are blank") + } + + return home, nil +} diff --git a/vendor/golang.org/x/sys/unix/affinity_linux.go b/vendor/golang.org/x/sys/unix/affinity_linux.go index 72afe33..6e5c81a 100644 --- a/vendor/golang.org/x/sys/unix/affinity_linux.go +++ b/vendor/golang.org/x/sys/unix/affinity_linux.go @@ -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) -} diff --git a/vendor/golang.org/x/sys/unix/bluetooth_linux.go b/vendor/golang.org/x/sys/unix/bluetooth_linux.go index 6e32296..a178a61 100644 --- a/vendor/golang.org/x/sys/unix/bluetooth_linux.go +++ b/vendor/golang.org/x/sys/unix/bluetooth_linux.go @@ -23,6 +23,7 @@ const ( HCI_CHANNEL_USER = 1 HCI_CHANNEL_MONITOR = 2 HCI_CHANNEL_CONTROL = 3 + HCI_CHANNEL_LOGGING = 4 ) // Socketoption Level diff --git a/vendor/golang.org/x/sys/unix/dirent.go b/vendor/golang.org/x/sys/unix/dirent.go index 6f3460e..304016b 100644 --- a/vendor/golang.org/x/sys/unix/dirent.go +++ b/vendor/golang.org/x/sys/unix/dirent.go @@ -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 aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package unix diff --git a/vendor/golang.org/x/sys/unix/endian_little.go b/vendor/golang.org/x/sys/unix/endian_little.go index 085df2d..bcdb5d3 100644 --- a/vendor/golang.org/x/sys/unix/endian_little.go +++ b/vendor/golang.org/x/sys/unix/endian_little.go @@ -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 diff --git a/vendor/golang.org/x/sys/unix/ioctl.go b/vendor/golang.org/x/sys/unix/ioctl.go index f121a8d..3559e5d 100644 --- a/vendor/golang.org/x/sys/unix/ioctl.go +++ b/vendor/golang.org/x/sys/unix/ioctl.go @@ -6,7 +6,19 @@ 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)) +} // IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. // @@ -14,7 +26,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 +36,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 +} diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index 5a22eca..890ec46 100644 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -212,9 +212,11 @@ esac 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"; + echo "$mksyscall -tags $GOOS,$GOARCH,!go1.12 $syscall_goos syscall_darwin_${GOARCH}.1_11.go $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"; else echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 3d85f27..4da0a63 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -60,6 +60,7 @@ includes_Darwin=' #include #include #include +#include #include #include #include @@ -80,6 +81,7 @@ includes_Darwin=' includes_DragonFly=' #include #include +#include #include #include #include @@ -103,6 +105,7 @@ includes_FreeBSD=' #include #include #include +#include #include #include #include @@ -179,52 +182,58 @@ struct ltchars { #include #include #include +#include #include #include #include #include +#include #include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include #include +#include #include #include #include #include #include #include -#include -#include -#include -#include -#include +#include #include #include +#include #include #include #include #include #include #include +#include #include +#include #include #include +#include #include -#include #include #include -#include -#include -#include #include -#include -#include +#include #include -#include +#include +#include +#include #include -#include -#include -#include -#include + #include #include @@ -263,6 +272,11 @@ 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 ' includes_NetBSD=' @@ -272,6 +286,7 @@ includes_NetBSD=' #include #include #include +#include #include #include #include @@ -298,6 +313,7 @@ includes_OpenBSD=' #include #include #include +#include #include #include #include @@ -334,6 +350,7 @@ includes_OpenBSD=' includes_SunOS=' #include #include +#include #include #include #include @@ -426,6 +443,7 @@ ccflags="$@" $2 == "XCASE" || $2 == "ALTWERASE" || $2 == "NOKERNINFO" || + $2 == "NFDBITS" || $2 ~ /^PAR/ || $2 ~ /^SIG[^_]/ || $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || @@ -435,6 +453,8 @@ ccflags="$@" $2 ~ /^TC[IO](ON|OFF)$/ || $2 ~ /^IN_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || + $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_/ || @@ -448,6 +468,7 @@ 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 ~ /^KEXEC_/ || @@ -503,6 +524,8 @@ ccflags="$@" $2 ~ /^XDP_/ || $2 ~ /^(HDIO|WIN|SMART)_/ || $2 ~ /^CRYPTO_/ || + $2 ~ /^TIPC_/ || + $2 ~ /^DEVLINK_/ || $2 !~ "WMESGLEN" && $2 ~ /^W[A-Z0-9]+$/ || $2 ~/^PPPIOC/ || diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go b/vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go new file mode 100644 index 0000000..5144dee --- /dev/null +++ b/vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go @@ -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) +} diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_linux.go b/vendor/golang.org/x/sys/unix/sockcmsg_linux.go index 6079eb4..8bf4570 100644 --- a/vendor/golang.org/x/sys/unix/sockcmsg_linux.go +++ b/vendor/golang.org/x/sys/unix/sockcmsg_linux.go @@ -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 } diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/vendor/golang.org/x/sys/unix/sockcmsg_unix.go index 062bcab..003916e 100644 --- a/vendor/golang.org/x/sys/unix/sockcmsg_unix.go +++ b/vendor/golang.org/x/sys/unix/sockcmsg_unix.go @@ -9,35 +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 "aix": - // There is no alignment on AIX. - salign = 1 - case "darwin", "dragonfly", "solaris", "illumos": - // NOTE: It seems like 64-bit Darwin, DragonFly BSD, - // 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 - } - } - - 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 { @@ -50,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. @@ -94,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 } diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go b/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go new file mode 100644 index 0000000..7d08dae --- /dev/null +++ b/vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go @@ -0,0 +1,38 @@ +// 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", "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 + } + } + + return (salen + salign - 1) & ^(salign - 1) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index 1aa065f..9ad8a0d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -350,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. diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go index bf05603..b3c8e33 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go @@ -29,6 +29,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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go index 13d4321..9a6e024 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go @@ -29,6 +29,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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 97a8eef..d52bcc4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -237,7 +237,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 @@ -413,8 +413,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. diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go b/vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go new file mode 100644 index 0000000..6a15cba --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go @@ -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 darwin,go1.12,!go1.13 + +package unix + +import ( + "unsafe" +) + +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 +} diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go b/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go new file mode 100644 index 0000000..f911617 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go @@ -0,0 +1,101 @@ +// 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" + +//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. + s := struct { + ptr unsafe.Pointer + siz int + cap int + }{ptr: unsafe.Pointer(&entry), siz: reclen, cap: reclen} + copy(buf, *(*[]byte)(unsafe.Pointer(&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 +} diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 216b4ac..0a1cc74 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -89,7 +89,6 @@ func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } -//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } @@ -340,42 +339,7 @@ func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(sig //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} @@ -498,7 +462,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) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_386.1_11.go b/vendor/golang.org/x/sys/unix/syscall_darwin_386.1_11.go new file mode 100644 index 0000000..6b223f9 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_386.1_11.go @@ -0,0 +1,9 @@ +// 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,386,!go1.12 + +package unix + +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64 diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go index 489726f..707ba4f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go @@ -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)} } @@ -43,6 +45,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) } @@ -56,7 +62,6 @@ 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 diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.1_11.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.1_11.go new file mode 100644 index 0000000..68ebd6f --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.1_11.go @@ -0,0 +1,9 @@ +// 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,amd64,!go1.12 + +package unix + +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64 diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go index 914b89b..fdbfb59 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -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} } @@ -43,6 +45,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) } @@ -56,7 +62,6 @@ 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 diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go new file mode 100644 index 0000000..c81510d --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go @@ -0,0 +1,11 @@ +// 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,386,!go1.12 + +package unix + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + return 0, ENOSYS +} diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go index 4a284cf..f8bc4cf 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go @@ -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)} } @@ -41,6 +45,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) } @@ -58,7 +66,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 -} diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.1_11.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.1_11.go new file mode 100644 index 0000000..01d4504 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.1_11.go @@ -0,0 +1,11 @@ +// 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,arm64,!go1.12 + +package unix + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + return 0, ENOSYS +} diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go index 52dcd88..5ede3ac 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -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} } @@ -43,6 +47,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) } @@ -60,7 +68,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 -} diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go b/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go index 4b4ae46..f34c86c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go @@ -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. diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index 260a400..8a195ae 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -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 { @@ -150,42 +168,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) @@ -325,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) diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go index 9babb31..a6b4830 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index 329d240..34918d8 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -201,42 +201,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} @@ -497,8 +462,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) { @@ -514,6 +483,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 @@ -688,7 +658,7 @@ func PtraceSingleStep(pid int) (err error) { //sys Revoke(path string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK -//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sys 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) diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go index 21e0395..dcc5645 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go index 9c945a6..321c3ba 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go index 5cd6243..6977008 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go index a318054..dbbbfd6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 637b501..26903bc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -71,6 +71,17 @@ 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. +// 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 +} + // 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 @@ -80,52 +91,18 @@ func IoctlSetPointerInt(fd int, req uint, value int) error { 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))) -} - func IoctlSetRTCTime(fd int, value *RTCTime) error { err := ioctl(fd, RTC_SET_TIME, 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. -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return value, 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))) @@ -798,6 +775,70 @@ 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 +} + func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_NETLINK: @@ -843,7 +884,7 @@ 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 @@ -923,6 +964,27 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { break } } + 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 } return nil, EAFNOSUPPORT @@ -1160,6 +1222,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:", and "key_or_keyring::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 @@ -1403,8 +1493,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) @@ -1761,6 +1855,17 @@ func OpenByHandleAt(mountFD int, handle FileHandle, flags int) (fd int, err erro 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 +} + /* * Unimplemented */ diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index e2f8cf6..e7fa665 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 87a3074..088ce0f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index f626794..11930fc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -252,6 +252,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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index cb20b15..251e2d9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -180,6 +180,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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index b3b21ec..7562fe9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -208,6 +208,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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index 5144d4e..a939ff8 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 0a100b6..28d6d0f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 6230f64..6798c26 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index f81dbdc..eb5cb1a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index b695656..37321c1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 5ef3090..211131d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -187,42 +187,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 @@ -365,7 +330,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) diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go index 24f74e5..24da8b5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go index 6878bf7..25a0ac8 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go index dbbfcf7..21591ec 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go index f343446..8047496 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go @@ -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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 1a074b2..92ed67d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -178,42 +178,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 //sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) @@ -340,7 +305,7 @@ func Uname(uname *Utsname) error { //sys Revoke(path string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK -//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sys 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) diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go index d62da60..42b5a0e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go @@ -28,6 +28,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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go index 9a35334..6ea4b48 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go @@ -28,6 +28,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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go index 5d812aa..1c3d26f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go @@ -28,6 +28,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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go index 0fb39cf..a8c458c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go @@ -28,6 +28,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) } diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index 0153a31..0e2a696 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -391,7 +391,7 @@ 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 @@ -553,40 +553,10 @@ func Minor(dev uint64) uint32 { //sys ioctl(fd int, req uint, arg uintptr) (err error) -func IoctlSetInt(fd int, req uint, value int) (err error) { - return ioctl(fd, req, uintptr(value)) -} - -func ioctlSetWinsize(fd int, req uint, value *Winsize) (err error) { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -func ioctlSetTermios(fd int, req uint, value *Termios) (err error) { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - func IoctlSetTermio(fd int, req uint, value *Termio) (err error) { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return value, err -} - -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { - var value Winsize - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - -func IoctlGetTermios(fd int, req uint) (*Termios, error) { - var value Termios - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - func IoctlGetTermio(fd int, req uint) (*Termio, error) { var value Termio err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) @@ -679,7 +649,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = 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) diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go index 91c32dd..b22a34d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go @@ -18,6 +18,10 @@ func (iov *Iovec) SetLen(length int) { iov.Len = uint64(length) } +func (msghdr *Msghdr) SetIovlen(length int) { + msghdr.Iovlen = int32(length) +} + func (cmsg *Cmsghdr) SetLen(length int) { cmsg.Len = uint32(length) } diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go index 3b39d74..6217cdb 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go @@ -3,7 +3,7 @@ // +build 386,darwin -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m32 _const.go package unix @@ -980,6 +980,7 @@ const ( NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 + NFDBITS = 0x20 NL0 = 0x0 NL1 = 0x100 NL2 = 0x200 diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go index 8fe5547..e3ff2ee 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -3,7 +3,7 @@ // +build amd64,darwin -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go package unix @@ -980,6 +980,7 @@ const ( NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 + NFDBITS = 0x20 NL0 = 0x0 NL1 = 0x100 NL2 = 0x200 diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go index 7a97777..3e41757 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go @@ -3,7 +3,7 @@ // +build arm,darwin -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- _const.go package unix @@ -980,6 +980,7 @@ const ( NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 + NFDBITS = 0x20 NL0 = 0x0 NL1 = 0x100 NL2 = 0x200 diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go index 6d56d8a..cbd8ed1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -3,7 +3,7 @@ // +build arm64,darwin -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go package unix @@ -980,6 +980,7 @@ const ( NET_RT_MAXID = 0xa NET_RT_STAT = 0x4 NET_RT_TRASH = 0x5 + NFDBITS = 0x20 NL0 = 0x0 NL1 = 0x100 NL2 = 0x200 diff --git a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go index bbe6089..6130471 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go @@ -938,6 +938,7 @@ const ( NET_RT_FLAGS = 0x2 NET_RT_IFLIST = 0x3 NET_RT_MAXID = 0x4 + NFDBITS = 0x40 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go index d2bbaab..b72544f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -3,7 +3,7 @@ // +build 386,freebsd -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m32 _const.go package unix @@ -1055,6 +1055,7 @@ const ( NET_RT_IFLIST = 0x3 NET_RT_IFLISTL = 0x5 NET_RT_IFMALIST = 0x4 + NFDBITS = 0x20 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go index 4f8db78..9f38267 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -3,7 +3,7 @@ // +build amd64,freebsd -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go package unix @@ -1056,6 +1056,7 @@ const ( NET_RT_IFLIST = 0x3 NET_RT_IFLISTL = 0x5 NET_RT_IFMALIST = 0x4 + NFDBITS = 0x40 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go index 53e5de6..16db56a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -3,7 +3,7 @@ // +build arm,freebsd -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- _const.go package unix @@ -1063,6 +1063,7 @@ const ( NET_RT_IFLIST = 0x3 NET_RT_IFLISTL = 0x5 NET_RT_IFMALIST = 0x4 + NFDBITS = 0x20 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go index d4a192f..1a1de34 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go @@ -3,7 +3,7 @@ // +build arm64,freebsd -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go package unix @@ -1056,6 +1056,7 @@ const ( NET_RT_IFLIST = 0x3 NET_RT_IFLISTL = 0x5 NET_RT_IFMALIST = 0x4 + NFDBITS = 0x40 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index a5e32ae..97332d0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -722,6 +732,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -987,6 +998,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1085,6 +1097,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1097,6 +1120,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1149,6 +1174,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1328,6 +1367,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x20 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1392,6 +1432,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1657,6 +1701,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1672,6 +1718,7 @@ const ( PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_GET_THREAD_AREA = 0x19 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 @@ -1710,6 +1757,10 @@ const ( PTRACE_SINGLEBLOCK = 0x21 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_SYSEMU = 0x1f PTRACE_SYSEMU_SINGLESTEP = 0x20 PTRACE_TRACEME = 0x0 @@ -1770,7 +1821,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1843,6 +1894,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1867,6 +1919,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1874,7 +1927,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1886,6 +1939,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1894,8 +1948,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -1980,6 +2034,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2118,6 +2174,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2418,6 +2475,71 @@ const ( TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x100 TPACKET_ALIGNMENT = 0x10 @@ -2431,7 +2553,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2630,6 +2752,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2646,6 +2770,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index cacabfa..d81d30b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -722,6 +732,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -987,6 +998,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1085,6 +1097,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1097,6 +1120,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1149,6 +1174,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1328,6 +1367,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1392,6 +1432,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1658,6 +1702,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1673,6 +1719,7 @@ const ( PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_GET_THREAD_AREA = 0x19 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 @@ -1711,6 +1758,10 @@ const ( PTRACE_SINGLEBLOCK = 0x21 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_SYSEMU = 0x1f PTRACE_SYSEMU_SINGLESTEP = 0x20 PTRACE_TRACEME = 0x0 @@ -1771,7 +1822,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1844,6 +1895,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1868,6 +1920,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1875,7 +1928,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1887,6 +1940,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1895,8 +1949,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -1981,6 +2035,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2119,6 +2175,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2419,6 +2476,71 @@ const ( TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x100 TPACKET_ALIGNMENT = 0x10 @@ -2432,7 +2554,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2630,6 +2752,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2646,6 +2770,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index c04d5b9..0d22b52 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -721,6 +731,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -986,6 +997,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1084,6 +1096,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1096,6 +1119,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1148,6 +1173,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1326,6 +1365,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x20 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1390,6 +1430,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1655,6 +1699,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1676,6 +1722,7 @@ const ( PTRACE_GETSIGMASK = 0x420a PTRACE_GETVFPREGS = 0x1b PTRACE_GETWMMXREGS = 0x12 + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_GET_THREAD_AREA = 0x16 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 @@ -1716,6 +1763,10 @@ const ( PTRACE_SET_SYSCALL = 0x17 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_TRACEME = 0x0 PT_DATA_ADDR = 0x10004 PT_TEXT_ADDR = 0x10000 @@ -1777,7 +1828,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1850,6 +1901,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1874,6 +1926,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1881,7 +1934,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1893,6 +1946,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1901,8 +1955,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -1987,6 +2041,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2125,6 +2181,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2425,6 +2482,71 @@ const ( TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x100 TPACKET_ALIGNMENT = 0x10 @@ -2438,7 +2560,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2636,6 +2758,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2652,6 +2776,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 507c44c..0a0267d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -561,6 +570,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -724,6 +734,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -989,6 +1000,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1087,6 +1099,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1099,6 +1122,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1151,6 +1176,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1329,6 +1368,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1393,6 +1433,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1658,6 +1702,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1671,6 +1717,7 @@ const ( PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 @@ -1703,6 +1750,12 @@ const ( PTRACE_SETSIGMASK = 0x420b PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 PTRACE_TRACEME = 0x0 QNX4_SUPER_MAGIC = 0x2f QNX6_SUPER_MAGIC = 0x68191122 @@ -1761,7 +1814,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1834,6 +1887,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1858,6 +1912,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1865,7 +1920,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1877,6 +1932,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1885,8 +1941,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -1971,6 +2027,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2109,6 +2167,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2410,6 +2469,71 @@ const ( TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x100 TPACKET_ALIGNMENT = 0x10 @@ -2423,7 +2547,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2621,6 +2745,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2637,6 +2763,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index dd2a894..33dd99e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -721,6 +731,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -986,6 +997,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1084,6 +1096,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1096,6 +1119,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1148,6 +1173,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1326,6 +1365,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x20 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1390,6 +1430,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1655,6 +1699,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1669,6 +1715,7 @@ const ( PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_GET_THREAD_AREA = 0x19 PTRACE_GET_THREAD_AREA_3264 = 0xc4 PTRACE_GET_WATCH_REGS = 0xd0 @@ -1712,6 +1759,10 @@ const ( PTRACE_SET_WATCH_REGS = 0xd1 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_TRACEME = 0x0 QNX4_SUPER_MAGIC = 0x2f QNX6_SUPER_MAGIC = 0x68191122 @@ -1770,7 +1821,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1843,6 +1894,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1867,6 +1919,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1874,7 +1927,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1886,6 +1939,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1894,8 +1948,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -1980,6 +2034,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2118,6 +2174,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2420,6 +2477,71 @@ const ( TIOCSTI = 0x5472 TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x8000 TPACKET_ALIGNMENT = 0x10 @@ -2433,7 +2555,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2632,6 +2754,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2648,6 +2772,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 90a401b..b7040c9 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -721,6 +731,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -986,6 +997,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1084,6 +1096,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1096,6 +1119,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1148,6 +1173,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1326,6 +1365,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1390,6 +1430,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1655,6 +1699,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1669,6 +1715,7 @@ const ( PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_GET_THREAD_AREA = 0x19 PTRACE_GET_THREAD_AREA_3264 = 0xc4 PTRACE_GET_WATCH_REGS = 0xd0 @@ -1712,6 +1759,10 @@ const ( PTRACE_SET_WATCH_REGS = 0xd1 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_TRACEME = 0x0 QNX4_SUPER_MAGIC = 0x2f QNX6_SUPER_MAGIC = 0x68191122 @@ -1770,7 +1821,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1843,6 +1894,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1867,6 +1919,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1874,7 +1927,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1886,6 +1939,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1894,8 +1948,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -1980,6 +2034,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2118,6 +2174,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2420,6 +2477,71 @@ const ( TIOCSTI = 0x5472 TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x8000 TPACKET_ALIGNMENT = 0x10 @@ -2433,7 +2555,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2632,6 +2754,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2648,6 +2772,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 380759e..e0e89aa 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -721,6 +731,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -986,6 +997,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1084,6 +1096,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1096,6 +1119,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1148,6 +1173,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1326,6 +1365,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1390,6 +1430,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1655,6 +1699,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1669,6 +1715,7 @@ const ( PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_GET_THREAD_AREA = 0x19 PTRACE_GET_THREAD_AREA_3264 = 0xc4 PTRACE_GET_WATCH_REGS = 0xd0 @@ -1712,6 +1759,10 @@ const ( PTRACE_SET_WATCH_REGS = 0xd1 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_TRACEME = 0x0 QNX4_SUPER_MAGIC = 0x2f QNX6_SUPER_MAGIC = 0x68191122 @@ -1770,7 +1821,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1843,6 +1894,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1867,6 +1919,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1874,7 +1927,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1886,6 +1939,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1894,8 +1948,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -1980,6 +2034,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2118,6 +2174,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2420,6 +2477,71 @@ const ( TIOCSTI = 0x5472 TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x8000 TPACKET_ALIGNMENT = 0x10 @@ -2433,7 +2555,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2632,6 +2754,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2648,6 +2772,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 56050eb..fc68959 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -721,6 +731,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -986,6 +997,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1084,6 +1096,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1096,6 +1119,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1148,6 +1173,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1326,6 +1365,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x20 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1390,6 +1430,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1655,6 +1699,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1669,6 +1715,7 @@ const ( PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_GET_THREAD_AREA = 0x19 PTRACE_GET_THREAD_AREA_3264 = 0xc4 PTRACE_GET_WATCH_REGS = 0xd0 @@ -1712,6 +1759,10 @@ const ( PTRACE_SET_WATCH_REGS = 0xd1 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_TRACEME = 0x0 QNX4_SUPER_MAGIC = 0x2f QNX6_SUPER_MAGIC = 0x68191122 @@ -1770,7 +1821,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1843,6 +1894,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1867,6 +1919,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1874,7 +1927,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1886,6 +1939,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1894,8 +1948,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -1980,6 +2034,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2118,6 +2174,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2420,6 +2477,71 @@ const ( TIOCSTI = 0x5472 TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x8000 TPACKET_ALIGNMENT = 0x10 @@ -2433,7 +2555,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2632,6 +2754,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2648,6 +2772,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 11047e0..bd64b9a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -721,6 +731,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -986,6 +997,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1084,6 +1096,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1096,6 +1119,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1148,6 +1173,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1325,6 +1364,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1391,6 +1431,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80000000 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1657,6 +1701,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1676,6 +1722,7 @@ const ( PTRACE_GETVRREGS = 0x12 PTRACE_GETVSRREGS = 0x1b PTRACE_GET_DEBUGREG = 0x19 + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 @@ -1715,6 +1762,10 @@ const ( PTRACE_SINGLEBLOCK = 0x100 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_SYSEMU = 0x1d PTRACE_SYSEMU_SINGLESTEP = 0x1e PTRACE_TRACEME = 0x0 @@ -1828,7 +1879,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1901,6 +1952,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1925,6 +1977,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1932,7 +1985,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1944,6 +1997,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1952,8 +2006,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -2038,6 +2092,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2176,6 +2232,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2480,6 +2537,71 @@ const ( TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x400000 TPACKET_ALIGNMENT = 0x10 @@ -2493,7 +2615,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2691,6 +2813,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2707,6 +2831,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0xc00 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 38bf9e8..d9ec056 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -721,6 +731,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -986,6 +997,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1084,6 +1096,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1096,6 +1119,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1148,6 +1173,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1325,6 +1364,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1391,6 +1431,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80000000 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1657,6 +1701,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1676,6 +1722,7 @@ const ( PTRACE_GETVRREGS = 0x12 PTRACE_GETVSRREGS = 0x1b PTRACE_GET_DEBUGREG = 0x19 + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 @@ -1715,6 +1762,10 @@ const ( PTRACE_SINGLEBLOCK = 0x100 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_SYSEMU = 0x1d PTRACE_SYSEMU_SINGLESTEP = 0x1e PTRACE_TRACEME = 0x0 @@ -1828,7 +1879,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1901,6 +1952,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1925,6 +1977,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1932,7 +1985,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1944,6 +1997,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1952,8 +2006,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -2038,6 +2092,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2176,6 +2232,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2480,6 +2537,71 @@ const ( TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x400000 TPACKET_ALIGNMENT = 0x10 @@ -2493,7 +2615,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2691,6 +2813,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2707,6 +2831,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0xc00 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index 852a5c6..ac8a498 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -721,6 +731,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -986,6 +997,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1084,6 +1096,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1096,6 +1119,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1148,6 +1173,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1326,6 +1365,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1390,6 +1430,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1655,6 +1699,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1668,6 +1714,7 @@ const ( PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 @@ -1700,6 +1747,10 @@ const ( PTRACE_SETSIGMASK = 0x420b PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_TRACEME = 0x0 QNX4_SUPER_MAGIC = 0x2f QNX6_SUPER_MAGIC = 0x68191122 @@ -1758,7 +1809,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1831,6 +1882,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1855,6 +1907,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1862,7 +1915,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1874,6 +1927,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1882,8 +1936,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -1968,6 +2022,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2106,6 +2162,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2406,6 +2463,71 @@ const ( TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x100 TPACKET_ALIGNMENT = 0x10 @@ -2419,7 +2541,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2617,6 +2739,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2633,6 +2757,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 42d4549..452eeb0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -253,6 +253,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -304,9 +305,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -459,7 +461,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -560,6 +569,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -721,6 +731,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -986,6 +997,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1084,6 +1096,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1096,6 +1119,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1148,6 +1173,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1326,6 +1365,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1390,6 +1430,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1657,6 +1701,8 @@ const ( PTRACE_DETACH = 0x11 PTRACE_DISABLE_TE = 0x5010 PTRACE_ENABLE_TE = 0x5009 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1671,6 +1717,7 @@ const ( PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a PTRACE_GET_LAST_BREAK = 0x5006 + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 @@ -1714,6 +1761,10 @@ const ( PTRACE_SINGLEBLOCK = 0xc PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_TE_ABORT_RAND = 0x5011 PTRACE_TRACEME = 0x0 PT_ACR0 = 0x90 @@ -1831,7 +1882,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1904,6 +1955,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1928,6 +1980,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1935,7 +1988,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1947,6 +2000,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1955,8 +2009,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -2041,6 +2095,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2179,6 +2235,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2479,6 +2536,71 @@ const ( TIOCSTI = 0x5412 TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x100 TPACKET_ALIGNMENT = 0x10 @@ -2492,7 +2614,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2690,6 +2812,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2706,6 +2830,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index cc80e7a..e93c0c8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -256,6 +256,7 @@ const ( BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 @@ -307,9 +308,10 @@ const ( BPF_RET = 0x6 BPF_RSH = 0x70 BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 BPF_ST = 0x2 BPF_STX = 0x3 @@ -462,7 +464,14 @@ const ( CSUSP = 0x1a DAXFS_MAGIC = 0x64646178 DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 @@ -564,6 +573,7 @@ const ( ETH_P_IRDA = 0x17 ETH_P_LAT = 0x6004 ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc ETH_P_LOCALTALK = 0x9 ETH_P_LOOP = 0x60 ETH_P_LOOPBACK = 0x9000 @@ -725,6 +735,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x1 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -990,6 +1001,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1088,6 +1100,17 @@ const ( KEXEC_PRESERVE_CONTEXT = 0x2 KEXEC_SEGMENT_MAX = 0x10 KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 KEYCTL_CHOWN = 0x4 KEYCTL_CLEAR = 0x7 KEYCTL_DESCRIBE = 0x6 @@ -1100,6 +1123,8 @@ const ( KEYCTL_INVALIDATE = 0x15 KEYCTL_JOIN_SESSION_KEYRING = 0x1 KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 KEYCTL_NEGATE = 0xd KEYCTL_PKEY_DECRYPT = 0x1a KEYCTL_PKEY_ENCRYPT = 0x19 @@ -1152,6 +1177,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1330,6 +1369,7 @@ const ( NETLINK_XFRM = 0x6 NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 NFNLGRP_CONNTRACK_DESTROY = 0x3 @@ -1394,6 +1434,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1659,6 +1703,8 @@ const ( PTRACE_ATTACH = 0x10 PTRACE_CONT = 0x7 PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 PTRACE_EVENT_CLONE = 0x3 PTRACE_EVENT_EXEC = 0x4 PTRACE_EVENT_EXIT = 0x6 @@ -1676,6 +1722,7 @@ const ( PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 @@ -1715,6 +1762,10 @@ const ( PTRACE_SINGLESTEP = 0x9 PTRACE_SPARC_DETACH = 0xb PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 PTRACE_TRACEME = 0x0 PTRACE_WRITEDATA = 0x11 PTRACE_WRITETEXT = 0x13 @@ -1823,7 +1874,7 @@ const ( RTAX_UNSPEC = 0x0 RTAX_WINDOW = 0x3 RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1d + RTA_MAX = 0x1e RTCF_DIRECTSRC = 0x4000000 RTCF_DOREDIRECT = 0x1000000 RTCF_LOG = 0x2000000 @@ -1896,6 +1947,7 @@ const ( RTM_DELMDB = 0x55 RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -1920,6 +1972,7 @@ const ( RTM_GETNEIGH = 0x1e RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -1927,7 +1980,7 @@ const ( RTM_GETSTATS = 0x5e RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e - RTM_MAX = 0x67 + RTM_MAX = 0x6b RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -1939,6 +1992,7 @@ const ( RTM_NEWNEIGH = 0x1c RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 RTM_NEWNSID = 0x58 RTM_NEWPREFIX = 0x34 RTM_NEWQDISC = 0x24 @@ -1947,8 +2001,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x16 - RTM_NR_MSGTYPES = 0x58 + RTM_NR_FAMILIES = 0x17 + RTM_NR_MSGTYPES = 0x5c RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -2033,6 +2087,8 @@ const ( SIOCDRARP = 0x8960 SIOCETHTOOL = 0x8946 SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 SIOCGHWTSTAMP = 0x89b1 SIOCGIFADDR = 0x8915 SIOCGIFBR = 0x8940 @@ -2171,6 +2227,7 @@ const ( SO_DEBUG = 0x1 SO_DETACH_BPF = 0x1b SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x47 SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 @@ -2468,6 +2525,71 @@ const ( TIOCSTOP = 0x2000746f TIOCSWINSZ = 0x80087467 TIOCVHANGUP = 0x20005437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff TMPFS_MAGIC = 0x1021994 TOSTOP = 0x100 TPACKET_ALIGNMENT = 0x10 @@ -2481,7 +2603,7 @@ const ( TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 TP_STATUS_TS_SOFTWARE = 0x20000000 TP_STATUS_TS_SYS_HARDWARE = 0x40000000 TP_STATUS_USER = 0x1 @@ -2679,6 +2801,8 @@ const ( XDP_FLAGS_SKB_MODE = 0x2 XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 XDP_PACKET_HEADROOM = 0x100 XDP_PGOFF_RX_RING = 0x0 XDP_PGOFF_TX_RING = 0x80000000 @@ -2695,6 +2819,7 @@ const ( XENFS_SUPER_MAGIC = 0xabba1974 XFS_SUPER_MAGIC = 0x58465342 XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 ZSMALLOC_MAGIC = 0x58295829 __TIOCFLUSH = 0x80047410 ) diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go index 78cc04e..96b9b8a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go @@ -3,7 +3,7 @@ // +build 386,netbsd -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m32 _const.go package unix @@ -1085,6 +1085,7 @@ const ( NET_RT_MAXID = 0x6 NET_RT_OIFLIST = 0x4 NET_RT_OOIFLIST = 0x3 + NFDBITS = 0x20 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go index 92185e6..ed522a8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go @@ -3,7 +3,7 @@ // +build amd64,netbsd -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go package unix @@ -1075,6 +1075,7 @@ const ( NET_RT_MAXID = 0x6 NET_RT_OIFLIST = 0x4 NET_RT_OOIFLIST = 0x3 + NFDBITS = 0x20 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go index 373ad45..c8d36fe 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go @@ -3,7 +3,7 @@ // +build arm,netbsd -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -marm _const.go package unix @@ -1065,6 +1065,7 @@ const ( NET_RT_MAXID = 0x6 NET_RT_OIFLIST = 0x4 NET_RT_OOIFLIST = 0x3 + NFDBITS = 0x20 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go index fb6c604..f1c146a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go @@ -3,7 +3,7 @@ // +build arm64,netbsd -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go package unix @@ -1075,6 +1075,7 @@ const ( NET_RT_MAXID = 0x6 NET_RT_OIFLIST = 0x4 NET_RT_OOIFLIST = 0x3 + NFDBITS = 0x20 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go index d8be045..5402bd5 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go @@ -3,7 +3,7 @@ // +build 386,openbsd -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m32 _const.go package unix @@ -881,14 +881,15 @@ const ( MADV_SPACEAVAIL = 0x5 MADV_WILLNEED = 0x3 MAP_ANON = 0x1000 - MAP_COPY = 0x4 + MAP_ANONYMOUS = 0x1000 + MAP_CONCEAL = 0x8000 + MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 - MAP_FLAGMASK = 0x1ff7 - MAP_HASSEMAPHORE = 0x200 - MAP_INHERIT = 0x80 + MAP_FLAGMASK = 0xfff7 + MAP_HASSEMAPHORE = 0x0 + MAP_INHERIT = 0x0 MAP_INHERIT_COPY = 0x1 - MAP_INHERIT_DONATE_COPY = 0x3 MAP_INHERIT_NONE = 0x2 MAP_INHERIT_SHARE = 0x0 MAP_NOEXTEND = 0x100 @@ -896,7 +897,8 @@ const ( MAP_PRIVATE = 0x2 MAP_RENAME = 0x20 MAP_SHARED = 0x1 - MAP_TRYFIXED = 0x400 + MAP_STACK = 0x4000 + MAP_TRYFIXED = 0x0 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MNT_ASYNC = 0x40 @@ -946,6 +948,7 @@ const ( NET_RT_MAXID = 0x6 NET_RT_STATS = 0x4 NET_RT_TABLE = 0x5 + NFDBITS = 0x20 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go index 1f9e8a2..ffaf2d2 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go @@ -3,7 +3,7 @@ // +build amd64,openbsd -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go package unix @@ -920,10 +920,11 @@ const ( MADV_WILLNEED = 0x3 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 + MAP_CONCEAL = 0x8000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 - MAP_FLAGMASK = 0x7ff7 + MAP_FLAGMASK = 0xfff7 MAP_HASSEMAPHORE = 0x0 MAP_INHERIT = 0x0 MAP_INHERIT_COPY = 0x1 @@ -990,6 +991,7 @@ const ( NET_RT_MAXID = 0x7 NET_RT_STATS = 0x4 NET_RT_TABLE = 0x5 + NFDBITS = 0x20 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go index 79d5695..7aa796a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go @@ -1,11 +1,11 @@ // mkerrors.sh // Code generated by the command above; see README.md. DO NOT EDIT. -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- _const.go - // +build arm,openbsd +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- _const.go + package unix import "syscall" @@ -881,10 +881,11 @@ const ( MADV_WILLNEED = 0x3 MAP_ANON = 0x1000 MAP_ANONYMOUS = 0x1000 + MAP_CONCEAL = 0x8000 MAP_COPY = 0x2 MAP_FILE = 0x0 MAP_FIXED = 0x10 - MAP_FLAGMASK = 0x3ff7 + MAP_FLAGMASK = 0xfff7 MAP_HASSEMAPHORE = 0x0 MAP_INHERIT = 0x0 MAP_INHERIT_COPY = 0x1 @@ -896,6 +897,7 @@ const ( MAP_PRIVATE = 0x2 MAP_RENAME = 0x0 MAP_SHARED = 0x1 + MAP_STACK = 0x4000 MAP_TRYFIXED = 0x0 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 @@ -947,6 +949,7 @@ const ( NET_RT_MAXID = 0x6 NET_RT_STATS = 0x4 NET_RT_TABLE = 0x5 + NFDBITS = 0x20 NOFLSH = 0x80000000 NOTE_ATTRIB = 0x8 NOTE_CHILD = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go index ec5f92d..1792d3f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go @@ -996,6 +996,7 @@ const ( NET_RT_MAXID = 0x7 NET_RT_STATS = 0x4 NET_RT_TABLE = 0x5 + NFDBITS = 0x20 NOFLSH = 0x80000000 NOKERNINFO = 0x2000000 NOTE_ATTRIB = 0x8 diff --git a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go index 22569db..46e054c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go @@ -3,7 +3,7 @@ // +build amd64,solaris -// Created by cgo -godefs - DO NOT EDIT +// Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs -- -m64 _const.go package unix @@ -666,6 +666,7 @@ const ( M_FLUSH = 0x86 NAME_MAX = 0xff NEWDEV = 0x1 + NFDBITS = 0x40 NL0 = 0x0 NL1 = 0x100 NLDLY = 0x100 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go index c4ec7ff..b5ed805 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -l32 -tags darwin,386,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go +// go run mksyscall.go -l32 -tags darwin,386,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_386.1_11.go syscall_darwin_386.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,386,!go1.12 @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,16 +361,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := Syscall6(SYS_GETATTRLIST, uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -573,6 +547,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) { _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(offset>>32), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags), 0, 0) if e1 != 0 { @@ -1352,8 +1342,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -1691,6 +1682,33 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) sec = int32(r0) @@ -1738,23 +1756,6 @@ func Fstatfs(fd int, stat *Statfs_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(buf), uintptr(size), uintptr(flags)) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go new file mode 100644 index 0000000..e263fbd --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go @@ -0,0 +1,41 @@ +// go run mksyscall.go -l32 -tags darwin,386,go1.13 syscall_darwin.1_13.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,386,go1.13 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func closedir(dir uintptr) (err error) { + _, _, e1 := syscall_syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_closedir_trampoline() + +//go:linkname libc_closedir libc_closedir +//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { + r0, _, _ := syscall_syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result))) + res = Errno(r0) + return +} + +func libc_readdir_r_trampoline() + +//go:linkname libc_readdir_r libc_readdir_r +//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.s new file mode 100644 index 0000000..00da1eb --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.s @@ -0,0 +1,12 @@ +// go run mkasm_darwin.go 386 +// Code generated by the command above; DO NOT EDIT. + +// +build go1.13 + +#include "textflag.h" +TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fdopendir(SB) +TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_closedir(SB) +TEXT ·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0 + JMP libc_readdir_r(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go index 23346dc..cdf8a70 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -304,27 +304,6 @@ func libc_kevent_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := syscall_syscall6(funcPC(libc___sysctl_trampoline), uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc___sysctl_trampoline() - -//go:linkname libc___sysctl libc___sysctl -//go:cgo_import_dynamic libc___sysctl __sysctl "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -527,21 +506,6 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_ptrace_trampoline() - -//go:linkname libc_ptrace libc_ptrace -//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_getattrlist_trampoline), uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -793,6 +757,27 @@ func libc_ioctl_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall6(funcPC(libc_sysctl_trampoline), uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_sysctl_trampoline() + +//go:linkname libc_sysctl libc_sysctl +//go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) { _, _, e1 := syscall_syscall9(funcPC(libc_sendfile_trampoline), uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(offset>>32), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags), 0, 0) if e1 != 0 { @@ -943,6 +928,21 @@ func libc_chroot_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := syscall_syscall(funcPC(libc_clock_gettime_trampoline), uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_clock_gettime_trampoline() + +//go:linkname libc_clock_gettime libc_clock_gettime +//go:cgo_import_dynamic libc_clock_gettime clock_gettime "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := syscall_syscall(funcPC(libc_close_trampoline), uintptr(fd), 0, 0) if e1 != 0 { @@ -1872,8 +1872,9 @@ func libc_lseek_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2341,6 +2342,21 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_ptrace_trampoline() + +//go:linkname libc_ptrace libc_ptrace +//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { r0, r1, e1 := syscall_rawSyscall(funcPC(libc_gettimeofday_trampoline), uintptr(unsafe.Pointer(tp)), 0, 0) sec = int32(r0) @@ -2408,28 +2424,6 @@ func libc_fstatfs64_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := syscall_syscall6(funcPC(libc___getdirentries64_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc___getdirentries64_trampoline() - -//go:linkname libc___getdirentries64 libc___getdirentries64 -//go:cgo_import_dynamic libc___getdirentries64 __getdirentries64 "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) { r0, _, e1 := syscall_syscall(funcPC(libc_getfsstat64_trampoline), uintptr(buf), uintptr(size), uintptr(flags)) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s index 37b85b4..9cae5b1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s @@ -40,8 +40,6 @@ TEXT ·libc_sendmsg_trampoline(SB),NOSPLIT,$0-0 JMP libc_sendmsg(SB) TEXT ·libc_kevent_trampoline(SB),NOSPLIT,$0-0 JMP libc_kevent(SB) -TEXT ·libc___sysctl_trampoline(SB),NOSPLIT,$0-0 - JMP libc___sysctl(SB) TEXT ·libc_utimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0 @@ -64,8 +62,6 @@ TEXT ·libc_munlock_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) TEXT ·libc_munlockall_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) -TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 - JMP libc_ptrace(SB) TEXT ·libc_getattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_getattrlist(SB) TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0 @@ -92,6 +88,8 @@ TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0 JMP libc_kill(SB) TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) +TEXT ·libc_sysctl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) TEXT ·libc_access_trampoline(SB),NOSPLIT,$0-0 @@ -264,6 +262,8 @@ TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_munmap(SB) +TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 + JMP libc_ptrace(SB) TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0 JMP libc_gettimeofday(SB) TEXT ·libc_fstat64_trampoline(SB),NOSPLIT,$0-0 @@ -272,8 +272,6 @@ TEXT ·libc_fstatat64_trampoline(SB),NOSPLIT,$0-0 JMP libc_fstatat64(SB) TEXT ·libc_fstatfs64_trampoline(SB),NOSPLIT,$0-0 JMP libc_fstatfs64(SB) -TEXT ·libc___getdirentries64_trampoline(SB),NOSPLIT,$0-0 - JMP libc___getdirentries64(SB) TEXT ·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0 JMP libc_getfsstat64(SB) TEXT ·libc_lstat64_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go index 2581e89..8bde823 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -tags darwin,amd64,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go +// go run mksyscall.go -tags darwin,amd64,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.1_11.go syscall_darwin_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,amd64,!go1.12 @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,16 +361,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := Syscall6(SYS_GETATTRLIST, uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -573,6 +547,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) { _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags)) if e1 != 0 { @@ -1352,8 +1342,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -1691,6 +1682,33 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) sec = int64(r0) @@ -1738,23 +1756,6 @@ func Fstatfs(fd int, stat *Statfs_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) { r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(buf), uintptr(size), uintptr(flags)) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go new file mode 100644 index 0000000..314042a --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go @@ -0,0 +1,41 @@ +// go run mksyscall.go -tags darwin,amd64,go1.13 syscall_darwin.1_13.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,amd64,go1.13 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func closedir(dir uintptr) (err error) { + _, _, e1 := syscall_syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_closedir_trampoline() + +//go:linkname libc_closedir libc_closedir +//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { + r0, _, _ := syscall_syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result))) + res = Errno(r0) + return +} + +func libc_readdir_r_trampoline() + +//go:linkname libc_readdir_r libc_readdir_r +//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s new file mode 100644 index 0000000..d671e83 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s @@ -0,0 +1,12 @@ +// go run mkasm_darwin.go amd64 +// Code generated by the command above; DO NOT EDIT. + +// +build go1.13 + +#include "textflag.h" +TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fdopendir(SB) +TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_closedir(SB) +TEXT ·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0 + JMP libc_readdir_r(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index c142e33..63b51fb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -304,27 +304,6 @@ func libc_kevent_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := syscall_syscall6(funcPC(libc___sysctl_trampoline), uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc___sysctl_trampoline() - -//go:linkname libc___sysctl libc___sysctl -//go:cgo_import_dynamic libc___sysctl __sysctl "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -527,21 +506,6 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_ptrace_trampoline() - -//go:linkname libc_ptrace libc_ptrace -//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_getattrlist_trampoline), uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -793,6 +757,27 @@ func libc_ioctl_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall6(funcPC(libc_sysctl_trampoline), uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_sysctl_trampoline() + +//go:linkname libc_sysctl libc_sysctl +//go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_sendfile_trampoline), uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags)) if e1 != 0 { @@ -1887,8 +1872,9 @@ func libc_lseek_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2356,6 +2342,21 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_ptrace_trampoline() + +//go:linkname libc_ptrace libc_ptrace +//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { r0, r1, e1 := syscall_rawSyscall(funcPC(libc_gettimeofday_trampoline), uintptr(unsafe.Pointer(tp)), 0, 0) sec = int64(r0) @@ -2423,28 +2424,6 @@ func libc_fstatfs64_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := syscall_syscall6(funcPC(libc___getdirentries64_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc___getdirentries64_trampoline() - -//go:linkname libc___getdirentries64 libc___getdirentries64 -//go:cgo_import_dynamic libc___getdirentries64 __getdirentries64 "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) { r0, _, e1 := syscall_syscall(funcPC(libc_getfsstat64_trampoline), uintptr(buf), uintptr(size), uintptr(flags)) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index 1a39151..1a0e52a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -40,8 +40,6 @@ TEXT ·libc_sendmsg_trampoline(SB),NOSPLIT,$0-0 JMP libc_sendmsg(SB) TEXT ·libc_kevent_trampoline(SB),NOSPLIT,$0-0 JMP libc_kevent(SB) -TEXT ·libc___sysctl_trampoline(SB),NOSPLIT,$0-0 - JMP libc___sysctl(SB) TEXT ·libc_utimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0 @@ -64,8 +62,6 @@ TEXT ·libc_munlock_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) TEXT ·libc_munlockall_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) -TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 - JMP libc_ptrace(SB) TEXT ·libc_getattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_getattrlist(SB) TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0 @@ -92,6 +88,8 @@ TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0 JMP libc_kill(SB) TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) +TEXT ·libc_sysctl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) TEXT ·libc_access_trampoline(SB),NOSPLIT,$0-0 @@ -266,6 +264,8 @@ TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_munmap(SB) +TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 + JMP libc_ptrace(SB) TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0 JMP libc_gettimeofday(SB) TEXT ·libc_fstat64_trampoline(SB),NOSPLIT,$0-0 @@ -274,8 +274,6 @@ TEXT ·libc_fstatat64_trampoline(SB),NOSPLIT,$0-0 JMP libc_fstatat64(SB) TEXT ·libc_fstatfs64_trampoline(SB),NOSPLIT,$0-0 JMP libc_fstatfs64(SB) -TEXT ·libc___getdirentries64_trampoline(SB),NOSPLIT,$0-0 - JMP libc___getdirentries64(SB) TEXT ·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0 JMP libc_getfsstat64(SB) TEXT ·libc_lstat64_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go index f8caece..63a236b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -l32 -tags darwin,arm,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go +// go run mksyscall.go -l32 -tags darwin,arm,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm.1_11.go syscall_darwin_arm.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,arm,!go1.12 @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,16 +361,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := Syscall6(SYS_GETATTRLIST, uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -573,6 +547,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) { _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(offset>>32), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags), 0, 0) if e1 != 0 { @@ -1352,8 +1342,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go new file mode 100644 index 0000000..f519ce9 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go @@ -0,0 +1,41 @@ +// go run mksyscall.go -l32 -tags darwin,arm,go1.13 syscall_darwin.1_13.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,arm,go1.13 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func closedir(dir uintptr) (err error) { + _, _, e1 := syscall_syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_closedir_trampoline() + +//go:linkname libc_closedir libc_closedir +//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { + r0, _, _ := syscall_syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result))) + res = Errno(r0) + return +} + +func libc_readdir_r_trampoline() + +//go:linkname libc_readdir_r libc_readdir_r +//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.s new file mode 100644 index 0000000..488e557 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.s @@ -0,0 +1,12 @@ +// go run mkasm_darwin.go arm +// Code generated by the command above; DO NOT EDIT. + +// +build go1.13 + +#include "textflag.h" +TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fdopendir(SB) +TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_closedir(SB) +TEXT ·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0 + JMP libc_readdir_r(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go index 01cffbf..adb8668 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -304,27 +304,6 @@ func libc_kevent_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := syscall_syscall6(funcPC(libc___sysctl_trampoline), uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc___sysctl_trampoline() - -//go:linkname libc___sysctl libc___sysctl -//go:cgo_import_dynamic libc___sysctl __sysctl "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -527,21 +506,6 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_ptrace_trampoline() - -//go:linkname libc_ptrace libc_ptrace -//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_getattrlist_trampoline), uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -793,6 +757,27 @@ func libc_ioctl_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall6(funcPC(libc_sysctl_trampoline), uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_sysctl_trampoline() + +//go:linkname libc_sysctl libc_sysctl +//go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) { _, _, e1 := syscall_syscall9(funcPC(libc_sendfile_trampoline), uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(offset>>32), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags), 0, 0) if e1 != 0 { @@ -943,6 +928,21 @@ func libc_chroot_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := syscall_syscall(funcPC(libc_clock_gettime_trampoline), uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_clock_gettime_trampoline() + +//go:linkname libc_clock_gettime libc_clock_gettime +//go:cgo_import_dynamic libc_clock_gettime clock_gettime "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := syscall_syscall(funcPC(libc_close_trampoline), uintptr(fd), 0, 0) if e1 != 0 { @@ -1872,8 +1872,9 @@ func libc_lseek_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s index 994056f..5bebb1b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s @@ -40,8 +40,6 @@ TEXT ·libc_sendmsg_trampoline(SB),NOSPLIT,$0-0 JMP libc_sendmsg(SB) TEXT ·libc_kevent_trampoline(SB),NOSPLIT,$0-0 JMP libc_kevent(SB) -TEXT ·libc___sysctl_trampoline(SB),NOSPLIT,$0-0 - JMP libc___sysctl(SB) TEXT ·libc_utimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0 @@ -64,8 +62,6 @@ TEXT ·libc_munlock_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) TEXT ·libc_munlockall_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) -TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 - JMP libc_ptrace(SB) TEXT ·libc_getattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_getattrlist(SB) TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0 @@ -108,6 +104,8 @@ TEXT ·libc_chown_trampoline(SB),NOSPLIT,$0-0 JMP libc_chown(SB) TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0 JMP libc_chroot(SB) +TEXT ·libc_clock_gettime_trampoline(SB),NOSPLIT,$0-0 + JMP libc_clock_gettime(SB) TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0 JMP libc_close(SB) TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go index 3fd0f3c..87c0b61 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go @@ -1,4 +1,4 @@ -// go run mksyscall.go -tags darwin,arm64,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go +// go run mksyscall.go -tags darwin,arm64,!go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.1_11.go syscall_darwin_arm64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build darwin,arm64,!go1.12 @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,16 +361,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := Syscall6(SYS_GETATTRLIST, uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -573,6 +547,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) { _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags)) if e1 != 0 { @@ -1352,8 +1342,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go new file mode 100644 index 0000000..d64e6c8 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go @@ -0,0 +1,41 @@ +// go run mksyscall.go -tags darwin,arm64,go1.13 syscall_darwin.1_13.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,arm64,go1.13 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func closedir(dir uintptr) (err error) { + _, _, e1 := syscall_syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_closedir_trampoline() + +//go:linkname libc_closedir libc_closedir +//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { + r0, _, _ := syscall_syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result))) + res = Errno(r0) + return +} + +func libc_readdir_r_trampoline() + +//go:linkname libc_readdir_r libc_readdir_r +//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s new file mode 100644 index 0000000..b29dabb --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s @@ -0,0 +1,12 @@ +// go run mkasm_darwin.go arm64 +// Code generated by the command above; DO NOT EDIT. + +// +build go1.13 + +#include "textflag.h" +TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fdopendir(SB) +TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_closedir(SB) +TEXT ·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0 + JMP libc_readdir_r(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index 8f2691d..c882a4f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -304,27 +304,6 @@ func libc_kevent_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := syscall_syscall6(funcPC(libc___sysctl_trampoline), uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc___sysctl_trampoline() - -//go:linkname libc___sysctl libc___sysctl -//go:cgo_import_dynamic libc___sysctl __sysctl "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -527,21 +506,6 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_ptrace_trampoline() - -//go:linkname libc_ptrace libc_ptrace -//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_getattrlist_trampoline), uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -793,6 +757,27 @@ func libc_ioctl_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall6(funcPC(libc_sysctl_trampoline), uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_sysctl_trampoline() + +//go:linkname libc_sysctl libc_sysctl +//go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_sendfile_trampoline), uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags)) if e1 != 0 { @@ -943,6 +928,21 @@ func libc_chroot_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := syscall_syscall(funcPC(libc_clock_gettime_trampoline), uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_clock_gettime_trampoline() + +//go:linkname libc_clock_gettime libc_clock_gettime +//go:cgo_import_dynamic libc_clock_gettime clock_gettime "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := syscall_syscall(funcPC(libc_close_trampoline), uintptr(fd), 0, 0) if e1 != 0 { @@ -1872,8 +1872,9 @@ func libc_lseek_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := syscall_syscall6(funcPC(libc_select_trampoline), uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index 61dc0d4..19faa4d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -40,8 +40,6 @@ TEXT ·libc_sendmsg_trampoline(SB),NOSPLIT,$0-0 JMP libc_sendmsg(SB) TEXT ·libc_kevent_trampoline(SB),NOSPLIT,$0-0 JMP libc_kevent(SB) -TEXT ·libc___sysctl_trampoline(SB),NOSPLIT,$0-0 - JMP libc___sysctl(SB) TEXT ·libc_utimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0 @@ -64,8 +62,6 @@ TEXT ·libc_munlock_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) TEXT ·libc_munlockall_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) -TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 - JMP libc_ptrace(SB) TEXT ·libc_getattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_getattrlist(SB) TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0 @@ -92,6 +88,8 @@ TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0 JMP libc_kill(SB) TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) +TEXT ·libc_sysctl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) TEXT ·libc_access_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index cdfe931..df199b3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -1272,8 +1272,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index a783306..e68185f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -1606,8 +1606,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index f995520..2f77f93 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,8 +361,14 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } @@ -387,8 +377,8 @@ func pipe2(p *[2]_C_int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data int) (err error) { - _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } @@ -424,6 +414,16 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data int) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1606,8 +1606,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index d681acd..e9a12c9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,8 +361,14 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) if e1 != 0 { err = errnoErr(e1) } @@ -387,8 +377,8 @@ func pipe2(p *[2]_C_int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data int) (err error) { - _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } @@ -424,6 +414,16 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data int) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1606,8 +1606,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index 5049b2e..27ab0fb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,6 +361,22 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { @@ -404,8 +404,8 @@ func Getcwd(buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data int) (err error) { - _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) } @@ -414,8 +414,8 @@ func ptrace(request int, pid int, addr uintptr, data int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctl(fd int, req uint, arg uintptr) (err error) { - _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) +func ptrace(request int, pid int, addr uintptr, data int) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1606,8 +1606,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index c5e46e4..fe5d462 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index da8819e..536abce 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 6ad9be6..37823cd 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index f883317..794f612 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 8eebc6c..1b34b55 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index ecf62a6..5714e25 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index 1ba0f7b..88a6b33 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index 20012b2..c09dbe3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 2b520de..42f6c21 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index d9f044c..de2cd8d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 9feed65..d51bf07 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 0a65150..1e3a3cb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index e27f669..3c97008 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -305,6 +305,36 @@ func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(restriction) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlRestrictKeyring(cmd int, arg2 int) (err error) { + _, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 7e05826..5ade42c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,6 +361,22 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -1498,8 +1498,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index d94d076..3e0bbc5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,6 +361,22 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -1498,8 +1498,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index cf5bf3d..cb0af13 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,6 +361,22 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -1498,8 +1498,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 243a931..6fd48d3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,6 +361,22 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -1498,8 +1498,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index a9532d0..2938e41 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,6 +361,22 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { @@ -1304,8 +1304,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 0cb9f01..22b79ab 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,6 +361,22 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { @@ -1304,8 +1304,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index 6fc99b5..cb921f3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,6 +361,22 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { @@ -1304,8 +1304,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index 27878a7..5a74380 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -214,22 +214,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimes(path string, timeval *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -377,6 +361,22 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe(p *[2]_C_int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { @@ -1304,8 +1304,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index 5f61476..a96165d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -1478,8 +1478,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSelect)), 5, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSelect)), 5, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) if e1 != 0 { err = e1 } diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index e869c06..7aae554 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -429,4 +429,6 @@ const ( SYS_FSCONFIG = 431 SYS_FSMOUNT = 432 SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 4917b8a..7968439 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -351,4 +351,6 @@ const ( SYS_FSCONFIG = 431 SYS_FSMOUNT = 432 SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index f85fcb4..3c663c6 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -393,4 +393,6 @@ const ( SYS_FSCONFIG = 431 SYS_FSMOUNT = 432 SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 678a119..753def9 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -296,4 +296,5 @@ const ( SYS_FSCONFIG = 431 SYS_FSMOUNT = 432 SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 222c9f9..ac86bd5 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -414,4 +414,5 @@ const ( SYS_FSCONFIG = 4431 SYS_FSMOUNT = 4432 SYS_FSPICK = 4433 + SYS_PIDFD_OPEN = 4434 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 28e6d0e..1f5705b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -344,4 +344,5 @@ const ( SYS_FSCONFIG = 5431 SYS_FSMOUNT = 5432 SYS_FSPICK = 5433 + SYS_PIDFD_OPEN = 5434 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index e643c6f..d9ed953 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -344,4 +344,5 @@ const ( SYS_FSCONFIG = 5431 SYS_FSMOUNT = 5432 SYS_FSPICK = 5433 + SYS_PIDFD_OPEN = 5434 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 01d93c4..94266b6 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -414,4 +414,5 @@ const ( SYS_FSCONFIG = 4431 SYS_FSMOUNT = 4432 SYS_FSPICK = 4433 + SYS_PIDFD_OPEN = 4434 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index 5744149..52e3da6 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -393,4 +393,6 @@ const ( SYS_FSCONFIG = 431 SYS_FSMOUNT = 432 SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 21c8320..6141f90 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -393,4 +393,6 @@ const ( SYS_FSCONFIG = 431 SYS_FSMOUNT = 432 SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index c1bb6d8..4f7261a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -295,4 +295,6 @@ const ( SYS_FSCONFIG = 431 SYS_FSMOUNT = 432 SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index bc3cc6b..f47014a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -358,4 +358,6 @@ const ( SYS_FSCONFIG = 431 SYS_FSMOUNT = 432 SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 0a2841b..dd78abb 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -373,4 +373,5 @@ const ( SYS_FSCONFIG = 431 SYS_FSMOUNT = 432 SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index 1542a87..c681d7d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -397,7 +397,7 @@ type Reg struct { } type FpReg struct { - Fp_q [32]uint128 + Fp_q [512]uint8 Fp_sr uint32 Fp_cr uint32 } diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 5492b96..2c94373 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -285,6 +285,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -425,6 +432,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 @@ -591,22 +599,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -614,6 +606,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -664,6 +657,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2468,6 +2468,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2484,3 +2520,238 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint16 + Inode uint32 + Rdevice uint16 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint32 + Reserved [4]int8 +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]int8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]int8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]int8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index caf33b2..1eedcb2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -285,6 +285,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -426,6 +433,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -592,22 +600,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -615,6 +607,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -665,6 +658,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2481,6 +2481,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2497,3 +2533,239 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint64 + Inode uint64 + Rdevice uint64 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]int8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]int8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]int8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 93aec7e..35ef7b3 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -289,6 +289,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -429,6 +436,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 @@ -595,22 +603,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -618,6 +610,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -668,6 +661,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2459,6 +2459,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2475,3 +2511,238 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint16 + Inode uint32 + Rdevice uint16 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint32 + Reserved [4]uint8 +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]uint8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]uint8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]uint8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 0a03843..054b187 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -286,6 +286,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -427,6 +434,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -593,22 +601,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -616,6 +608,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -666,6 +659,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2460,6 +2460,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2476,3 +2512,239 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]int8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]int8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]int8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 2de0e58..615ea3e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -288,6 +288,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -428,6 +435,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 @@ -594,22 +602,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -617,6 +609,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -667,6 +660,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2465,6 +2465,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2481,3 +2517,238 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint32 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint32 + Reserved [4]int8 +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]int8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]int8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]int8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 3735eb4..81a818b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -286,6 +286,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -427,6 +434,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -593,22 +601,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -616,6 +608,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -666,6 +659,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2462,6 +2462,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2478,3 +2514,239 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]int8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]int8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]int8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 073c299..214e345 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -286,6 +286,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -427,6 +434,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -593,22 +601,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -616,6 +608,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -666,6 +659,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2462,6 +2462,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2478,3 +2514,239 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]int8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]int8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]int8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 58d09f7..9741cff 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -288,6 +288,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -428,6 +435,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 @@ -594,22 +602,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -617,6 +609,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -667,6 +660,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2465,6 +2465,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2481,3 +2517,238 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint32 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint32 + Reserved [4]int8 +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]int8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]int8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]int8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 3f1e62e..123e875 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -287,6 +287,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -428,6 +435,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -594,22 +602,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -617,6 +609,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -667,6 +660,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2470,6 +2470,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2486,3 +2522,239 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint64 + Inode uint64 + Rdevice uint64 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]uint8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]uint8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]uint8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]uint8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index e67be11..c9ca0a2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -287,6 +287,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -428,6 +435,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -594,22 +602,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -617,6 +609,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -667,6 +660,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2470,6 +2470,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2486,3 +2522,239 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint64 + Inode uint64 + Rdevice uint64 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]uint8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]uint8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]uint8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]uint8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index f44f294..9b205aa 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -286,6 +286,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -427,6 +434,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -593,22 +601,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -616,6 +608,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -666,6 +659,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -808,6 +808,7 @@ type Ustat_t struct { type EpollEvent struct { Events uint32 + _ int32 Fd int32 Pad int32 } @@ -2487,6 +2488,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2503,3 +2540,239 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]uint8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]uint8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]uint8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]uint8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 90bf5dc..9a95c5b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -285,6 +285,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -426,6 +433,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -592,22 +600,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -615,6 +607,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -665,6 +658,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2484,6 +2484,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2500,3 +2536,239 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint16 + Inode uint64 + Rdevice uint16 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]int8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]int8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]int8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 4f054dc..eb72393 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -289,6 +289,13 @@ type RawSockaddrXDP struct { type RawSockaddrPPPoX [0x1e]byte +type RawSockaddrTIPC struct { + Family uint16 + Addrtype uint8 + Scope int8 + Addr [12]byte +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -430,6 +437,7 @@ const ( SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 SizeofSockaddrPPPoX = 0x1e + SizeofSockaddrTIPC = 0x10 SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 @@ -596,22 +604,6 @@ const ( RTN_THROW = 0x9 RTN_NAT = 0xa RTN_XRESOLVE = 0xb - RTNLGRP_NONE = 0x0 - RTNLGRP_LINK = 0x1 - RTNLGRP_NOTIFY = 0x2 - RTNLGRP_NEIGH = 0x3 - RTNLGRP_TC = 0x4 - RTNLGRP_IPV4_IFADDR = 0x5 - RTNLGRP_IPV4_MROUTE = 0x6 - RTNLGRP_IPV4_ROUTE = 0x7 - RTNLGRP_IPV4_RULE = 0x8 - RTNLGRP_IPV6_IFADDR = 0x9 - RTNLGRP_IPV6_MROUTE = 0xa - RTNLGRP_IPV6_ROUTE = 0xb - RTNLGRP_IPV6_IFINFO = 0xc - RTNLGRP_IPV6_PREFIX = 0x12 - RTNLGRP_IPV6_RULE = 0x13 - RTNLGRP_ND_USEROPT = 0x14 SizeofNlMsghdr = 0x10 SizeofNlMsgerr = 0x14 SizeofRtGenmsg = 0x1 @@ -619,6 +611,7 @@ const ( SizeofRtAttr = 0x4 SizeofIfInfomsg = 0x10 SizeofIfAddrmsg = 0x8 + SizeofIfaCacheinfo = 0x10 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 SizeofNdUseroptmsg = 0x10 @@ -669,6 +662,13 @@ type IfAddrmsg struct { Index uint32 } +type IfaCacheinfo struct { + Prefered uint32 + Valid uint32 + Cstamp uint32 + Tstamp uint32 +} + type RtMsg struct { Family uint8 Dst_len uint8 @@ -2465,6 +2465,42 @@ const ( BPF_FD_TYPE_URETPROBE = 0x5 ) +const ( + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_DECnet_IFADDR = 0xd + RTNLGRP_NOP2 = 0xe + RTNLGRP_DECnet_ROUTE = 0xf + RTNLGRP_DECnet_RULE = 0x10 + RTNLGRP_NOP4 = 0x11 + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + RTNLGRP_PHONET_IFADDR = 0x15 + RTNLGRP_PHONET_ROUTE = 0x16 + RTNLGRP_DCB = 0x17 + RTNLGRP_IPV4_NETCONF = 0x18 + RTNLGRP_IPV6_NETCONF = 0x19 + RTNLGRP_MDB = 0x1a + RTNLGRP_MPLS_ROUTE = 0x1b + RTNLGRP_NSID = 0x1c + RTNLGRP_MPLS_NETCONF = 0x1d + RTNLGRP_IPV4_MROUTE_R = 0x1e + RTNLGRP_IPV6_MROUTE_R = 0x1f + RTNLGRP_NEXTHOP = 0x20 +) + type CapUserHeader struct { Version uint32 Pid int32 @@ -2481,3 +2517,239 @@ const ( LINUX_CAPABILITY_VERSION_2 = 0x20071026 LINUX_CAPABILITY_VERSION_3 = 0x20080522 ) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} + +type TIPCSocketAddr struct { + Ref uint32 + Node uint32 +} + +type TIPCServiceRange struct { + Type uint32 + Lower uint32 + Upper uint32 +} + +type TIPCServiceName struct { + Type uint32 + Instance uint32 + Domain uint32 +} + +type TIPCSubscr struct { + Seq TIPCServiceRange + Timeout uint32 + Filter uint32 + Handle [8]int8 +} + +type TIPCEvent struct { + Event uint32 + Lower uint32 + Upper uint32 + Port TIPCSocketAddr + S TIPCSubscr +} + +type TIPCGroupReq struct { + Type uint32 + Instance uint32 + Scope uint32 + Flags uint32 +} + +type TIPCSIOCLNReq struct { + Peer uint32 + Id uint32 + Linkname [68]int8 +} + +type TIPCSIOCNodeIDReq struct { + Peer uint32 + Id [16]int8 +} + +const ( + TIPC_CLUSTER_SCOPE = 0x2 + TIPC_NODE_SCOPE = 0x3 +) + +const ( + SYSLOG_ACTION_CLOSE = 0 + SYSLOG_ACTION_OPEN = 1 + SYSLOG_ACTION_READ = 2 + SYSLOG_ACTION_READ_ALL = 3 + SYSLOG_ACTION_READ_CLEAR = 4 + SYSLOG_ACTION_CLEAR = 5 + SYSLOG_ACTION_CONSOLE_OFF = 6 + SYSLOG_ACTION_CONSOLE_ON = 7 + SYSLOG_ACTION_CONSOLE_LEVEL = 8 + SYSLOG_ACTION_SIZE_UNREAD = 9 + SYSLOG_ACTION_SIZE_BUFFER = 10 +) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x3c + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x80 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/windows/asm_windows_386.s b/vendor/golang.org/x/sys/windows/asm_windows_386.s deleted file mode 100644 index 21d994d..0000000 --- a/vendor/golang.org/x/sys/windows/asm_windows_386.s +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// -// System calls for 386, Windows are implemented in runtime/syscall_windows.goc -// - -TEXT ·getprocaddress(SB), 7, $0-16 - JMP syscall·getprocaddress(SB) - -TEXT ·loadlibrary(SB), 7, $0-12 - JMP syscall·loadlibrary(SB) diff --git a/vendor/golang.org/x/sys/windows/asm_windows_amd64.s b/vendor/golang.org/x/sys/windows/asm_windows_amd64.s deleted file mode 100644 index 5bfdf79..0000000 --- a/vendor/golang.org/x/sys/windows/asm_windows_amd64.s +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// -// System calls for amd64, Windows are implemented in runtime/syscall_windows.goc -// - -TEXT ·getprocaddress(SB), 7, $0-32 - JMP syscall·getprocaddress(SB) - -TEXT ·loadlibrary(SB), 7, $0-24 - JMP syscall·loadlibrary(SB) diff --git a/vendor/golang.org/x/sys/windows/asm_windows_arm.s b/vendor/golang.org/x/sys/windows/asm_windows_arm.s deleted file mode 100644 index 55d8b91..0000000 --- a/vendor/golang.org/x/sys/windows/asm_windows_arm.s +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -#include "textflag.h" - -TEXT ·getprocaddress(SB),NOSPLIT,$0 - B syscall·getprocaddress(SB) - -TEXT ·loadlibrary(SB),NOSPLIT,$0 - B syscall·loadlibrary(SB) diff --git a/vendor/golang.org/x/sys/windows/dll_windows.go b/vendor/golang.org/x/sys/windows/dll_windows.go index ba67658..d777113 100644 --- a/vendor/golang.org/x/sys/windows/dll_windows.go +++ b/vendor/golang.org/x/sys/windows/dll_windows.go @@ -11,6 +11,18 @@ import ( "unsafe" ) +// We need to use LoadLibrary and GetProcAddress from the Go runtime, because +// the these symbols are loaded by the system linker and are required to +// dynamically load additional symbols. Note that in the Go runtime, these +// return syscall.Handle and syscall.Errno, but these are the same, in fact, +// as windows.Handle and windows.Errno, and we intend to keep these the same. + +//go:linkname syscall_loadlibrary syscall.loadlibrary +func syscall_loadlibrary(filename *uint16) (handle Handle, err Errno) + +//go:linkname syscall_getprocaddress syscall.getprocaddress +func syscall_getprocaddress(handle Handle, procname *uint8) (proc uintptr, err Errno) + // DLLError describes reasons for DLL load failures. type DLLError struct { Err error @@ -20,10 +32,6 @@ type DLLError struct { func (e *DLLError) Error() string { return e.Msg } -// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file. -func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno) -func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno) - // A DLL implements access to a single DLL. type DLL struct { Name string @@ -40,7 +48,7 @@ func LoadDLL(name string) (dll *DLL, err error) { if err != nil { return nil, err } - h, e := loadlibrary(namep) + h, e := syscall_loadlibrary(namep) if e != 0 { return nil, &DLLError{ Err: e, @@ -50,7 +58,7 @@ func LoadDLL(name string) (dll *DLL, err error) { } d := &DLL{ Name: name, - Handle: Handle(h), + Handle: h, } return d, nil } @@ -71,7 +79,7 @@ func (d *DLL) FindProc(name string) (proc *Proc, err error) { if err != nil { return nil, err } - a, e := getprocaddress(uintptr(d.Handle), namep) + a, e := syscall_getprocaddress(d.Handle, namep) if e != 0 { return nil, &DLLError{ Err: e, diff --git a/vendor/golang.org/x/sys/windows/mksyscall.go b/vendor/golang.org/x/sys/windows/mksyscall.go index 6277057..328e3b2 100644 --- a/vendor/golang.org/x/sys/windows/mksyscall.go +++ b/vendor/golang.org/x/sys/windows/mksyscall.go @@ -6,4 +6,4 @@ package windows -//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go +//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go diff --git a/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/golang.org/x/sys/windows/security_windows.go index 61b4964..d88ed91 100644 --- a/vendor/golang.org/x/sys/windows/security_windows.go +++ b/vendor/golang.org/x/sys/windows/security_windows.go @@ -9,14 +9,6 @@ import ( "unsafe" ) -const ( - STANDARD_RIGHTS_REQUIRED = 0xf0000 - STANDARD_RIGHTS_READ = 0x20000 - STANDARD_RIGHTS_WRITE = 0x20000 - STANDARD_RIGHTS_EXECUTE = 0x20000 - STANDARD_RIGHTS_ALL = 0x1F0000 -) - const ( NameUnknown = 0 NameFullyQualifiedDN = 1 @@ -235,16 +227,17 @@ func LookupSID(system, account string) (sid *SID, domain string, accType uint32, } } -// String converts SID to a string format -// suitable for display, storage, or transmission. -func (sid *SID) String() (string, error) { +// String converts SID to a string format suitable for display, storage, or transmission. +func (sid *SID) String() string { + // From https://docs.microsoft.com/en-us/windows/win32/secbiomet/general-constants + const SecurityMaxSidSize = 68 var s *uint16 e := ConvertSidToStringSid(sid, &s) if e != nil { - return "", e + return "" } defer LocalFree((Handle)(unsafe.Pointer(s))) - return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil + return UTF16ToString((*[SecurityMaxSidSize]uint16)(unsafe.Pointer(s))[:]) } // Len returns the length, in bytes, of a valid security identifier SID. @@ -644,6 +637,8 @@ func (tml *Tokenmandatorylabel) Size() uint32 { //sys DuplicateTokenEx(existingToken Token, desiredAccess uint32, tokenAttributes *SecurityAttributes, impersonationLevel uint32, tokenType uint32, newToken *Token) (err error) = advapi32.DuplicateTokenEx //sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW //sys getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemDirectoryW +//sys getWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetWindowsDirectoryW +//sys getSystemWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemWindowsDirectoryW // An access token contains the security information for a logon session. // The system creates an access token when a user logs on, and every @@ -654,21 +649,16 @@ func (tml *Tokenmandatorylabel) Size() uint32 { // system-related operations on the local computer. type Token Handle -// OpenCurrentProcessToken opens the access token -// associated with current process. It is a real -// token that needs to be closed, unlike -// GetCurrentProcessToken. +// OpenCurrentProcessToken opens an access token associated with current +// process with TOKEN_QUERY access. It is a real token that needs to be closed. +// +// Deprecated: Explicitly call OpenProcessToken(CurrentProcess(), ...) +// with the desired access instead, or use GetCurrentProcessToken for a +// TOKEN_QUERY token. func OpenCurrentProcessToken() (Token, error) { - p, e := GetCurrentProcess() - if e != nil { - return 0, e - } - var t Token - e = OpenProcessToken(p, TOKEN_QUERY, &t) - if e != nil { - return 0, e - } - return t, nil + var token Token + err := OpenProcessToken(CurrentProcess(), TOKEN_QUERY, &token) + return token, err } // GetCurrentProcessToken returns the access token associated with @@ -785,8 +775,8 @@ func (token Token) GetLinkedToken() (Token, error) { return linkedToken, nil } -// GetSystemDirectory retrieves path to current location of the system -// directory, which is typically, though not always, C:\Windows\System32. +// GetSystemDirectory retrieves the path to current location of the system +// directory, which is typically, though not always, `C:\Windows\System32`. func GetSystemDirectory() (string, error) { n := uint32(MAX_PATH) for { @@ -802,6 +792,42 @@ func GetSystemDirectory() (string, error) { } } +// GetWindowsDirectory retrieves the path to current location of the Windows +// directory, which is typically, though not always, `C:\Windows`. This may +// be a private user directory in the case that the application is running +// under a terminal server. +func GetWindowsDirectory() (string, error) { + n := uint32(MAX_PATH) + for { + b := make([]uint16, n) + l, e := getWindowsDirectory(&b[0], n) + if e != nil { + return "", e + } + if l <= n { + return UTF16ToString(b[:l]), nil + } + n = l + } +} + +// GetSystemWindowsDirectory retrieves the path to current location of the +// Windows directory, which is typically, though not always, `C:\Windows`. +func GetSystemWindowsDirectory() (string, error) { + n := uint32(MAX_PATH) + for { + b := make([]uint16, n) + l, e := getSystemWindowsDirectory(&b[0], n) + if e != nil { + return "", e + } + if l <= n { + return UTF16ToString(b[:l]), nil + } + n = l + } +} + // IsMember reports whether the access token t is a member of the provided SID. func (t Token) IsMember(sid *SID) (bool, error) { var b int32 @@ -852,3 +878,521 @@ type WTS_SESSION_INFO struct { //sys WTSQueryUserToken(session uint32, token *Token) (err error) = wtsapi32.WTSQueryUserToken //sys WTSEnumerateSessions(handle Handle, reserved uint32, version uint32, sessions **WTS_SESSION_INFO, count *uint32) (err error) = wtsapi32.WTSEnumerateSessionsW //sys WTSFreeMemory(ptr uintptr) = wtsapi32.WTSFreeMemory + +type ACL struct { + aclRevision byte + sbz1 byte + aclSize uint16 + aceCount uint16 + sbz2 uint16 +} + +type SECURITY_DESCRIPTOR struct { + revision byte + sbz1 byte + control SECURITY_DESCRIPTOR_CONTROL + owner *SID + group *SID + sacl *ACL + dacl *ACL +} + +type SecurityAttributes struct { + Length uint32 + SecurityDescriptor *SECURITY_DESCRIPTOR + InheritHandle uint32 +} + +type SE_OBJECT_TYPE uint32 + +// Constants for type SE_OBJECT_TYPE +const ( + SE_UNKNOWN_OBJECT_TYPE = 0 + SE_FILE_OBJECT = 1 + SE_SERVICE = 2 + SE_PRINTER = 3 + SE_REGISTRY_KEY = 4 + SE_LMSHARE = 5 + SE_KERNEL_OBJECT = 6 + SE_WINDOW_OBJECT = 7 + SE_DS_OBJECT = 8 + SE_DS_OBJECT_ALL = 9 + SE_PROVIDER_DEFINED_OBJECT = 10 + SE_WMIGUID_OBJECT = 11 + SE_REGISTRY_WOW64_32KEY = 12 + SE_REGISTRY_WOW64_64KEY = 13 +) + +type SECURITY_INFORMATION uint32 + +// Constants for type SECURITY_INFORMATION +const ( + OWNER_SECURITY_INFORMATION = 0x00000001 + GROUP_SECURITY_INFORMATION = 0x00000002 + DACL_SECURITY_INFORMATION = 0x00000004 + SACL_SECURITY_INFORMATION = 0x00000008 + LABEL_SECURITY_INFORMATION = 0x00000010 + ATTRIBUTE_SECURITY_INFORMATION = 0x00000020 + SCOPE_SECURITY_INFORMATION = 0x00000040 + BACKUP_SECURITY_INFORMATION = 0x00010000 + PROTECTED_DACL_SECURITY_INFORMATION = 0x80000000 + PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000 + UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000 + UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000 +) + +type SECURITY_DESCRIPTOR_CONTROL uint16 + +// Constants for type SECURITY_DESCRIPTOR_CONTROL +const ( + SE_OWNER_DEFAULTED = 0x0001 + SE_GROUP_DEFAULTED = 0x0002 + SE_DACL_PRESENT = 0x0004 + SE_DACL_DEFAULTED = 0x0008 + SE_SACL_PRESENT = 0x0010 + SE_SACL_DEFAULTED = 0x0020 + SE_DACL_AUTO_INHERIT_REQ = 0x0100 + SE_SACL_AUTO_INHERIT_REQ = 0x0200 + SE_DACL_AUTO_INHERITED = 0x0400 + SE_SACL_AUTO_INHERITED = 0x0800 + SE_DACL_PROTECTED = 0x1000 + SE_SACL_PROTECTED = 0x2000 + SE_RM_CONTROL_VALID = 0x4000 + SE_SELF_RELATIVE = 0x8000 +) + +type ACCESS_MASK uint32 + +// Constants for type ACCESS_MASK +const ( + DELETE = 0x00010000 + READ_CONTROL = 0x00020000 + WRITE_DAC = 0x00040000 + WRITE_OWNER = 0x00080000 + SYNCHRONIZE = 0x00100000 + STANDARD_RIGHTS_REQUIRED = 0x000F0000 + STANDARD_RIGHTS_READ = READ_CONTROL + STANDARD_RIGHTS_WRITE = READ_CONTROL + STANDARD_RIGHTS_EXECUTE = READ_CONTROL + STANDARD_RIGHTS_ALL = 0x001F0000 + SPECIFIC_RIGHTS_ALL = 0x0000FFFF + ACCESS_SYSTEM_SECURITY = 0x01000000 + MAXIMUM_ALLOWED = 0x02000000 + GENERIC_READ = 0x80000000 + GENERIC_WRITE = 0x40000000 + GENERIC_EXECUTE = 0x20000000 + GENERIC_ALL = 0x10000000 +) + +type ACCESS_MODE uint32 + +// Constants for type ACCESS_MODE +const ( + NOT_USED_ACCESS = 0 + GRANT_ACCESS = 1 + SET_ACCESS = 2 + DENY_ACCESS = 3 + REVOKE_ACCESS = 4 + SET_AUDIT_SUCCESS = 5 + SET_AUDIT_FAILURE = 6 +) + +// Constants for AceFlags and Inheritance fields +const ( + NO_INHERITANCE = 0x0 + SUB_OBJECTS_ONLY_INHERIT = 0x1 + SUB_CONTAINERS_ONLY_INHERIT = 0x2 + SUB_CONTAINERS_AND_OBJECTS_INHERIT = 0x3 + INHERIT_NO_PROPAGATE = 0x4 + INHERIT_ONLY = 0x8 + INHERITED_ACCESS_ENTRY = 0x10 + INHERITED_PARENT = 0x10000000 + INHERITED_GRANDPARENT = 0x20000000 + OBJECT_INHERIT_ACE = 0x1 + CONTAINER_INHERIT_ACE = 0x2 + NO_PROPAGATE_INHERIT_ACE = 0x4 + INHERIT_ONLY_ACE = 0x8 + INHERITED_ACE = 0x10 + VALID_INHERIT_FLAGS = 0x1F +) + +type MULTIPLE_TRUSTEE_OPERATION uint32 + +// Constants for MULTIPLE_TRUSTEE_OPERATION +const ( + NO_MULTIPLE_TRUSTEE = 0 + TRUSTEE_IS_IMPERSONATE = 1 +) + +type TRUSTEE_FORM uint32 + +// Constants for TRUSTEE_FORM +const ( + TRUSTEE_IS_SID = 0 + TRUSTEE_IS_NAME = 1 + TRUSTEE_BAD_FORM = 2 + TRUSTEE_IS_OBJECTS_AND_SID = 3 + TRUSTEE_IS_OBJECTS_AND_NAME = 4 +) + +type TRUSTEE_TYPE uint32 + +// Constants for TRUSTEE_TYPE +const ( + TRUSTEE_IS_UNKNOWN = 0 + TRUSTEE_IS_USER = 1 + TRUSTEE_IS_GROUP = 2 + TRUSTEE_IS_DOMAIN = 3 + TRUSTEE_IS_ALIAS = 4 + TRUSTEE_IS_WELL_KNOWN_GROUP = 5 + TRUSTEE_IS_DELETED = 6 + TRUSTEE_IS_INVALID = 7 + TRUSTEE_IS_COMPUTER = 8 +) + +// Constants for ObjectsPresent field +const ( + ACE_OBJECT_TYPE_PRESENT = 0x1 + ACE_INHERITED_OBJECT_TYPE_PRESENT = 0x2 +) + +type EXPLICIT_ACCESS struct { + AccessPermissions ACCESS_MASK + AccessMode ACCESS_MODE + Inheritance uint32 + Trustee TRUSTEE +} + +// This type is the union inside of TRUSTEE and must be created using one of the TrusteeValueFrom* functions. +type TrusteeValue uintptr + +func TrusteeValueFromString(str string) TrusteeValue { + return TrusteeValue(unsafe.Pointer(StringToUTF16Ptr(str))) +} +func TrusteeValueFromSID(sid *SID) TrusteeValue { + return TrusteeValue(unsafe.Pointer(sid)) +} +func TrusteeValueFromObjectsAndSid(objectsAndSid *OBJECTS_AND_SID) TrusteeValue { + return TrusteeValue(unsafe.Pointer(objectsAndSid)) +} +func TrusteeValueFromObjectsAndName(objectsAndName *OBJECTS_AND_NAME) TrusteeValue { + return TrusteeValue(unsafe.Pointer(objectsAndName)) +} + +type TRUSTEE struct { + MultipleTrustee *TRUSTEE + MultipleTrusteeOperation MULTIPLE_TRUSTEE_OPERATION + TrusteeForm TRUSTEE_FORM + TrusteeType TRUSTEE_TYPE + TrusteeValue TrusteeValue +} + +type OBJECTS_AND_SID struct { + ObjectsPresent uint32 + ObjectTypeGuid GUID + InheritedObjectTypeGuid GUID + Sid *SID +} + +type OBJECTS_AND_NAME struct { + ObjectsPresent uint32 + ObjectType SE_OBJECT_TYPE + ObjectTypeName *uint16 + InheritedObjectTypeName *uint16 + Name *uint16 +} + +//sys getSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) = advapi32.GetSecurityInfo +//sys SetSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) = advapi32.SetSecurityInfo +//sys getNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) = advapi32.GetNamedSecurityInfoW +//sys SetNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) (ret error) = advapi32.SetNamedSecurityInfoW + +//sys buildSecurityDescriptor(owner *TRUSTEE, group *TRUSTEE, countAccessEntries uint32, accessEntries *EXPLICIT_ACCESS, countAuditEntries uint32, auditEntries *EXPLICIT_ACCESS, oldSecurityDescriptor *SECURITY_DESCRIPTOR, sizeNewSecurityDescriptor *uint32, newSecurityDescriptor **SECURITY_DESCRIPTOR) (ret error) = advapi32.BuildSecurityDescriptorW +//sys initializeSecurityDescriptor(absoluteSD *SECURITY_DESCRIPTOR, revision uint32) (err error) = advapi32.InitializeSecurityDescriptor + +//sys getSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, control *SECURITY_DESCRIPTOR_CONTROL, revision *uint32) (err error) = advapi32.GetSecurityDescriptorControl +//sys getSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent *bool, dacl **ACL, daclDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorDacl +//sys getSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent *bool, sacl **ACL, saclDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorSacl +//sys getSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner **SID, ownerDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorOwner +//sys getSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group **SID, groupDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorGroup +//sys getSecurityDescriptorLength(sd *SECURITY_DESCRIPTOR) (len uint32) = advapi32.GetSecurityDescriptorLength +//sys getSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) (ret error) [failretval!=0] = advapi32.GetSecurityDescriptorRMControl +//sys isValidSecurityDescriptor(sd *SECURITY_DESCRIPTOR) (isValid bool) = advapi32.IsValidSecurityDescriptor + +//sys setSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, controlBitsOfInterest SECURITY_DESCRIPTOR_CONTROL, controlBitsToSet SECURITY_DESCRIPTOR_CONTROL) (err error) = advapi32.SetSecurityDescriptorControl +//sys setSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent bool, dacl *ACL, daclDefaulted bool) (err error) = advapi32.SetSecurityDescriptorDacl +//sys setSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent bool, sacl *ACL, saclDefaulted bool) (err error) = advapi32.SetSecurityDescriptorSacl +//sys setSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner *SID, ownerDefaulted bool) (err error) = advapi32.SetSecurityDescriptorOwner +//sys setSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group *SID, groupDefaulted bool) (err error) = advapi32.SetSecurityDescriptorGroup +//sys setSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) = advapi32.SetSecurityDescriptorRMControl + +//sys convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd **SECURITY_DESCRIPTOR, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW +//sys convertSecurityDescriptorToStringSecurityDescriptor(sd *SECURITY_DESCRIPTOR, revision uint32, securityInformation SECURITY_INFORMATION, str **uint16, strLen *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW + +//sys makeAbsoluteSD(selfRelativeSD *SECURITY_DESCRIPTOR, absoluteSD *SECURITY_DESCRIPTOR, absoluteSDSize *uint32, dacl *ACL, daclSize *uint32, sacl *ACL, saclSize *uint32, owner *SID, ownerSize *uint32, group *SID, groupSize *uint32) (err error) = advapi32.MakeAbsoluteSD +//sys makeSelfRelativeSD(absoluteSD *SECURITY_DESCRIPTOR, selfRelativeSD *SECURITY_DESCRIPTOR, selfRelativeSDSize *uint32) (err error) = advapi32.MakeSelfRelativeSD + +//sys setEntriesInAcl(countExplicitEntries uint32, explicitEntries *EXPLICIT_ACCESS, oldACL *ACL, newACL **ACL) (ret error) = advapi32.SetEntriesInAclW + +// Control returns the security descriptor control bits. +func (sd *SECURITY_DESCRIPTOR) Control() (control SECURITY_DESCRIPTOR_CONTROL, revision uint32, err error) { + err = getSecurityDescriptorControl(sd, &control, &revision) + return +} + +// SetControl sets the security descriptor control bits. +func (sd *SECURITY_DESCRIPTOR) SetControl(controlBitsOfInterest SECURITY_DESCRIPTOR_CONTROL, controlBitsToSet SECURITY_DESCRIPTOR_CONTROL) error { + return setSecurityDescriptorControl(sd, controlBitsOfInterest, controlBitsToSet) +} + +// RMControl returns the security descriptor resource manager control bits. +func (sd *SECURITY_DESCRIPTOR) RMControl() (control uint8, err error) { + err = getSecurityDescriptorRMControl(sd, &control) + return +} + +// SetRMControl sets the security descriptor resource manager control bits. +func (sd *SECURITY_DESCRIPTOR) SetRMControl(rmControl uint8) { + setSecurityDescriptorRMControl(sd, &rmControl) +} + +// DACL returns the security descriptor DACL and whether it was defaulted. The dacl return value may be nil +// if a DACL exists but is an "empty DACL", meaning fully permissive. If the DACL does not exist, err returns +// ERROR_OBJECT_NOT_FOUND. +func (sd *SECURITY_DESCRIPTOR) DACL() (dacl *ACL, defaulted bool, err error) { + var present bool + err = getSecurityDescriptorDacl(sd, &present, &dacl, &defaulted) + if !present { + err = ERROR_OBJECT_NOT_FOUND + } + return +} + +// SetDACL sets the absolute security descriptor DACL. +func (absoluteSD *SECURITY_DESCRIPTOR) SetDACL(dacl *ACL, present, defaulted bool) error { + return setSecurityDescriptorDacl(absoluteSD, present, dacl, defaulted) +} + +// SACL returns the security descriptor SACL and whether it was defaulted. The sacl return value may be nil +// if a SACL exists but is an "empty SACL", meaning fully permissive. If the SACL does not exist, err returns +// ERROR_OBJECT_NOT_FOUND. +func (sd *SECURITY_DESCRIPTOR) SACL() (sacl *ACL, defaulted bool, err error) { + var present bool + err = getSecurityDescriptorSacl(sd, &present, &sacl, &defaulted) + if !present { + err = ERROR_OBJECT_NOT_FOUND + } + return +} + +// SetSACL sets the absolute security descriptor SACL. +func (absoluteSD *SECURITY_DESCRIPTOR) SetSACL(sacl *ACL, present, defaulted bool) error { + return setSecurityDescriptorSacl(absoluteSD, present, sacl, defaulted) +} + +// Owner returns the security descriptor owner and whether it was defaulted. +func (sd *SECURITY_DESCRIPTOR) Owner() (owner *SID, defaulted bool, err error) { + err = getSecurityDescriptorOwner(sd, &owner, &defaulted) + return +} + +// SetOwner sets the absolute security descriptor owner. +func (absoluteSD *SECURITY_DESCRIPTOR) SetOwner(owner *SID, defaulted bool) error { + return setSecurityDescriptorOwner(absoluteSD, owner, defaulted) +} + +// Group returns the security descriptor group and whether it was defaulted. +func (sd *SECURITY_DESCRIPTOR) Group() (group *SID, defaulted bool, err error) { + err = getSecurityDescriptorGroup(sd, &group, &defaulted) + return +} + +// SetGroup sets the absolute security descriptor owner. +func (absoluteSD *SECURITY_DESCRIPTOR) SetGroup(group *SID, defaulted bool) error { + return setSecurityDescriptorGroup(absoluteSD, group, defaulted) +} + +// Length returns the length of the security descriptor. +func (sd *SECURITY_DESCRIPTOR) Length() uint32 { + return getSecurityDescriptorLength(sd) +} + +// IsValid returns whether the security descriptor is valid. +func (sd *SECURITY_DESCRIPTOR) IsValid() bool { + return isValidSecurityDescriptor(sd) +} + +// String returns the SDDL form of the security descriptor, with a function signature that can be +// used with %v formatting directives. +func (sd *SECURITY_DESCRIPTOR) String() string { + var sddl *uint16 + err := convertSecurityDescriptorToStringSecurityDescriptor(sd, 1, 0xff, &sddl, nil) + if err != nil { + return "" + } + defer LocalFree(Handle(unsafe.Pointer(sddl))) + return UTF16ToString((*[(1 << 30) - 1]uint16)(unsafe.Pointer(sddl))[:]) +} + +// ToAbsolute converts a self-relative security descriptor into an absolute one. +func (selfRelativeSD *SECURITY_DESCRIPTOR) ToAbsolute() (absoluteSD *SECURITY_DESCRIPTOR, err error) { + control, _, err := selfRelativeSD.Control() + if err != nil { + return + } + if control&SE_SELF_RELATIVE == 0 { + err = ERROR_INVALID_PARAMETER + return + } + var absoluteSDSize, daclSize, saclSize, ownerSize, groupSize uint32 + err = makeAbsoluteSD(selfRelativeSD, nil, &absoluteSDSize, + nil, &daclSize, nil, &saclSize, nil, &ownerSize, nil, &groupSize) + switch err { + case ERROR_INSUFFICIENT_BUFFER: + case nil: + // makeAbsoluteSD is expected to fail, but it succeeds. + return nil, ERROR_INTERNAL_ERROR + default: + return nil, err + } + if absoluteSDSize > 0 { + absoluteSD = (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, absoluteSDSize)[0])) + } + var ( + dacl *ACL + sacl *ACL + owner *SID + group *SID + ) + if daclSize > 0 { + dacl = (*ACL)(unsafe.Pointer(&make([]byte, daclSize)[0])) + } + if saclSize > 0 { + sacl = (*ACL)(unsafe.Pointer(&make([]byte, saclSize)[0])) + } + if ownerSize > 0 { + owner = (*SID)(unsafe.Pointer(&make([]byte, ownerSize)[0])) + } + if groupSize > 0 { + group = (*SID)(unsafe.Pointer(&make([]byte, groupSize)[0])) + } + err = makeAbsoluteSD(selfRelativeSD, absoluteSD, &absoluteSDSize, + dacl, &daclSize, sacl, &saclSize, owner, &ownerSize, group, &groupSize) + return +} + +// ToSelfRelative converts an absolute security descriptor into a self-relative one. +func (absoluteSD *SECURITY_DESCRIPTOR) ToSelfRelative() (selfRelativeSD *SECURITY_DESCRIPTOR, err error) { + control, _, err := absoluteSD.Control() + if err != nil { + return + } + if control&SE_SELF_RELATIVE != 0 { + err = ERROR_INVALID_PARAMETER + return + } + var selfRelativeSDSize uint32 + err = makeSelfRelativeSD(absoluteSD, nil, &selfRelativeSDSize) + switch err { + case ERROR_INSUFFICIENT_BUFFER: + case nil: + // makeSelfRelativeSD is expected to fail, but it succeeds. + return nil, ERROR_INTERNAL_ERROR + default: + return nil, err + } + if selfRelativeSDSize > 0 { + selfRelativeSD = (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, selfRelativeSDSize)[0])) + } + err = makeSelfRelativeSD(absoluteSD, selfRelativeSD, &selfRelativeSDSize) + return +} + +func (selfRelativeSD *SECURITY_DESCRIPTOR) copySelfRelativeSecurityDescriptor() *SECURITY_DESCRIPTOR { + sdBytes := make([]byte, selfRelativeSD.Length()) + copy(sdBytes, (*[(1 << 31) - 1]byte)(unsafe.Pointer(selfRelativeSD))[:len(sdBytes)]) + return (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&sdBytes[0])) +} + +// SecurityDescriptorFromString converts an SDDL string describing a security descriptor into a +// self-relative security descriptor object allocated on the Go heap. +func SecurityDescriptorFromString(sddl string) (sd *SECURITY_DESCRIPTOR, err error) { + var winHeapSD *SECURITY_DESCRIPTOR + err = convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &winHeapSD, nil) + if err != nil { + return + } + defer LocalFree(Handle(unsafe.Pointer(winHeapSD))) + return winHeapSD.copySelfRelativeSecurityDescriptor(), nil +} + +// GetSecurityInfo queries the security information for a given handle and returns the self-relative security +// descriptor result on the Go heap. +func GetSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION) (sd *SECURITY_DESCRIPTOR, err error) { + var winHeapSD *SECURITY_DESCRIPTOR + err = getSecurityInfo(handle, objectType, securityInformation, nil, nil, nil, nil, &winHeapSD) + if err != nil { + return + } + defer LocalFree(Handle(unsafe.Pointer(winHeapSD))) + return winHeapSD.copySelfRelativeSecurityDescriptor(), nil +} + +// GetNamedSecurityInfo queries the security information for a given named object and returns the self-relative security +// descriptor result on the Go heap. +func GetNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION) (sd *SECURITY_DESCRIPTOR, err error) { + var winHeapSD *SECURITY_DESCRIPTOR + err = getNamedSecurityInfo(objectName, objectType, securityInformation, nil, nil, nil, nil, &winHeapSD) + if err != nil { + return + } + defer LocalFree(Handle(unsafe.Pointer(winHeapSD))) + return winHeapSD.copySelfRelativeSecurityDescriptor(), nil +} + +// BuildSecurityDescriptor makes a new security descriptor using the input trustees, explicit access lists, and +// prior security descriptor to be merged, any of which can be nil, returning the self-relative security descriptor +// result on the Go heap. +func BuildSecurityDescriptor(owner *TRUSTEE, group *TRUSTEE, accessEntries []EXPLICIT_ACCESS, auditEntries []EXPLICIT_ACCESS, mergedSecurityDescriptor *SECURITY_DESCRIPTOR) (sd *SECURITY_DESCRIPTOR, err error) { + var winHeapSD *SECURITY_DESCRIPTOR + var winHeapSDSize uint32 + var firstAccessEntry *EXPLICIT_ACCESS + if len(accessEntries) > 0 { + firstAccessEntry = &accessEntries[0] + } + var firstAuditEntry *EXPLICIT_ACCESS + if len(auditEntries) > 0 { + firstAuditEntry = &auditEntries[0] + } + err = buildSecurityDescriptor(owner, group, uint32(len(accessEntries)), firstAccessEntry, uint32(len(auditEntries)), firstAuditEntry, mergedSecurityDescriptor, &winHeapSDSize, &winHeapSD) + if err != nil { + return + } + defer LocalFree(Handle(unsafe.Pointer(winHeapSD))) + return winHeapSD.copySelfRelativeSecurityDescriptor(), nil +} + +// NewSecurityDescriptor creates and initializes a new absolute security descriptor. +func NewSecurityDescriptor() (absoluteSD *SECURITY_DESCRIPTOR, err error) { + absoluteSD = &SECURITY_DESCRIPTOR{} + err = initializeSecurityDescriptor(absoluteSD, 1) + return +} + +// ACLFromEntries returns a new ACL on the Go heap containing a list of explicit entries as well as those of another ACL. +// Both explicitEntries and mergedACL are optional and can be nil. +func ACLFromEntries(explicitEntries []EXPLICIT_ACCESS, mergedACL *ACL) (acl *ACL, err error) { + var firstExplicitEntry *EXPLICIT_ACCESS + if len(explicitEntries) > 0 { + firstExplicitEntry = &explicitEntries[0] + } + var winHeapACL *ACL + err = setEntriesInAcl(uint32(len(explicitEntries)), firstExplicitEntry, mergedACL, &winHeapACL) + if err != nil { + return + } + defer LocalFree(Handle(unsafe.Pointer(winHeapACL))) + aclBytes := make([]byte, winHeapACL.aclSize) + copy(aclBytes, (*[(1 << 31) - 1]byte)(unsafe.Pointer(winHeapACL))[:len(aclBytes)]) + return (*ACL)(unsafe.Pointer(&aclBytes[0])), nil +} diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go index 03383f1..847e00b 100644 --- a/vendor/golang.org/x/sys/windows/service.go +++ b/vendor/golang.org/x/sys/windows/service.go @@ -159,6 +159,10 @@ type SERVICE_DESCRIPTION struct { Description *uint16 } +type SERVICE_DELAYED_AUTO_START_INFO struct { + IsDelayedAutoStartUp uint32 +} + type SERVICE_STATUS_PROCESS struct { ServiceType uint32 CurrentState uint32 diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index b230509..fe8e42c 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -57,6 +57,10 @@ const ( FILE_VOLUME_IS_COMPRESSED = 0x00008000 FILE_VOLUME_QUOTAS = 0x00000020 + // Flags for LockFileEx. + LOCKFILE_FAIL_IMMEDIATELY = 0x00000001 + LOCKFILE_EXCLUSIVE_LOCK = 0x00000002 + // Return values of SleepEx and other APC functions STATUS_USER_APC = 0x000000C0 WAIT_IO_COMPLETION = STATUS_USER_APC @@ -136,6 +140,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW //sys FreeLibrary(handle Handle) (err error) //sys GetProcAddress(module Handle, procname string) (proc uintptr, err error) +//sys GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) = kernel32.GetModuleFileNameW +//sys GetModuleHandleEx(flags uint32, moduleName *uint16, module *Handle) (err error) = kernel32.GetModuleHandleExW //sys GetVersion() (ver uint32, err error) //sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW //sys ExitProcess(exitcode uint32) @@ -160,6 +166,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys DeleteFile(path *uint16) (err error) = DeleteFileW //sys MoveFile(from *uint16, to *uint16) (err error) = MoveFileW //sys MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW +//sys LockFileEx(file Handle, flags uint32, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error) +//sys UnlockFileEx(file Handle, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error) //sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW //sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW //sys SetEndOfFile(handle Handle) (err error) @@ -173,13 +181,11 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CancelIoEx(s Handle, o *Overlapped) (err error) //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW //sys OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) -//sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) = shell32.ShellExecuteW +//sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW //sys shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath //sys TerminateProcess(handle Handle, exitcode uint32) (err error) //sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) //sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW -//sys GetCurrentProcess() (pseudoHandle Handle, err error) -//sys GetCurrentThread() (pseudoHandle Handle, err error) //sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) //sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) //sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] @@ -257,6 +263,10 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetEvent(event Handle) (err error) = kernel32.SetEvent //sys ResetEvent(event Handle) (err error) = kernel32.ResetEvent //sys PulseEvent(event Handle) (err error) = kernel32.PulseEvent +//sys CreateMutex(mutexAttrs *SecurityAttributes, initialOwner bool, name *uint16) (handle Handle, err error) = kernel32.CreateMutexW +//sys CreateMutexEx(mutexAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) = kernel32.CreateMutexExW +//sys OpenMutex(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenMutexW +//sys ReleaseMutex(mutex Handle) (err error) = kernel32.ReleaseMutex //sys SleepEx(milliseconds uint32, alertable bool) (ret uint32) = kernel32.SleepEx //sys CreateJobObject(jobAttr *SecurityAttributes, name *uint16) (handle Handle, err error) = kernel32.CreateJobObjectW //sys AssignProcessToJobObject(job Handle, process Handle) (err error) = kernel32.AssignProcessToJobObject @@ -269,6 +279,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error) //sys GetProcessId(process Handle) (id uint32, err error) //sys OpenThread(desiredAccess uint32, inheritHandle bool, threadId uint32) (handle Handle, err error) +//sys SetProcessPriorityBoost(process Handle, disable bool) (err error) = kernel32.SetProcessPriorityBoost // Volume Management Functions //sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW @@ -279,6 +290,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) = FindNextVolumeMountPointW //sys FindVolumeClose(findVolume Handle) (err error) //sys FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) +//sys GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailableToCaller *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) = GetDiskFreeSpaceExW //sys GetDriveType(rootPathName *uint16) (driveType uint32) = GetDriveTypeW //sys GetLogicalDrives() (drivesBitMask uint32, err error) [failretval==0] //sys GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) [failretval==0] = GetLogicalDriveStringsW @@ -291,14 +303,50 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW //sys SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW //sys MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW +//sys ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx +//sys InitiateSystemShutdownEx(machineName *uint16, message *uint16, timeout uint32, forceAppsClosed bool, rebootAfterShutdown bool, reason uint32) (err error) = advapi32.InitiateSystemShutdownExW +//sys SetProcessShutdownParameters(level uint32, flags uint32) (err error) = kernel32.SetProcessShutdownParameters +//sys GetProcessShutdownParameters(level *uint32, flags *uint32) (err error) = kernel32.GetProcessShutdownParameters //sys clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) = ole32.CLSIDFromString //sys stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) = ole32.StringFromGUID2 //sys coCreateGuid(pguid *GUID) (ret error) = ole32.CoCreateGuid //sys CoTaskMemFree(address unsafe.Pointer) = ole32.CoTaskMemFree //sys rtlGetVersion(info *OsVersionInfoEx) (ret error) = ntdll.RtlGetVersion +//sys rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32) = ntdll.RtlGetNtVersionNumbers + +// Process Status API (PSAPI) +//sys EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses // syscall interface implementation for other packages +// GetCurrentProcess returns the handle for the current process. +// It is a pseudo handle that does not need to be closed. +// The returned error is always nil. +// +// Deprecated: use CurrentProcess for the same Handle without the nil +// error. +func GetCurrentProcess() (Handle, error) { + return CurrentProcess(), nil +} + +// CurrentProcess returns the handle for the current process. +// It is a pseudo handle that does not need to be closed. +func CurrentProcess() Handle { return Handle(^uintptr(1 - 1)) } + +// GetCurrentThread returns the handle for the current thread. +// It is a pseudo handle that does not need to be closed. +// The returned error is always nil. +// +// Deprecated: use CurrentThread for the same Handle without the nil +// error. +func GetCurrentThread() (Handle, error) { + return CurrentThread(), nil +} + +// CurrentThread returns the handle for the current thread. +// It is a pseudo handle that does not need to be closed. +func CurrentThread() Handle { return Handle(^uintptr(2 - 1)) } + // GetProcAddressByOrdinal retrieves the address of the exported // function from module by ordinal. func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) { @@ -365,7 +413,11 @@ func Open(path string, mode int, perm uint32) (fd Handle, err error) { default: createmode = OPEN_EXISTING } - h, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0) + var attrs uint32 = FILE_ATTRIBUTE_NORMAL + if perm&S_IWRITE == 0 { + attrs = FILE_ATTRIBUTE_READONLY + } + h, e := CreateFile(pathp, access, sharemode, sa, createmode, attrs, 0) return h, e } @@ -812,7 +864,7 @@ func (rsa *RawSockaddrAny) Sockaddr() (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 @@ -1306,8 +1358,8 @@ func (t Token) KnownFolderPath(folderID *KNOWNFOLDERID, flags uint32) (string, e return UTF16ToString((*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:]), nil } -// RtlGetVersion returns the true version of the underlying operating system, ignoring -// any manifesting or compatibility layers on top of the win32 layer. +// RtlGetVersion returns the version of the underlying operating system, ignoring +// manifest semantics but is affected by the application compatibility layer. func RtlGetVersion() *OsVersionInfoEx { info := &OsVersionInfoEx{} info.osVersionInfoSize = uint32(unsafe.Sizeof(*info)) @@ -1318,3 +1370,11 @@ func RtlGetVersion() *OsVersionInfoEx { _ = rtlGetVersion(info) return info } + +// RtlGetNtVersionNumbers returns the version of the underlying operating system, +// ignoring manifest semantics and the application compatibility layer. +func RtlGetNtVersionNumbers() (majorVersion, minorVersion, buildNumber uint32) { + rtlGetNtVersionNumbers(&majorVersion, &minorVersion, &buildNumber) + buildNumber &= 0xffff + return +} diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 8a563f9..7f178bb 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -62,11 +62,6 @@ var signals = [...]string{ } const ( - GENERIC_READ = 0x80000000 - GENERIC_WRITE = 0x40000000 - GENERIC_EXECUTE = 0x20000000 - GENERIC_ALL = 0x10000000 - FILE_LIST_DIRECTORY = 0x00000001 FILE_APPEND_DATA = 0x00000004 FILE_WRITE_ATTRIBUTES = 0x00000100 @@ -158,13 +153,6 @@ const ( WAIT_OBJECT_0 = 0x00000000 WAIT_FAILED = 0xFFFFFFFF - // Standard access rights. - DELETE = 0x00010000 - READ_CONTROL = 0x00020000 - SYNCHRONIZE = 0x00100000 - WRITE_DAC = 0x00040000 - WRITE_OWNER = 0x00080000 - // Access rights for process. PROCESS_CREATE_PROCESS = 0x0080 PROCESS_CREATE_THREAD = 0x0002 @@ -197,8 +185,11 @@ const ( FILE_MAP_READ = 0x04 FILE_MAP_EXECUTE = 0x20 - CTRL_C_EVENT = 0 - CTRL_BREAK_EVENT = 1 + CTRL_C_EVENT = 0 + CTRL_BREAK_EVENT = 1 + CTRL_CLOSE_EVENT = 2 + CTRL_LOGOFF_EVENT = 5 + CTRL_SHUTDOWN_EVENT = 6 // Windows reserves errors >= 1<<29 for application use. APPLICATION_ERROR = 1 << 29 @@ -480,12 +471,6 @@ func NsecToTimeval(nsec int64) (tv Timeval) { return } -type SecurityAttributes struct { - Length uint32 - SecurityDescriptor uintptr - InheritHandle uint32 -} - type Overlapped struct { Internal uintptr InternalHigh uintptr @@ -1187,6 +1172,28 @@ const ( REG_QWORD = REG_QWORD_LITTLE_ENDIAN ) +const ( + EVENT_MODIFY_STATE = 0x0002 + EVENT_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3 + + MUTANT_QUERY_STATE = 0x0001 + MUTANT_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | MUTANT_QUERY_STATE + + SEMAPHORE_MODIFY_STATE = 0x0002 + SEMAPHORE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3 + + TIMER_QUERY_STATE = 0x0001 + TIMER_MODIFY_STATE = 0x0002 + TIMER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | TIMER_QUERY_STATE | TIMER_MODIFY_STATE + + MUTEX_MODIFY_STATE = MUTANT_QUERY_STATE + MUTEX_ALL_ACCESS = MUTANT_ALL_ACCESS + + CREATE_EVENT_MANUAL_RESET = 0x1 + CREATE_EVENT_INITIAL_SET = 0x2 + CREATE_MUTEX_INITIAL_OWNER = 0x1 +) + type AddrinfoW struct { Flags int32 Family int32 @@ -1663,3 +1670,75 @@ type OsVersionInfoEx struct { ProductType byte _ byte } + +const ( + EWX_LOGOFF = 0x00000000 + EWX_SHUTDOWN = 0x00000001 + EWX_REBOOT = 0x00000002 + EWX_FORCE = 0x00000004 + EWX_POWEROFF = 0x00000008 + EWX_FORCEIFHUNG = 0x00000010 + EWX_QUICKRESOLVE = 0x00000020 + EWX_RESTARTAPPS = 0x00000040 + EWX_HYBRID_SHUTDOWN = 0x00400000 + EWX_BOOTOPTIONS = 0x01000000 + + SHTDN_REASON_FLAG_COMMENT_REQUIRED = 0x01000000 + SHTDN_REASON_FLAG_DIRTY_PROBLEM_ID_REQUIRED = 0x02000000 + SHTDN_REASON_FLAG_CLEAN_UI = 0x04000000 + SHTDN_REASON_FLAG_DIRTY_UI = 0x08000000 + SHTDN_REASON_FLAG_USER_DEFINED = 0x40000000 + SHTDN_REASON_FLAG_PLANNED = 0x80000000 + SHTDN_REASON_MAJOR_OTHER = 0x00000000 + SHTDN_REASON_MAJOR_NONE = 0x00000000 + SHTDN_REASON_MAJOR_HARDWARE = 0x00010000 + SHTDN_REASON_MAJOR_OPERATINGSYSTEM = 0x00020000 + SHTDN_REASON_MAJOR_SOFTWARE = 0x00030000 + SHTDN_REASON_MAJOR_APPLICATION = 0x00040000 + SHTDN_REASON_MAJOR_SYSTEM = 0x00050000 + SHTDN_REASON_MAJOR_POWER = 0x00060000 + SHTDN_REASON_MAJOR_LEGACY_API = 0x00070000 + SHTDN_REASON_MINOR_OTHER = 0x00000000 + SHTDN_REASON_MINOR_NONE = 0x000000ff + SHTDN_REASON_MINOR_MAINTENANCE = 0x00000001 + SHTDN_REASON_MINOR_INSTALLATION = 0x00000002 + SHTDN_REASON_MINOR_UPGRADE = 0x00000003 + SHTDN_REASON_MINOR_RECONFIG = 0x00000004 + SHTDN_REASON_MINOR_HUNG = 0x00000005 + SHTDN_REASON_MINOR_UNSTABLE = 0x00000006 + SHTDN_REASON_MINOR_DISK = 0x00000007 + SHTDN_REASON_MINOR_PROCESSOR = 0x00000008 + SHTDN_REASON_MINOR_NETWORKCARD = 0x00000009 + SHTDN_REASON_MINOR_POWER_SUPPLY = 0x0000000a + SHTDN_REASON_MINOR_CORDUNPLUGGED = 0x0000000b + SHTDN_REASON_MINOR_ENVIRONMENT = 0x0000000c + SHTDN_REASON_MINOR_HARDWARE_DRIVER = 0x0000000d + SHTDN_REASON_MINOR_OTHERDRIVER = 0x0000000e + SHTDN_REASON_MINOR_BLUESCREEN = 0x0000000F + SHTDN_REASON_MINOR_SERVICEPACK = 0x00000010 + SHTDN_REASON_MINOR_HOTFIX = 0x00000011 + SHTDN_REASON_MINOR_SECURITYFIX = 0x00000012 + SHTDN_REASON_MINOR_SECURITY = 0x00000013 + SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY = 0x00000014 + SHTDN_REASON_MINOR_WMI = 0x00000015 + SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL = 0x00000016 + SHTDN_REASON_MINOR_HOTFIX_UNINSTALL = 0x00000017 + SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL = 0x00000018 + SHTDN_REASON_MINOR_MMC = 0x00000019 + SHTDN_REASON_MINOR_SYSTEMRESTORE = 0x0000001a + SHTDN_REASON_MINOR_TERMSRV = 0x00000020 + SHTDN_REASON_MINOR_DC_PROMOTION = 0x00000021 + SHTDN_REASON_MINOR_DC_DEMOTION = 0x00000022 + SHTDN_REASON_UNKNOWN = SHTDN_REASON_MINOR_NONE + SHTDN_REASON_LEGACY_API = SHTDN_REASON_MAJOR_LEGACY_API | SHTDN_REASON_FLAG_PLANNED + SHTDN_REASON_VALID_BIT_MASK = 0xc0ffffff + + SHUTDOWN_NORETRY = 0x1 +) + +// Flags used for GetModuleHandleEx +const ( + GET_MODULE_HANDLE_EX_FLAG_PIN = 1 + GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT = 2 + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS = 4 +) diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index d461bed..6658ccd 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -44,6 +44,7 @@ var ( moduser32 = NewLazySystemDLL("user32.dll") modole32 = NewLazySystemDLL("ole32.dll") modntdll = NewLazySystemDLL("ntdll.dll") + modpsapi = NewLazySystemDLL("psapi.dll") modws2_32 = NewLazySystemDLL("ws2_32.dll") moddnsapi = NewLazySystemDLL("dnsapi.dll") modiphlpapi = NewLazySystemDLL("iphlpapi.dll") @@ -51,261 +52,302 @@ var ( modnetapi32 = NewLazySystemDLL("netapi32.dll") modwtsapi32 = NewLazySystemDLL("wtsapi32.dll") - procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW") - procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource") - procReportEventW = modadvapi32.NewProc("ReportEventW") - procOpenSCManagerW = modadvapi32.NewProc("OpenSCManagerW") - procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle") - procCreateServiceW = modadvapi32.NewProc("CreateServiceW") - procOpenServiceW = modadvapi32.NewProc("OpenServiceW") - procDeleteService = modadvapi32.NewProc("DeleteService") - procStartServiceW = modadvapi32.NewProc("StartServiceW") - procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus") - procQueryServiceLockStatusW = modadvapi32.NewProc("QueryServiceLockStatusW") - procControlService = modadvapi32.NewProc("ControlService") - procStartServiceCtrlDispatcherW = modadvapi32.NewProc("StartServiceCtrlDispatcherW") - procSetServiceStatus = modadvapi32.NewProc("SetServiceStatus") - procChangeServiceConfigW = modadvapi32.NewProc("ChangeServiceConfigW") - procQueryServiceConfigW = modadvapi32.NewProc("QueryServiceConfigW") - procChangeServiceConfig2W = modadvapi32.NewProc("ChangeServiceConfig2W") - procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W") - procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW") - procQueryServiceStatusEx = modadvapi32.NewProc("QueryServiceStatusEx") - procNotifyServiceStatusChangeW = modadvapi32.NewProc("NotifyServiceStatusChangeW") - procGetLastError = modkernel32.NewProc("GetLastError") - procLoadLibraryW = modkernel32.NewProc("LoadLibraryW") - procLoadLibraryExW = modkernel32.NewProc("LoadLibraryExW") - procFreeLibrary = modkernel32.NewProc("FreeLibrary") - procGetProcAddress = modkernel32.NewProc("GetProcAddress") - procGetVersion = modkernel32.NewProc("GetVersion") - procFormatMessageW = modkernel32.NewProc("FormatMessageW") - procExitProcess = modkernel32.NewProc("ExitProcess") - procIsWow64Process = modkernel32.NewProc("IsWow64Process") - procCreateFileW = modkernel32.NewProc("CreateFileW") - procReadFile = modkernel32.NewProc("ReadFile") - procWriteFile = modkernel32.NewProc("WriteFile") - procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult") - procSetFilePointer = modkernel32.NewProc("SetFilePointer") - procCloseHandle = modkernel32.NewProc("CloseHandle") - procGetStdHandle = modkernel32.NewProc("GetStdHandle") - procSetStdHandle = modkernel32.NewProc("SetStdHandle") - procFindFirstFileW = modkernel32.NewProc("FindFirstFileW") - procFindNextFileW = modkernel32.NewProc("FindNextFileW") - procFindClose = modkernel32.NewProc("FindClose") - procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle") - procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx") - procGetCurrentDirectoryW = modkernel32.NewProc("GetCurrentDirectoryW") - procSetCurrentDirectoryW = modkernel32.NewProc("SetCurrentDirectoryW") - procCreateDirectoryW = modkernel32.NewProc("CreateDirectoryW") - procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") - procDeleteFileW = modkernel32.NewProc("DeleteFileW") - procMoveFileW = modkernel32.NewProc("MoveFileW") - procMoveFileExW = modkernel32.NewProc("MoveFileExW") - procGetComputerNameW = modkernel32.NewProc("GetComputerNameW") - procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") - procSetEndOfFile = modkernel32.NewProc("SetEndOfFile") - procGetSystemTimeAsFileTime = modkernel32.NewProc("GetSystemTimeAsFileTime") - procGetSystemTimePreciseAsFileTime = modkernel32.NewProc("GetSystemTimePreciseAsFileTime") - procGetTimeZoneInformation = modkernel32.NewProc("GetTimeZoneInformation") - procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") - procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") - procPostQueuedCompletionStatus = modkernel32.NewProc("PostQueuedCompletionStatus") - procCancelIo = modkernel32.NewProc("CancelIo") - procCancelIoEx = modkernel32.NewProc("CancelIoEx") - procCreateProcessW = modkernel32.NewProc("CreateProcessW") - procOpenProcess = modkernel32.NewProc("OpenProcess") - procShellExecuteW = modshell32.NewProc("ShellExecuteW") - procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath") - procTerminateProcess = modkernel32.NewProc("TerminateProcess") - procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess") - procGetStartupInfoW = modkernel32.NewProc("GetStartupInfoW") - procGetCurrentProcess = modkernel32.NewProc("GetCurrentProcess") - procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") - procGetProcessTimes = modkernel32.NewProc("GetProcessTimes") - procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") - procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject") - procWaitForMultipleObjects = modkernel32.NewProc("WaitForMultipleObjects") - procGetTempPathW = modkernel32.NewProc("GetTempPathW") - procCreatePipe = modkernel32.NewProc("CreatePipe") - procGetFileType = modkernel32.NewProc("GetFileType") - procCryptAcquireContextW = modadvapi32.NewProc("CryptAcquireContextW") - procCryptReleaseContext = modadvapi32.NewProc("CryptReleaseContext") - procCryptGenRandom = modadvapi32.NewProc("CryptGenRandom") - procGetEnvironmentStringsW = modkernel32.NewProc("GetEnvironmentStringsW") - procFreeEnvironmentStringsW = modkernel32.NewProc("FreeEnvironmentStringsW") - procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW") - procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") - procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock") - procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock") - procGetTickCount64 = modkernel32.NewProc("GetTickCount64") - procSetFileTime = modkernel32.NewProc("SetFileTime") - procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") - procSetFileAttributesW = modkernel32.NewProc("SetFileAttributesW") - procGetFileAttributesExW = modkernel32.NewProc("GetFileAttributesExW") - procGetCommandLineW = modkernel32.NewProc("GetCommandLineW") - procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW") - procLocalFree = modkernel32.NewProc("LocalFree") - procSetHandleInformation = modkernel32.NewProc("SetHandleInformation") - procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers") - procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW") - procGetLongPathNameW = modkernel32.NewProc("GetLongPathNameW") - procGetShortPathNameW = modkernel32.NewProc("GetShortPathNameW") - procCreateFileMappingW = modkernel32.NewProc("CreateFileMappingW") - procMapViewOfFile = modkernel32.NewProc("MapViewOfFile") - procUnmapViewOfFile = modkernel32.NewProc("UnmapViewOfFile") - procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile") - procVirtualLock = modkernel32.NewProc("VirtualLock") - procVirtualUnlock = modkernel32.NewProc("VirtualUnlock") - procVirtualAlloc = modkernel32.NewProc("VirtualAlloc") - procVirtualFree = modkernel32.NewProc("VirtualFree") - procVirtualProtect = modkernel32.NewProc("VirtualProtect") - procTransmitFile = modmswsock.NewProc("TransmitFile") - procReadDirectoryChangesW = modkernel32.NewProc("ReadDirectoryChangesW") - procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW") - procCertOpenStore = modcrypt32.NewProc("CertOpenStore") - procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore") - procCertAddCertificateContextToStore = modcrypt32.NewProc("CertAddCertificateContextToStore") - procCertCloseStore = modcrypt32.NewProc("CertCloseStore") - procCertGetCertificateChain = modcrypt32.NewProc("CertGetCertificateChain") - procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain") - procCertCreateCertificateContext = modcrypt32.NewProc("CertCreateCertificateContext") - procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext") - procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy") - procRegOpenKeyExW = modadvapi32.NewProc("RegOpenKeyExW") - procRegCloseKey = modadvapi32.NewProc("RegCloseKey") - procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW") - procRegEnumKeyExW = modadvapi32.NewProc("RegEnumKeyExW") - procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW") - procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId") - procGetConsoleMode = modkernel32.NewProc("GetConsoleMode") - procSetConsoleMode = modkernel32.NewProc("SetConsoleMode") - procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo") - procWriteConsoleW = modkernel32.NewProc("WriteConsoleW") - procReadConsoleW = modkernel32.NewProc("ReadConsoleW") - procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") - procProcess32FirstW = modkernel32.NewProc("Process32FirstW") - procProcess32NextW = modkernel32.NewProc("Process32NextW") - procThread32First = modkernel32.NewProc("Thread32First") - procThread32Next = modkernel32.NewProc("Thread32Next") - procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") - procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") - procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW") - procGetCurrentThreadId = modkernel32.NewProc("GetCurrentThreadId") - procCreateEventW = modkernel32.NewProc("CreateEventW") - procCreateEventExW = modkernel32.NewProc("CreateEventExW") - procOpenEventW = modkernel32.NewProc("OpenEventW") - procSetEvent = modkernel32.NewProc("SetEvent") - procResetEvent = modkernel32.NewProc("ResetEvent") - procPulseEvent = modkernel32.NewProc("PulseEvent") - procSleepEx = modkernel32.NewProc("SleepEx") - procCreateJobObjectW = modkernel32.NewProc("CreateJobObjectW") - procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject") - procTerminateJobObject = modkernel32.NewProc("TerminateJobObject") - procSetErrorMode = modkernel32.NewProc("SetErrorMode") - procResumeThread = modkernel32.NewProc("ResumeThread") - procSetPriorityClass = modkernel32.NewProc("SetPriorityClass") - procGetPriorityClass = modkernel32.NewProc("GetPriorityClass") - procSetInformationJobObject = modkernel32.NewProc("SetInformationJobObject") - procGenerateConsoleCtrlEvent = modkernel32.NewProc("GenerateConsoleCtrlEvent") - procGetProcessId = modkernel32.NewProc("GetProcessId") - procOpenThread = modkernel32.NewProc("OpenThread") - procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW") - procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW") - procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW") - procFindFirstVolumeMountPointW = modkernel32.NewProc("FindFirstVolumeMountPointW") - procFindNextVolumeW = modkernel32.NewProc("FindNextVolumeW") - procFindNextVolumeMountPointW = modkernel32.NewProc("FindNextVolumeMountPointW") - procFindVolumeClose = modkernel32.NewProc("FindVolumeClose") - procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose") - procGetDriveTypeW = modkernel32.NewProc("GetDriveTypeW") - procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives") - procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW") - procGetVolumeInformationW = modkernel32.NewProc("GetVolumeInformationW") - procGetVolumeInformationByHandleW = modkernel32.NewProc("GetVolumeInformationByHandleW") - procGetVolumeNameForVolumeMountPointW = modkernel32.NewProc("GetVolumeNameForVolumeMountPointW") - procGetVolumePathNameW = modkernel32.NewProc("GetVolumePathNameW") - procGetVolumePathNamesForVolumeNameW = modkernel32.NewProc("GetVolumePathNamesForVolumeNameW") - procQueryDosDeviceW = modkernel32.NewProc("QueryDosDeviceW") - procSetVolumeLabelW = modkernel32.NewProc("SetVolumeLabelW") - procSetVolumeMountPointW = modkernel32.NewProc("SetVolumeMountPointW") - procMessageBoxW = moduser32.NewProc("MessageBoxW") - procCLSIDFromString = modole32.NewProc("CLSIDFromString") - procStringFromGUID2 = modole32.NewProc("StringFromGUID2") - procCoCreateGuid = modole32.NewProc("CoCreateGuid") - procCoTaskMemFree = modole32.NewProc("CoTaskMemFree") - procRtlGetVersion = modntdll.NewProc("RtlGetVersion") - procWSAStartup = modws2_32.NewProc("WSAStartup") - procWSACleanup = modws2_32.NewProc("WSACleanup") - procWSAIoctl = modws2_32.NewProc("WSAIoctl") - procsocket = modws2_32.NewProc("socket") - procsetsockopt = modws2_32.NewProc("setsockopt") - procgetsockopt = modws2_32.NewProc("getsockopt") - procbind = modws2_32.NewProc("bind") - procconnect = modws2_32.NewProc("connect") - procgetsockname = modws2_32.NewProc("getsockname") - procgetpeername = modws2_32.NewProc("getpeername") - proclisten = modws2_32.NewProc("listen") - procshutdown = modws2_32.NewProc("shutdown") - procclosesocket = modws2_32.NewProc("closesocket") - procAcceptEx = modmswsock.NewProc("AcceptEx") - procGetAcceptExSockaddrs = modmswsock.NewProc("GetAcceptExSockaddrs") - procWSARecv = modws2_32.NewProc("WSARecv") - procWSASend = modws2_32.NewProc("WSASend") - procWSARecvFrom = modws2_32.NewProc("WSARecvFrom") - procWSASendTo = modws2_32.NewProc("WSASendTo") - procgethostbyname = modws2_32.NewProc("gethostbyname") - procgetservbyname = modws2_32.NewProc("getservbyname") - procntohs = modws2_32.NewProc("ntohs") - procgetprotobyname = modws2_32.NewProc("getprotobyname") - procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W") - procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree") - procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W") - procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") - procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") - procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") - procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") - procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") - procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW") - procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses") - procGetACP = modkernel32.NewProc("GetACP") - procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar") - procTranslateNameW = modsecur32.NewProc("TranslateNameW") - procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") - procNetUserGetInfo = modnetapi32.NewProc("NetUserGetInfo") - procNetGetJoinInformation = modnetapi32.NewProc("NetGetJoinInformation") - procNetApiBufferFree = modnetapi32.NewProc("NetApiBufferFree") - procLookupAccountSidW = modadvapi32.NewProc("LookupAccountSidW") - procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") - procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") - procConvertStringSidToSidW = modadvapi32.NewProc("ConvertStringSidToSidW") - procGetLengthSid = modadvapi32.NewProc("GetLengthSid") - procCopySid = modadvapi32.NewProc("CopySid") - procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid") - procCreateWellKnownSid = modadvapi32.NewProc("CreateWellKnownSid") - procIsWellKnownSid = modadvapi32.NewProc("IsWellKnownSid") - procFreeSid = modadvapi32.NewProc("FreeSid") - procEqualSid = modadvapi32.NewProc("EqualSid") - procGetSidIdentifierAuthority = modadvapi32.NewProc("GetSidIdentifierAuthority") - procGetSidSubAuthorityCount = modadvapi32.NewProc("GetSidSubAuthorityCount") - procGetSidSubAuthority = modadvapi32.NewProc("GetSidSubAuthority") - procIsValidSid = modadvapi32.NewProc("IsValidSid") - procCheckTokenMembership = modadvapi32.NewProc("CheckTokenMembership") - procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken") - procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") - procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf") - procRevertToSelf = modadvapi32.NewProc("RevertToSelf") - procSetThreadToken = modadvapi32.NewProc("SetThreadToken") - procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW") - procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") - procAdjustTokenGroups = modadvapi32.NewProc("AdjustTokenGroups") - procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation") - procSetTokenInformation = modadvapi32.NewProc("SetTokenInformation") - procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx") - procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") - procGetSystemDirectoryW = modkernel32.NewProc("GetSystemDirectoryW") - procWTSQueryUserToken = modwtsapi32.NewProc("WTSQueryUserToken") - procWTSEnumerateSessionsW = modwtsapi32.NewProc("WTSEnumerateSessionsW") - procWTSFreeMemory = modwtsapi32.NewProc("WTSFreeMemory") + procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW") + procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource") + procReportEventW = modadvapi32.NewProc("ReportEventW") + procOpenSCManagerW = modadvapi32.NewProc("OpenSCManagerW") + procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle") + procCreateServiceW = modadvapi32.NewProc("CreateServiceW") + procOpenServiceW = modadvapi32.NewProc("OpenServiceW") + procDeleteService = modadvapi32.NewProc("DeleteService") + procStartServiceW = modadvapi32.NewProc("StartServiceW") + procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus") + procQueryServiceLockStatusW = modadvapi32.NewProc("QueryServiceLockStatusW") + procControlService = modadvapi32.NewProc("ControlService") + procStartServiceCtrlDispatcherW = modadvapi32.NewProc("StartServiceCtrlDispatcherW") + procSetServiceStatus = modadvapi32.NewProc("SetServiceStatus") + procChangeServiceConfigW = modadvapi32.NewProc("ChangeServiceConfigW") + procQueryServiceConfigW = modadvapi32.NewProc("QueryServiceConfigW") + procChangeServiceConfig2W = modadvapi32.NewProc("ChangeServiceConfig2W") + procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W") + procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW") + procQueryServiceStatusEx = modadvapi32.NewProc("QueryServiceStatusEx") + procNotifyServiceStatusChangeW = modadvapi32.NewProc("NotifyServiceStatusChangeW") + procGetLastError = modkernel32.NewProc("GetLastError") + procLoadLibraryW = modkernel32.NewProc("LoadLibraryW") + procLoadLibraryExW = modkernel32.NewProc("LoadLibraryExW") + procFreeLibrary = modkernel32.NewProc("FreeLibrary") + procGetProcAddress = modkernel32.NewProc("GetProcAddress") + procGetModuleFileNameW = modkernel32.NewProc("GetModuleFileNameW") + procGetModuleHandleExW = modkernel32.NewProc("GetModuleHandleExW") + procGetVersion = modkernel32.NewProc("GetVersion") + procFormatMessageW = modkernel32.NewProc("FormatMessageW") + procExitProcess = modkernel32.NewProc("ExitProcess") + procIsWow64Process = modkernel32.NewProc("IsWow64Process") + procCreateFileW = modkernel32.NewProc("CreateFileW") + procReadFile = modkernel32.NewProc("ReadFile") + procWriteFile = modkernel32.NewProc("WriteFile") + procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult") + procSetFilePointer = modkernel32.NewProc("SetFilePointer") + procCloseHandle = modkernel32.NewProc("CloseHandle") + procGetStdHandle = modkernel32.NewProc("GetStdHandle") + procSetStdHandle = modkernel32.NewProc("SetStdHandle") + procFindFirstFileW = modkernel32.NewProc("FindFirstFileW") + procFindNextFileW = modkernel32.NewProc("FindNextFileW") + procFindClose = modkernel32.NewProc("FindClose") + procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle") + procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx") + procGetCurrentDirectoryW = modkernel32.NewProc("GetCurrentDirectoryW") + procSetCurrentDirectoryW = modkernel32.NewProc("SetCurrentDirectoryW") + procCreateDirectoryW = modkernel32.NewProc("CreateDirectoryW") + procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") + procDeleteFileW = modkernel32.NewProc("DeleteFileW") + procMoveFileW = modkernel32.NewProc("MoveFileW") + procMoveFileExW = modkernel32.NewProc("MoveFileExW") + procLockFileEx = modkernel32.NewProc("LockFileEx") + procUnlockFileEx = modkernel32.NewProc("UnlockFileEx") + procGetComputerNameW = modkernel32.NewProc("GetComputerNameW") + procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") + procSetEndOfFile = modkernel32.NewProc("SetEndOfFile") + procGetSystemTimeAsFileTime = modkernel32.NewProc("GetSystemTimeAsFileTime") + procGetSystemTimePreciseAsFileTime = modkernel32.NewProc("GetSystemTimePreciseAsFileTime") + procGetTimeZoneInformation = modkernel32.NewProc("GetTimeZoneInformation") + procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") + procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") + procPostQueuedCompletionStatus = modkernel32.NewProc("PostQueuedCompletionStatus") + procCancelIo = modkernel32.NewProc("CancelIo") + procCancelIoEx = modkernel32.NewProc("CancelIoEx") + procCreateProcessW = modkernel32.NewProc("CreateProcessW") + procOpenProcess = modkernel32.NewProc("OpenProcess") + procShellExecuteW = modshell32.NewProc("ShellExecuteW") + procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath") + procTerminateProcess = modkernel32.NewProc("TerminateProcess") + procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess") + procGetStartupInfoW = modkernel32.NewProc("GetStartupInfoW") + procGetProcessTimes = modkernel32.NewProc("GetProcessTimes") + procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") + procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject") + procWaitForMultipleObjects = modkernel32.NewProc("WaitForMultipleObjects") + procGetTempPathW = modkernel32.NewProc("GetTempPathW") + procCreatePipe = modkernel32.NewProc("CreatePipe") + procGetFileType = modkernel32.NewProc("GetFileType") + procCryptAcquireContextW = modadvapi32.NewProc("CryptAcquireContextW") + procCryptReleaseContext = modadvapi32.NewProc("CryptReleaseContext") + procCryptGenRandom = modadvapi32.NewProc("CryptGenRandom") + procGetEnvironmentStringsW = modkernel32.NewProc("GetEnvironmentStringsW") + procFreeEnvironmentStringsW = modkernel32.NewProc("FreeEnvironmentStringsW") + procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW") + procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") + procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock") + procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock") + procGetTickCount64 = modkernel32.NewProc("GetTickCount64") + procSetFileTime = modkernel32.NewProc("SetFileTime") + procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") + procSetFileAttributesW = modkernel32.NewProc("SetFileAttributesW") + procGetFileAttributesExW = modkernel32.NewProc("GetFileAttributesExW") + procGetCommandLineW = modkernel32.NewProc("GetCommandLineW") + procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW") + procLocalFree = modkernel32.NewProc("LocalFree") + procSetHandleInformation = modkernel32.NewProc("SetHandleInformation") + procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers") + procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW") + procGetLongPathNameW = modkernel32.NewProc("GetLongPathNameW") + procGetShortPathNameW = modkernel32.NewProc("GetShortPathNameW") + procCreateFileMappingW = modkernel32.NewProc("CreateFileMappingW") + procMapViewOfFile = modkernel32.NewProc("MapViewOfFile") + procUnmapViewOfFile = modkernel32.NewProc("UnmapViewOfFile") + procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile") + procVirtualLock = modkernel32.NewProc("VirtualLock") + procVirtualUnlock = modkernel32.NewProc("VirtualUnlock") + procVirtualAlloc = modkernel32.NewProc("VirtualAlloc") + procVirtualFree = modkernel32.NewProc("VirtualFree") + procVirtualProtect = modkernel32.NewProc("VirtualProtect") + procTransmitFile = modmswsock.NewProc("TransmitFile") + procReadDirectoryChangesW = modkernel32.NewProc("ReadDirectoryChangesW") + procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW") + procCertOpenStore = modcrypt32.NewProc("CertOpenStore") + procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore") + procCertAddCertificateContextToStore = modcrypt32.NewProc("CertAddCertificateContextToStore") + procCertCloseStore = modcrypt32.NewProc("CertCloseStore") + procCertGetCertificateChain = modcrypt32.NewProc("CertGetCertificateChain") + procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain") + procCertCreateCertificateContext = modcrypt32.NewProc("CertCreateCertificateContext") + procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext") + procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy") + procRegOpenKeyExW = modadvapi32.NewProc("RegOpenKeyExW") + procRegCloseKey = modadvapi32.NewProc("RegCloseKey") + procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW") + procRegEnumKeyExW = modadvapi32.NewProc("RegEnumKeyExW") + procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW") + procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId") + procGetConsoleMode = modkernel32.NewProc("GetConsoleMode") + procSetConsoleMode = modkernel32.NewProc("SetConsoleMode") + procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo") + procWriteConsoleW = modkernel32.NewProc("WriteConsoleW") + procReadConsoleW = modkernel32.NewProc("ReadConsoleW") + procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") + procProcess32FirstW = modkernel32.NewProc("Process32FirstW") + procProcess32NextW = modkernel32.NewProc("Process32NextW") + procThread32First = modkernel32.NewProc("Thread32First") + procThread32Next = modkernel32.NewProc("Thread32Next") + procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") + procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") + procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW") + procGetCurrentThreadId = modkernel32.NewProc("GetCurrentThreadId") + procCreateEventW = modkernel32.NewProc("CreateEventW") + procCreateEventExW = modkernel32.NewProc("CreateEventExW") + procOpenEventW = modkernel32.NewProc("OpenEventW") + procSetEvent = modkernel32.NewProc("SetEvent") + procResetEvent = modkernel32.NewProc("ResetEvent") + procPulseEvent = modkernel32.NewProc("PulseEvent") + procCreateMutexW = modkernel32.NewProc("CreateMutexW") + procCreateMutexExW = modkernel32.NewProc("CreateMutexExW") + procOpenMutexW = modkernel32.NewProc("OpenMutexW") + procReleaseMutex = modkernel32.NewProc("ReleaseMutex") + procSleepEx = modkernel32.NewProc("SleepEx") + procCreateJobObjectW = modkernel32.NewProc("CreateJobObjectW") + procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject") + procTerminateJobObject = modkernel32.NewProc("TerminateJobObject") + procSetErrorMode = modkernel32.NewProc("SetErrorMode") + procResumeThread = modkernel32.NewProc("ResumeThread") + procSetPriorityClass = modkernel32.NewProc("SetPriorityClass") + procGetPriorityClass = modkernel32.NewProc("GetPriorityClass") + procSetInformationJobObject = modkernel32.NewProc("SetInformationJobObject") + procGenerateConsoleCtrlEvent = modkernel32.NewProc("GenerateConsoleCtrlEvent") + procGetProcessId = modkernel32.NewProc("GetProcessId") + procOpenThread = modkernel32.NewProc("OpenThread") + procSetProcessPriorityBoost = modkernel32.NewProc("SetProcessPriorityBoost") + procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW") + procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW") + procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW") + procFindFirstVolumeMountPointW = modkernel32.NewProc("FindFirstVolumeMountPointW") + procFindNextVolumeW = modkernel32.NewProc("FindNextVolumeW") + procFindNextVolumeMountPointW = modkernel32.NewProc("FindNextVolumeMountPointW") + procFindVolumeClose = modkernel32.NewProc("FindVolumeClose") + procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose") + procGetDiskFreeSpaceExW = modkernel32.NewProc("GetDiskFreeSpaceExW") + procGetDriveTypeW = modkernel32.NewProc("GetDriveTypeW") + procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives") + procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW") + procGetVolumeInformationW = modkernel32.NewProc("GetVolumeInformationW") + procGetVolumeInformationByHandleW = modkernel32.NewProc("GetVolumeInformationByHandleW") + procGetVolumeNameForVolumeMountPointW = modkernel32.NewProc("GetVolumeNameForVolumeMountPointW") + procGetVolumePathNameW = modkernel32.NewProc("GetVolumePathNameW") + procGetVolumePathNamesForVolumeNameW = modkernel32.NewProc("GetVolumePathNamesForVolumeNameW") + procQueryDosDeviceW = modkernel32.NewProc("QueryDosDeviceW") + procSetVolumeLabelW = modkernel32.NewProc("SetVolumeLabelW") + procSetVolumeMountPointW = modkernel32.NewProc("SetVolumeMountPointW") + procMessageBoxW = moduser32.NewProc("MessageBoxW") + procExitWindowsEx = moduser32.NewProc("ExitWindowsEx") + procInitiateSystemShutdownExW = modadvapi32.NewProc("InitiateSystemShutdownExW") + procSetProcessShutdownParameters = modkernel32.NewProc("SetProcessShutdownParameters") + procGetProcessShutdownParameters = modkernel32.NewProc("GetProcessShutdownParameters") + procCLSIDFromString = modole32.NewProc("CLSIDFromString") + procStringFromGUID2 = modole32.NewProc("StringFromGUID2") + procCoCreateGuid = modole32.NewProc("CoCreateGuid") + procCoTaskMemFree = modole32.NewProc("CoTaskMemFree") + procRtlGetVersion = modntdll.NewProc("RtlGetVersion") + procRtlGetNtVersionNumbers = modntdll.NewProc("RtlGetNtVersionNumbers") + procEnumProcesses = modpsapi.NewProc("EnumProcesses") + procWSAStartup = modws2_32.NewProc("WSAStartup") + procWSACleanup = modws2_32.NewProc("WSACleanup") + procWSAIoctl = modws2_32.NewProc("WSAIoctl") + procsocket = modws2_32.NewProc("socket") + procsetsockopt = modws2_32.NewProc("setsockopt") + procgetsockopt = modws2_32.NewProc("getsockopt") + procbind = modws2_32.NewProc("bind") + procconnect = modws2_32.NewProc("connect") + procgetsockname = modws2_32.NewProc("getsockname") + procgetpeername = modws2_32.NewProc("getpeername") + proclisten = modws2_32.NewProc("listen") + procshutdown = modws2_32.NewProc("shutdown") + procclosesocket = modws2_32.NewProc("closesocket") + procAcceptEx = modmswsock.NewProc("AcceptEx") + procGetAcceptExSockaddrs = modmswsock.NewProc("GetAcceptExSockaddrs") + procWSARecv = modws2_32.NewProc("WSARecv") + procWSASend = modws2_32.NewProc("WSASend") + procWSARecvFrom = modws2_32.NewProc("WSARecvFrom") + procWSASendTo = modws2_32.NewProc("WSASendTo") + procgethostbyname = modws2_32.NewProc("gethostbyname") + procgetservbyname = modws2_32.NewProc("getservbyname") + procntohs = modws2_32.NewProc("ntohs") + procgetprotobyname = modws2_32.NewProc("getprotobyname") + procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W") + procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree") + procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W") + procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") + procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") + procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") + procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") + procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") + procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW") + procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses") + procGetACP = modkernel32.NewProc("GetACP") + procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar") + procTranslateNameW = modsecur32.NewProc("TranslateNameW") + procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") + procNetUserGetInfo = modnetapi32.NewProc("NetUserGetInfo") + procNetGetJoinInformation = modnetapi32.NewProc("NetGetJoinInformation") + procNetApiBufferFree = modnetapi32.NewProc("NetApiBufferFree") + procLookupAccountSidW = modadvapi32.NewProc("LookupAccountSidW") + procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") + procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") + procConvertStringSidToSidW = modadvapi32.NewProc("ConvertStringSidToSidW") + procGetLengthSid = modadvapi32.NewProc("GetLengthSid") + procCopySid = modadvapi32.NewProc("CopySid") + procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid") + procCreateWellKnownSid = modadvapi32.NewProc("CreateWellKnownSid") + procIsWellKnownSid = modadvapi32.NewProc("IsWellKnownSid") + procFreeSid = modadvapi32.NewProc("FreeSid") + procEqualSid = modadvapi32.NewProc("EqualSid") + procGetSidIdentifierAuthority = modadvapi32.NewProc("GetSidIdentifierAuthority") + procGetSidSubAuthorityCount = modadvapi32.NewProc("GetSidSubAuthorityCount") + procGetSidSubAuthority = modadvapi32.NewProc("GetSidSubAuthority") + procIsValidSid = modadvapi32.NewProc("IsValidSid") + procCheckTokenMembership = modadvapi32.NewProc("CheckTokenMembership") + procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken") + procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") + procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf") + procRevertToSelf = modadvapi32.NewProc("RevertToSelf") + procSetThreadToken = modadvapi32.NewProc("SetThreadToken") + procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW") + procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") + procAdjustTokenGroups = modadvapi32.NewProc("AdjustTokenGroups") + procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation") + procSetTokenInformation = modadvapi32.NewProc("SetTokenInformation") + procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx") + procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") + procGetSystemDirectoryW = modkernel32.NewProc("GetSystemDirectoryW") + procGetWindowsDirectoryW = modkernel32.NewProc("GetWindowsDirectoryW") + procGetSystemWindowsDirectoryW = modkernel32.NewProc("GetSystemWindowsDirectoryW") + procWTSQueryUserToken = modwtsapi32.NewProc("WTSQueryUserToken") + procWTSEnumerateSessionsW = modwtsapi32.NewProc("WTSEnumerateSessionsW") + procWTSFreeMemory = modwtsapi32.NewProc("WTSFreeMemory") + procGetSecurityInfo = modadvapi32.NewProc("GetSecurityInfo") + procSetSecurityInfo = modadvapi32.NewProc("SetSecurityInfo") + procGetNamedSecurityInfoW = modadvapi32.NewProc("GetNamedSecurityInfoW") + procSetNamedSecurityInfoW = modadvapi32.NewProc("SetNamedSecurityInfoW") + procBuildSecurityDescriptorW = modadvapi32.NewProc("BuildSecurityDescriptorW") + procInitializeSecurityDescriptor = modadvapi32.NewProc("InitializeSecurityDescriptor") + procGetSecurityDescriptorControl = modadvapi32.NewProc("GetSecurityDescriptorControl") + procGetSecurityDescriptorDacl = modadvapi32.NewProc("GetSecurityDescriptorDacl") + procGetSecurityDescriptorSacl = modadvapi32.NewProc("GetSecurityDescriptorSacl") + procGetSecurityDescriptorOwner = modadvapi32.NewProc("GetSecurityDescriptorOwner") + procGetSecurityDescriptorGroup = modadvapi32.NewProc("GetSecurityDescriptorGroup") + procGetSecurityDescriptorLength = modadvapi32.NewProc("GetSecurityDescriptorLength") + procGetSecurityDescriptorRMControl = modadvapi32.NewProc("GetSecurityDescriptorRMControl") + procIsValidSecurityDescriptor = modadvapi32.NewProc("IsValidSecurityDescriptor") + procSetSecurityDescriptorControl = modadvapi32.NewProc("SetSecurityDescriptorControl") + procSetSecurityDescriptorDacl = modadvapi32.NewProc("SetSecurityDescriptorDacl") + procSetSecurityDescriptorSacl = modadvapi32.NewProc("SetSecurityDescriptorSacl") + procSetSecurityDescriptorOwner = modadvapi32.NewProc("SetSecurityDescriptorOwner") + procSetSecurityDescriptorGroup = modadvapi32.NewProc("SetSecurityDescriptorGroup") + procSetSecurityDescriptorRMControl = modadvapi32.NewProc("SetSecurityDescriptorRMControl") + procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW") + procConvertSecurityDescriptorToStringSecurityDescriptorW = modadvapi32.NewProc("ConvertSecurityDescriptorToStringSecurityDescriptorW") + procMakeAbsoluteSD = modadvapi32.NewProc("MakeAbsoluteSD") + procMakeSelfRelativeSD = modadvapi32.NewProc("MakeSelfRelativeSD") + procSetEntriesInAclW = modadvapi32.NewProc("SetEntriesInAclW") ) func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) { @@ -646,6 +688,31 @@ func _GetProcAddress(module Handle, procname *byte) (proc uintptr, err error) { return } +func GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetModuleFileNameW.Addr(), 3, uintptr(module), uintptr(unsafe.Pointer(filename)), uintptr(size)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetModuleHandleEx(flags uint32, moduleName *uint16, module *Handle) (err error) { + r1, _, e1 := syscall.Syscall(procGetModuleHandleExW.Addr(), 3, uintptr(flags), uintptr(unsafe.Pointer(moduleName)), uintptr(unsafe.Pointer(module))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func GetVersion() (ver uint32, err error) { r0, _, e1 := syscall.Syscall(procGetVersion.Addr(), 0, 0, 0, 0) ver = uint32(r0) @@ -682,7 +749,14 @@ func ExitProcess(exitcode uint32) { } func IsWow64Process(handle Handle, isWow64 *bool) (err error) { - r1, _, e1 := syscall.Syscall(procIsWow64Process.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(isWow64)), 0) + var _p0 uint32 + if *isWow64 { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall(procIsWow64Process.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(&_p0)), 0) + *isWow64 = _p0 != 0 if r1 == 0 { if e1 != 0 { err = errnoErr(e1) @@ -952,6 +1026,30 @@ func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) { return } +func LockFileEx(file Handle, flags uint32, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall6(procLockFileEx.Addr(), 6, uintptr(file), uintptr(flags), uintptr(reserved), uintptr(bytesLow), uintptr(bytesHigh), uintptr(unsafe.Pointer(overlapped))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func UnlockFileEx(file Handle, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall6(procUnlockFileEx.Addr(), 5, uintptr(file), uintptr(reserved), uintptr(bytesLow), uintptr(bytesHigh), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func GetComputerName(buf *uint16, n *uint32) (err error) { r1, _, e1 := syscall.Syscall(procGetComputerNameW.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0) if r1 == 0 { @@ -1111,7 +1209,7 @@ func OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (ha func ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) { r1, _, e1 := syscall.Syscall6(procShellExecuteW.Addr(), 6, uintptr(hwnd), uintptr(unsafe.Pointer(verb)), uintptr(unsafe.Pointer(file)), uintptr(unsafe.Pointer(args)), uintptr(unsafe.Pointer(cwd)), uintptr(showCmd)) - if r1 == 0 { + if r1 <= 32 { if e1 != 0 { err = errnoErr(e1) } else { @@ -1165,32 +1263,6 @@ func GetStartupInfo(startupInfo *StartupInfo) (err error) { return } -func GetCurrentProcess() (pseudoHandle Handle, err error) { - r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0) - pseudoHandle = Handle(r0) - if pseudoHandle == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func GetCurrentThread() (pseudoHandle Handle, err error) { - r0, _, e1 := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0) - pseudoHandle = Handle(r0) - if pseudoHandle == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) { r1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0) if r1 == 0 { @@ -2105,6 +2177,69 @@ func PulseEvent(event Handle) (err error) { return } +func CreateMutex(mutexAttrs *SecurityAttributes, initialOwner bool, name *uint16) (handle Handle, err error) { + var _p0 uint32 + if initialOwner { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procCreateMutexW.Addr(), 3, uintptr(unsafe.Pointer(mutexAttrs)), uintptr(_p0), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateMutexEx(mutexAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateMutexExW.Addr(), 4, uintptr(unsafe.Pointer(mutexAttrs)), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(desiredAccess), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenMutex(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenMutexW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReleaseMutex(mutex Handle) (err error) { + r1, _, e1 := syscall.Syscall(procReleaseMutex.Addr(), 1, uintptr(mutex), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func SleepEx(milliseconds uint32, alertable bool) (ret uint32) { var _p0 uint32 if alertable { @@ -2255,6 +2390,24 @@ func OpenThread(desiredAccess uint32, inheritHandle bool, threadId uint32) (hand return } +func SetProcessPriorityBoost(process Handle, disable bool) (err error) { + var _p0 uint32 + if disable { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall(procSetProcessPriorityBoost.Addr(), 2, uintptr(process), uintptr(_p0), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) { r1, _, e1 := syscall.Syscall(procDefineDosDeviceW.Addr(), 3, uintptr(flags), uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath))) if r1 == 0 { @@ -2353,6 +2506,18 @@ func FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) { return } +func GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailableToCaller *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) { + r1, _, e1 := syscall.Syscall6(procGetDiskFreeSpaceExW.Addr(), 4, uintptr(unsafe.Pointer(directoryName)), uintptr(unsafe.Pointer(freeBytesAvailableToCaller)), uintptr(unsafe.Pointer(totalNumberOfBytes)), uintptr(unsafe.Pointer(totalNumberOfFreeBytes)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func GetDriveType(rootPathName *uint16) (driveType uint32) { r0, _, _ := syscall.Syscall(procGetDriveTypeW.Addr(), 1, uintptr(unsafe.Pointer(rootPathName)), 0, 0) driveType = uint32(r0) @@ -2495,6 +2660,66 @@ func MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret return } +func ExitWindowsEx(flags uint32, reason uint32) (err error) { + r1, _, e1 := syscall.Syscall(procExitWindowsEx.Addr(), 2, uintptr(flags), uintptr(reason), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func InitiateSystemShutdownEx(machineName *uint16, message *uint16, timeout uint32, forceAppsClosed bool, rebootAfterShutdown bool, reason uint32) (err error) { + var _p0 uint32 + if forceAppsClosed { + _p0 = 1 + } else { + _p0 = 0 + } + var _p1 uint32 + if rebootAfterShutdown { + _p1 = 1 + } else { + _p1 = 0 + } + r1, _, e1 := syscall.Syscall6(procInitiateSystemShutdownExW.Addr(), 6, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(message)), uintptr(timeout), uintptr(_p0), uintptr(_p1), uintptr(reason)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetProcessShutdownParameters(level uint32, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetProcessShutdownParameters.Addr(), 2, uintptr(level), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcessShutdownParameters(level *uint32, flags *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetProcessShutdownParameters.Addr(), 2, uintptr(unsafe.Pointer(level)), uintptr(unsafe.Pointer(flags)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) { r0, _, _ := syscall.Syscall(procCLSIDFromString.Addr(), 2, uintptr(unsafe.Pointer(lpsz)), uintptr(unsafe.Pointer(pclsid)), 0) if r0 != 0 { @@ -2530,6 +2755,27 @@ func rtlGetVersion(info *OsVersionInfoEx) (ret error) { return } +func rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32) { + syscall.Syscall(procRtlGetNtVersionNumbers.Addr(), 3, uintptr(unsafe.Pointer(majorVersion)), uintptr(unsafe.Pointer(minorVersion)), uintptr(unsafe.Pointer(buildNumber))) + return +} + +func EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) { + var _p0 *uint32 + if len(processIds) > 0 { + _p0 = &processIds[0] + } + r1, _, e1 := syscall.Syscall(procEnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(processIds)), uintptr(unsafe.Pointer(bytesReturned))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func WSAStartup(verreq uint32, data *WSAData) (sockerr error) { r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0) if r0 != 0 { @@ -3307,6 +3553,32 @@ func getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) { return } +func getWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetWindowsDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(dir)), uintptr(dirLen), 0) + len = uint32(r0) + if len == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getSystemWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetSystemWindowsDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(dir)), uintptr(dirLen), 0) + len = uint32(r0) + if len == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func WTSQueryUserToken(session uint32, token *Token) (err error) { r1, _, e1 := syscall.Syscall(procWTSQueryUserToken.Addr(), 2, uintptr(session), uintptr(unsafe.Pointer(token)), 0) if r1 == 0 { @@ -3335,3 +3607,358 @@ func WTSFreeMemory(ptr uintptr) { syscall.Syscall(procWTSFreeMemory.Addr(), 1, uintptr(ptr), 0, 0) return } + +func getSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) { + r0, _, _ := syscall.Syscall9(procGetSecurityInfo.Addr(), 8, uintptr(handle), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), uintptr(unsafe.Pointer(sd)), 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func SetSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) { + syscall.Syscall9(procSetSecurityInfo.Addr(), 7, uintptr(handle), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), 0, 0) + return +} + +func getNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) { + var _p0 *uint16 + _p0, ret = syscall.UTF16PtrFromString(objectName) + if ret != nil { + return + } + return _getNamedSecurityInfo(_p0, objectType, securityInformation, owner, group, dacl, sacl, sd) +} + +func _getNamedSecurityInfo(objectName *uint16, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) { + r0, _, _ := syscall.Syscall9(procGetNamedSecurityInfoW.Addr(), 8, uintptr(unsafe.Pointer(objectName)), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), uintptr(unsafe.Pointer(sd)), 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func SetNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) (ret error) { + var _p0 *uint16 + _p0, ret = syscall.UTF16PtrFromString(objectName) + if ret != nil { + return + } + return _SetNamedSecurityInfo(_p0, objectType, securityInformation, owner, group, dacl, sacl) +} + +func _SetNamedSecurityInfo(objectName *uint16, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) (ret error) { + r0, _, _ := syscall.Syscall9(procSetNamedSecurityInfoW.Addr(), 7, uintptr(unsafe.Pointer(objectName)), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), 0, 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func buildSecurityDescriptor(owner *TRUSTEE, group *TRUSTEE, countAccessEntries uint32, accessEntries *EXPLICIT_ACCESS, countAuditEntries uint32, auditEntries *EXPLICIT_ACCESS, oldSecurityDescriptor *SECURITY_DESCRIPTOR, sizeNewSecurityDescriptor *uint32, newSecurityDescriptor **SECURITY_DESCRIPTOR) (ret error) { + r0, _, _ := syscall.Syscall9(procBuildSecurityDescriptorW.Addr(), 9, uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(group)), uintptr(countAccessEntries), uintptr(unsafe.Pointer(accessEntries)), uintptr(countAuditEntries), uintptr(unsafe.Pointer(auditEntries)), uintptr(unsafe.Pointer(oldSecurityDescriptor)), uintptr(unsafe.Pointer(sizeNewSecurityDescriptor)), uintptr(unsafe.Pointer(newSecurityDescriptor))) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func initializeSecurityDescriptor(absoluteSD *SECURITY_DESCRIPTOR, revision uint32) (err error) { + r1, _, e1 := syscall.Syscall(procInitializeSecurityDescriptor.Addr(), 2, uintptr(unsafe.Pointer(absoluteSD)), uintptr(revision), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, control *SECURITY_DESCRIPTOR_CONTROL, revision *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetSecurityDescriptorControl.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(control)), uintptr(unsafe.Pointer(revision))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent *bool, dacl **ACL, daclDefaulted *bool) (err error) { + var _p0 uint32 + if *daclPresent { + _p0 = 1 + } else { + _p0 = 0 + } + var _p1 uint32 + if *daclDefaulted { + _p1 = 1 + } else { + _p1 = 0 + } + r1, _, e1 := syscall.Syscall6(procGetSecurityDescriptorDacl.Addr(), 4, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(&_p0)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(&_p1)), 0, 0) + *daclPresent = _p0 != 0 + *daclDefaulted = _p1 != 0 + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent *bool, sacl **ACL, saclDefaulted *bool) (err error) { + var _p0 uint32 + if *saclPresent { + _p0 = 1 + } else { + _p0 = 0 + } + var _p1 uint32 + if *saclDefaulted { + _p1 = 1 + } else { + _p1 = 0 + } + r1, _, e1 := syscall.Syscall6(procGetSecurityDescriptorSacl.Addr(), 4, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(&_p0)), uintptr(unsafe.Pointer(sacl)), uintptr(unsafe.Pointer(&_p1)), 0, 0) + *saclPresent = _p0 != 0 + *saclDefaulted = _p1 != 0 + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner **SID, ownerDefaulted *bool) (err error) { + var _p0 uint32 + if *ownerDefaulted { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall(procGetSecurityDescriptorOwner.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(&_p0))) + *ownerDefaulted = _p0 != 0 + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group **SID, groupDefaulted *bool) (err error) { + var _p0 uint32 + if *groupDefaulted { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall(procGetSecurityDescriptorGroup.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(&_p0))) + *groupDefaulted = _p0 != 0 + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getSecurityDescriptorLength(sd *SECURITY_DESCRIPTOR) (len uint32) { + r0, _, _ := syscall.Syscall(procGetSecurityDescriptorLength.Addr(), 1, uintptr(unsafe.Pointer(sd)), 0, 0) + len = uint32(r0) + return +} + +func getSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) (ret error) { + r0, _, _ := syscall.Syscall(procGetSecurityDescriptorRMControl.Addr(), 2, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(rmControl)), 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func isValidSecurityDescriptor(sd *SECURITY_DESCRIPTOR) (isValid bool) { + r0, _, _ := syscall.Syscall(procIsValidSecurityDescriptor.Addr(), 1, uintptr(unsafe.Pointer(sd)), 0, 0) + isValid = r0 != 0 + return +} + +func setSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, controlBitsOfInterest SECURITY_DESCRIPTOR_CONTROL, controlBitsToSet SECURITY_DESCRIPTOR_CONTROL) (err error) { + r1, _, e1 := syscall.Syscall(procSetSecurityDescriptorControl.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(controlBitsOfInterest), uintptr(controlBitsToSet)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func setSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent bool, dacl *ACL, daclDefaulted bool) (err error) { + var _p0 uint32 + if daclPresent { + _p0 = 1 + } else { + _p0 = 0 + } + var _p1 uint32 + if daclDefaulted { + _p1 = 1 + } else { + _p1 = 0 + } + r1, _, e1 := syscall.Syscall6(procSetSecurityDescriptorDacl.Addr(), 4, uintptr(unsafe.Pointer(sd)), uintptr(_p0), uintptr(unsafe.Pointer(dacl)), uintptr(_p1), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func setSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent bool, sacl *ACL, saclDefaulted bool) (err error) { + var _p0 uint32 + if saclPresent { + _p0 = 1 + } else { + _p0 = 0 + } + var _p1 uint32 + if saclDefaulted { + _p1 = 1 + } else { + _p1 = 0 + } + r1, _, e1 := syscall.Syscall6(procSetSecurityDescriptorSacl.Addr(), 4, uintptr(unsafe.Pointer(sd)), uintptr(_p0), uintptr(unsafe.Pointer(sacl)), uintptr(_p1), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func setSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner *SID, ownerDefaulted bool) (err error) { + var _p0 uint32 + if ownerDefaulted { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall(procSetSecurityDescriptorOwner.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(owner)), uintptr(_p0)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func setSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group *SID, groupDefaulted bool) (err error) { + var _p0 uint32 + if groupDefaulted { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall(procSetSecurityDescriptorGroup.Addr(), 3, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(group)), uintptr(_p0)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func setSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) { + syscall.Syscall(procSetSecurityDescriptorRMControl.Addr(), 2, uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(rmControl)), 0) + return +} + +func convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd **SECURITY_DESCRIPTOR, size *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(str) + if err != nil { + return + } + return _convertStringSecurityDescriptorToSecurityDescriptor(_p0, revision, sd, size) +} + +func _convertStringSecurityDescriptorToSecurityDescriptor(str *uint16, revision uint32, sd **SECURITY_DESCRIPTOR, size *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procConvertStringSecurityDescriptorToSecurityDescriptorW.Addr(), 4, uintptr(unsafe.Pointer(str)), uintptr(revision), uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(size)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func convertSecurityDescriptorToStringSecurityDescriptor(sd *SECURITY_DESCRIPTOR, revision uint32, securityInformation SECURITY_INFORMATION, str **uint16, strLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procConvertSecurityDescriptorToStringSecurityDescriptorW.Addr(), 5, uintptr(unsafe.Pointer(sd)), uintptr(revision), uintptr(securityInformation), uintptr(unsafe.Pointer(str)), uintptr(unsafe.Pointer(strLen)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func makeAbsoluteSD(selfRelativeSD *SECURITY_DESCRIPTOR, absoluteSD *SECURITY_DESCRIPTOR, absoluteSDSize *uint32, dacl *ACL, daclSize *uint32, sacl *ACL, saclSize *uint32, owner *SID, ownerSize *uint32, group *SID, groupSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall12(procMakeAbsoluteSD.Addr(), 11, uintptr(unsafe.Pointer(selfRelativeSD)), uintptr(unsafe.Pointer(absoluteSD)), uintptr(unsafe.Pointer(absoluteSDSize)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(daclSize)), uintptr(unsafe.Pointer(sacl)), uintptr(unsafe.Pointer(saclSize)), uintptr(unsafe.Pointer(owner)), uintptr(unsafe.Pointer(ownerSize)), uintptr(unsafe.Pointer(group)), uintptr(unsafe.Pointer(groupSize)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func makeSelfRelativeSD(absoluteSD *SECURITY_DESCRIPTOR, selfRelativeSD *SECURITY_DESCRIPTOR, selfRelativeSDSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procMakeSelfRelativeSD.Addr(), 3, uintptr(unsafe.Pointer(absoluteSD)), uintptr(unsafe.Pointer(selfRelativeSD)), uintptr(unsafe.Pointer(selfRelativeSDSize))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func setEntriesInAcl(countExplicitEntries uint32, explicitEntries *EXPLICIT_ACCESS, oldACL *ACL, newACL **ACL) (ret error) { + r0, _, _ := syscall.Syscall6(procSetEntriesInAclW.Addr(), 4, uintptr(countExplicitEntries), uintptr(unsafe.Pointer(explicitEntries)), uintptr(unsafe.Pointer(oldACL)), uintptr(unsafe.Pointer(newACL)), 0, 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} diff --git a/vendor/modules.txt b/vendor/modules.txt index dc1962d..7456a01 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -81,14 +81,29 @@ github.com/containerd/continuity/fs github.com/containerd/continuity/pathdriver github.com/containerd/continuity/syscallx github.com/containerd/continuity/sysx +# github.com/convox/changes v0.0.0-20191105034405-8c0df759a3b3 +github.com/convox/changes # github.com/convox/exec v0.0.0-20180905012044-cc13d277f897 github.com/convox/exec +# github.com/convox/hid v0.0.0-20180912192857-c67381b7ffff +github.com/convox/hid +# github.com/convox/inotify v0.0.0-20170313035821-b56f5149b5c6 +github.com/convox/inotify # github.com/convox/logger v0.0.0-20180522214415-e39179955b52 github.com/convox/logger # github.com/convox/stdapi v0.0.0-20190708203955-b81b71b6a680 github.com/convox/stdapi +# github.com/convox/stdcli v0.0.0-20190326115454-b78bee159e98 +github.com/convox/stdcli # github.com/convox/stdsdk v0.0.0-20190422120437-3e80a397e377 github.com/convox/stdsdk +# github.com/convox/u2f v0.0.0-20180912192910-a73404142726 +github.com/convox/u2f/u2fhid +github.com/convox/u2f/u2ftoken +# github.com/convox/version v0.0.0-20160822184233-ffefa0d565d2 +github.com/convox/version +# github.com/creack/pty v1.1.9 +github.com/creack/pty # github.com/davecgh/go-spew v1.1.1 github.com/davecgh/go-spew/spew # github.com/docker/distribution v2.7.1+incompatible @@ -116,6 +131,8 @@ github.com/docker/docker/pkg/mount github.com/docker/docker/pkg/pools github.com/docker/docker/pkg/stdcopy github.com/docker/docker/pkg/system +# github.com/docker/engine v1.4.2-0.20190717161051-705d9623b7c1 +github.com/docker/engine/pkg/fileutils # github.com/docker/go-connections v0.4.0 github.com/docker/go-connections/nat # github.com/docker/go-units v0.4.0 @@ -225,6 +242,10 @@ github.com/headzoo/surf/util github.com/ijc/Gotty # github.com/imdario/mergo v0.3.7 github.com/imdario/mergo +# github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf +github.com/inconshreveable/go-update +github.com/inconshreveable/go-update/internal/binarydist +github.com/inconshreveable/go-update/internal/osext # github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af github.com/jmespath/go-jmespath # github.com/joho/godotenv v1.3.0 @@ -241,6 +262,8 @@ github.com/mailru/easyjson/jlexer github.com/mailru/easyjson/jwriter # github.com/miekg/dns v1.1.15 github.com/miekg/dns +# github.com/mitchellh/go-homedir v1.1.0 +github.com/mitchellh/go-homedir # github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd github.com/modern-go/concurrent # github.com/modern-go/reflect2 v1.0.1 @@ -324,7 +347,7 @@ golang.org/x/oauth2/jwt # golang.org/x/sync v0.0.0-20190423024810-112230192c58 golang.org/x/sync/errgroup golang.org/x/sync/semaphore -# golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 +# golang.org/x/sys v0.0.0-20191104094858-e8c54fb511f6 golang.org/x/sys/unix golang.org/x/sys/windows # golang.org/x/text v0.3.2