mirror of https://github.com/docker/cli.git
Merge pull request #5266 from thaJeztah/27.1_backport_update_dependencies
[27.0 backport] update dependencies for v27.1
This commit is contained in:
commit
a0791d0e8a
|
@ -7,7 +7,7 @@ go 1.16
|
||||||
|
|
||||||
//require (
|
//require (
|
||||||
// github.com/docker/cli v0.0.0+incompatible
|
// github.com/docker/cli v0.0.0+incompatible
|
||||||
// github.com/docker/cli-docs-tool v0.5.0
|
// github.com/docker/cli-docs-tool v0.8.0
|
||||||
//)
|
//)
|
||||||
//
|
//
|
||||||
//replace github.com/docker/cli v0.0.0+incompatible => ../../
|
//replace github.com/docker/cli v0.0.0+incompatible => ../../
|
||||||
|
|
|
@ -20,7 +20,7 @@ trap clean EXIT
|
||||||
# init dummy go.mod
|
# init dummy go.mod
|
||||||
./scripts/vendor init
|
./scripts/vendor init
|
||||||
# install cli-docs-tool and copy docs/tools.go in root folder
|
# install cli-docs-tool and copy docs/tools.go in root folder
|
||||||
# to be able to fetch the required depedencies
|
# to be able to fetch the required dependencies
|
||||||
go mod edit -modfile=vendor.mod -require=github.com/docker/cli-docs-tool@${CLI_DOCS_TOOL_VERSION}
|
go mod edit -modfile=vendor.mod -require=github.com/docker/cli-docs-tool@${CLI_DOCS_TOOL_VERSION}
|
||||||
cp docs/generate/tools.go .
|
cp docs/generate/tools.go .
|
||||||
# update vendor
|
# update vendor
|
||||||
|
|
|
@ -20,7 +20,7 @@ trap clean EXIT
|
||||||
# init dummy go.mod
|
# init dummy go.mod
|
||||||
./scripts/vendor init
|
./scripts/vendor init
|
||||||
# install cli-docs-tool and copy docs/tools.go in root folder
|
# install cli-docs-tool and copy docs/tools.go in root folder
|
||||||
# to be able to fetch the required depedencies
|
# to be able to fetch the required dependencies
|
||||||
go mod edit -modfile=vendor.mod -require=github.com/docker/cli-docs-tool@${CLI_DOCS_TOOL_VERSION}
|
go mod edit -modfile=vendor.mod -require=github.com/docker/cli-docs-tool@${CLI_DOCS_TOOL_VERSION}
|
||||||
cp docs/generate/tools.go .
|
cp docs/generate/tools.go .
|
||||||
# update vendor
|
# update vendor
|
||||||
|
|
22
vendor.mod
22
vendor.mod
|
@ -11,7 +11,7 @@ require (
|
||||||
github.com/containerd/platforms v0.2.1
|
github.com/containerd/platforms v0.2.1
|
||||||
github.com/creack/pty v1.1.21
|
github.com/creack/pty v1.1.21
|
||||||
github.com/distribution/reference v0.6.0
|
github.com/distribution/reference v0.6.0
|
||||||
github.com/docker/cli-docs-tool v0.7.0
|
github.com/docker/cli-docs-tool v0.8.0
|
||||||
github.com/docker/distribution v2.8.3+incompatible
|
github.com/docker/distribution v2.8.3+incompatible
|
||||||
github.com/docker/docker v27.0.3+incompatible
|
github.com/docker/docker v27.0.3+incompatible
|
||||||
github.com/docker/docker-credential-helpers v0.8.2
|
github.com/docker/docker-credential-helpers v0.8.2
|
||||||
|
@ -45,10 +45,10 @@ require (
|
||||||
go.opentelemetry.io/otel/sdk v1.21.0
|
go.opentelemetry.io/otel/sdk v1.21.0
|
||||||
go.opentelemetry.io/otel/sdk/metric v1.21.0
|
go.opentelemetry.io/otel/sdk/metric v1.21.0
|
||||||
go.opentelemetry.io/otel/trace v1.21.0
|
go.opentelemetry.io/otel/trace v1.21.0
|
||||||
golang.org/x/sync v0.6.0
|
golang.org/x/sync v0.7.0
|
||||||
golang.org/x/sys v0.19.0
|
golang.org/x/sys v0.21.0
|
||||||
golang.org/x/term v0.19.0
|
golang.org/x/term v0.20.0
|
||||||
golang.org/x/text v0.14.0
|
golang.org/x/text v0.15.0
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
gotest.tools/v3 v3.5.1
|
gotest.tools/v3 v3.5.1
|
||||||
tags.cncf.io/container-device-interface v0.7.2
|
tags.cncf.io/container-device-interface v0.7.2
|
||||||
|
@ -60,7 +60,7 @@ require (
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
|
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||||
github.com/containerd/containerd v1.7.18 // indirect
|
github.com/containerd/containerd v1.7.19 // indirect
|
||||||
github.com/containerd/log v0.1.0 // indirect
|
github.com/containerd/log v0.1.0 // indirect
|
||||||
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect
|
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect
|
||||||
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
|
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
|
||||||
|
@ -72,7 +72,7 @@ require (
|
||||||
github.com/gorilla/mux v1.8.1 // indirect
|
github.com/gorilla/mux v1.8.1 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/klauspost/compress v1.17.4 // indirect
|
github.com/klauspost/compress v1.17.9 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||||
github.com/miekg/pkcs11 v1.1.1 // indirect
|
github.com/miekg/pkcs11 v1.1.1 // indirect
|
||||||
github.com/moby/docker-image-spec v1.3.1 // indirect
|
github.com/moby/docker-image-spec v1.3.1 // indirect
|
||||||
|
@ -81,7 +81,7 @@ require (
|
||||||
github.com/prometheus/client_golang v1.17.0 // indirect
|
github.com/prometheus/client_golang v1.17.0 // indirect
|
||||||
github.com/prometheus/client_model v0.5.0 // indirect
|
github.com/prometheus/client_model v0.5.0 // indirect
|
||||||
github.com/prometheus/common v0.44.0 // indirect
|
github.com/prometheus/common v0.44.0 // indirect
|
||||||
github.com/prometheus/procfs v0.12.0 // indirect
|
github.com/prometheus/procfs v0.15.1 // indirect
|
||||||
github.com/rivo/uniseg v0.2.0 // indirect
|
github.com/rivo/uniseg v0.2.0 // indirect
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
|
@ -89,10 +89,10 @@ require (
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
|
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
|
||||||
golang.org/x/crypto v0.22.0 // indirect
|
golang.org/x/crypto v0.23.0 // indirect
|
||||||
golang.org/x/net v0.24.0 // indirect
|
golang.org/x/net v0.25.0 // indirect
|
||||||
golang.org/x/time v0.3.0 // indirect
|
golang.org/x/time v0.3.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect
|
||||||
google.golang.org/grpc v1.60.1 // indirect
|
google.golang.org/grpc v1.60.1 // indirect
|
||||||
google.golang.org/protobuf v1.33.0 // indirect
|
google.golang.org/protobuf v1.33.0 // indirect
|
||||||
|
|
44
vendor.sum
44
vendor.sum
|
@ -37,8 +37,8 @@ github.com/cloudflare/cfssl v1.6.4/go.mod h1:8b3CQMxfWPAeom3zBnGJ6sd+G1NkL5TXqmD
|
||||||
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
|
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
|
||||||
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
|
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
|
||||||
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
|
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
|
||||||
github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao=
|
github.com/containerd/containerd v1.7.19 h1:/xQ4XRJ0tamDkdzrrBAUy/LE5nCcxFKdBm4EcPrSMEE=
|
||||||
github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4=
|
github.com/containerd/containerd v1.7.19/go.mod h1:h4FtNYUUMB4Phr6v+xG89RYKj9XccvbNSCKjdufCrkc=
|
||||||
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
|
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
|
||||||
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
|
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
|
||||||
github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
|
github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
|
||||||
|
@ -54,8 +54,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
||||||
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
|
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
|
||||||
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
||||||
github.com/docker/cli-docs-tool v0.7.0 h1:M2Da98Unz2kz3A5d4yeSGbhyOge2mfYSNjAFt01Rw0M=
|
github.com/docker/cli-docs-tool v0.8.0 h1:YcDWl7rQJC3lJ7WVZRwSs3bc9nka97QLWfyJQli8yJU=
|
||||||
github.com/docker/cli-docs-tool v0.7.0/go.mod h1:zMjqTFCU361PRh8apiXzeAZ1Q/xupbIwTusYpzCXS/o=
|
github.com/docker/cli-docs-tool v0.8.0/go.mod h1:8TQQ3E7mOXoYUs811LiPdUnAhXrcVsBIrW21a5pUbdk=
|
||||||
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
|
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
|
||||||
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
|
@ -150,8 +150,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
|
||||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
|
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||||
github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
|
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
@ -236,8 +236,8 @@ github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
||||||
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
|
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||||
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
|
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
||||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
|
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
|
||||||
|
@ -326,8 +326,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
|
||||||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
|
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
|
||||||
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
|
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
@ -337,16 +337,16 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
|
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
|
||||||
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
|
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
|
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
|
||||||
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
@ -360,15 +360,15 @@ golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
|
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
|
||||||
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
|
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
|
||||||
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
|
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||||
golang.org/x/text v0.3.0/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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
@ -382,8 +382,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8=
|
google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8=
|
||||||
google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE=
|
google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU=
|
google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0=
|
google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc=
|
||||||
google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
before:
|
before:
|
||||||
hooks:
|
hooks:
|
||||||
- ./gen.sh
|
- ./gen.sh
|
||||||
- go install mvdan.cc/garble@v0.10.1
|
|
||||||
|
|
||||||
builds:
|
builds:
|
||||||
-
|
-
|
||||||
|
@ -32,7 +31,6 @@ builds:
|
||||||
- mips64le
|
- mips64le
|
||||||
goarm:
|
goarm:
|
||||||
- 7
|
- 7
|
||||||
gobinary: garble
|
|
||||||
-
|
-
|
||||||
id: "s2d"
|
id: "s2d"
|
||||||
binary: s2d
|
binary: s2d
|
||||||
|
@ -59,7 +57,6 @@ builds:
|
||||||
- mips64le
|
- mips64le
|
||||||
goarm:
|
goarm:
|
||||||
- 7
|
- 7
|
||||||
gobinary: garble
|
|
||||||
-
|
-
|
||||||
id: "s2sx"
|
id: "s2sx"
|
||||||
binary: s2sx
|
binary: s2sx
|
||||||
|
@ -87,7 +84,6 @@ builds:
|
||||||
- mips64le
|
- mips64le
|
||||||
goarm:
|
goarm:
|
||||||
- 7
|
- 7
|
||||||
gobinary: garble
|
|
||||||
|
|
||||||
archives:
|
archives:
|
||||||
-
|
-
|
||||||
|
|
|
@ -16,6 +16,30 @@ This package provides various compression algorithms.
|
||||||
|
|
||||||
# changelog
|
# changelog
|
||||||
|
|
||||||
|
* Feb 5th, 2024 - [1.17.6](https://github.com/klauspost/compress/releases/tag/v1.17.6)
|
||||||
|
* zstd: Fix incorrect repeat coding in best mode https://github.com/klauspost/compress/pull/923
|
||||||
|
* s2: Fix DecodeConcurrent deadlock on errors https://github.com/klauspost/compress/pull/925
|
||||||
|
|
||||||
|
* Jan 26th, 2024 - [v1.17.5](https://github.com/klauspost/compress/releases/tag/v1.17.5)
|
||||||
|
* flate: Fix reset with dictionary on custom window encodes https://github.com/klauspost/compress/pull/912
|
||||||
|
* zstd: Add Frame header encoding and stripping https://github.com/klauspost/compress/pull/908
|
||||||
|
* zstd: Limit better/best default window to 8MB https://github.com/klauspost/compress/pull/913
|
||||||
|
* zstd: Speed improvements by @greatroar in https://github.com/klauspost/compress/pull/896 https://github.com/klauspost/compress/pull/910
|
||||||
|
* s2: Fix callbacks for skippable blocks and disallow 0xfe (Padding) by @Jille in https://github.com/klauspost/compress/pull/916 https://github.com/klauspost/compress/pull/917
|
||||||
|
https://github.com/klauspost/compress/pull/919 https://github.com/klauspost/compress/pull/918
|
||||||
|
|
||||||
|
* Dec 1st, 2023 - [v1.17.4](https://github.com/klauspost/compress/releases/tag/v1.17.4)
|
||||||
|
* huff0: Speed up symbol counting by @greatroar in https://github.com/klauspost/compress/pull/887
|
||||||
|
* huff0: Remove byteReader by @greatroar in https://github.com/klauspost/compress/pull/886
|
||||||
|
* gzhttp: Allow overriding decompression on transport https://github.com/klauspost/compress/pull/892
|
||||||
|
* gzhttp: Clamp compression level https://github.com/klauspost/compress/pull/890
|
||||||
|
* gzip: Error out if reserved bits are set https://github.com/klauspost/compress/pull/891
|
||||||
|
|
||||||
|
* Nov 15th, 2023 - [v1.17.3](https://github.com/klauspost/compress/releases/tag/v1.17.3)
|
||||||
|
* fse: Fix max header size https://github.com/klauspost/compress/pull/881
|
||||||
|
* zstd: Improve better/best compression https://github.com/klauspost/compress/pull/877
|
||||||
|
* gzhttp: Fix missing content type on Close https://github.com/klauspost/compress/pull/883
|
||||||
|
|
||||||
* Oct 22nd, 2023 - [v1.17.2](https://github.com/klauspost/compress/releases/tag/v1.17.2)
|
* Oct 22nd, 2023 - [v1.17.2](https://github.com/klauspost/compress/releases/tag/v1.17.2)
|
||||||
* zstd: Fix rare *CORRUPTION* output in "best" mode. See https://github.com/klauspost/compress/pull/876
|
* zstd: Fix rare *CORRUPTION* output in "best" mode. See https://github.com/klauspost/compress/pull/876
|
||||||
|
|
||||||
|
@ -32,6 +56,10 @@ This package provides various compression algorithms.
|
||||||
* flate: Add amd64 assembly matchlen https://github.com/klauspost/compress/pull/837
|
* flate: Add amd64 assembly matchlen https://github.com/klauspost/compress/pull/837
|
||||||
* gzip: Copy bufio.Reader on Reset by @thatguystone in https://github.com/klauspost/compress/pull/860
|
* gzip: Copy bufio.Reader on Reset by @thatguystone in https://github.com/klauspost/compress/pull/860
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>See changes to v1.16.x</summary>
|
||||||
|
|
||||||
|
|
||||||
* July 1st, 2023 - [v1.16.7](https://github.com/klauspost/compress/releases/tag/v1.16.7)
|
* July 1st, 2023 - [v1.16.7](https://github.com/klauspost/compress/releases/tag/v1.16.7)
|
||||||
* zstd: Fix default level first dictionary encode https://github.com/klauspost/compress/pull/829
|
* zstd: Fix default level first dictionary encode https://github.com/klauspost/compress/pull/829
|
||||||
* s2: add GetBufferCapacity() method by @GiedriusS in https://github.com/klauspost/compress/pull/832
|
* s2: add GetBufferCapacity() method by @GiedriusS in https://github.com/klauspost/compress/pull/832
|
||||||
|
@ -69,6 +97,7 @@ This package provides various compression algorithms.
|
||||||
* s2: Add LZ4 block converter. https://github.com/klauspost/compress/pull/748
|
* s2: Add LZ4 block converter. https://github.com/klauspost/compress/pull/748
|
||||||
* s2: Support io.ReaderAt in ReadSeeker. https://github.com/klauspost/compress/pull/747
|
* s2: Support io.ReaderAt in ReadSeeker. https://github.com/klauspost/compress/pull/747
|
||||||
* s2c/s2sx: Use concurrent decoding. https://github.com/klauspost/compress/pull/746
|
* s2c/s2sx: Use concurrent decoding. https://github.com/klauspost/compress/pull/746
|
||||||
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>See changes to v1.15.x</summary>
|
<summary>See changes to v1.15.x</summary>
|
||||||
|
@ -536,6 +565,8 @@ the stateless compress described below.
|
||||||
|
|
||||||
For compression performance, see: [this spreadsheet](https://docs.google.com/spreadsheets/d/1nuNE2nPfuINCZJRMt6wFWhKpToF95I47XjSsc-1rbPQ/edit?usp=sharing).
|
For compression performance, see: [this spreadsheet](https://docs.google.com/spreadsheets/d/1nuNE2nPfuINCZJRMt6wFWhKpToF95I47XjSsc-1rbPQ/edit?usp=sharing).
|
||||||
|
|
||||||
|
To disable all assembly add `-tags=noasm`. This works across all packages.
|
||||||
|
|
||||||
# Stateless compression
|
# Stateless compression
|
||||||
|
|
||||||
This package offers stateless compression as a special option for gzip/deflate.
|
This package offers stateless compression as a special option for gzip/deflate.
|
||||||
|
@ -554,7 +585,7 @@ For direct deflate use, NewStatelessWriter and StatelessDeflate are available. S
|
||||||
|
|
||||||
A `bufio.Writer` can of course be used to control write sizes. For example, to use a 4KB buffer:
|
A `bufio.Writer` can of course be used to control write sizes. For example, to use a 4KB buffer:
|
||||||
|
|
||||||
```
|
```go
|
||||||
// replace 'ioutil.Discard' with your output.
|
// replace 'ioutil.Discard' with your output.
|
||||||
gzw, err := gzip.NewWriterLevel(ioutil.Discard, gzip.StatelessCompression)
|
gzw, err := gzip.NewWriterLevel(ioutil.Discard, gzip.StatelessCompression)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -51,7 +51,7 @@ func emitCopy(dst []byte, offset, length int) int {
|
||||||
i := 0
|
i := 0
|
||||||
// The maximum length for a single tagCopy1 or tagCopy2 op is 64 bytes. The
|
// The maximum length for a single tagCopy1 or tagCopy2 op is 64 bytes. The
|
||||||
// threshold for this loop is a little higher (at 68 = 64 + 4), and the
|
// threshold for this loop is a little higher (at 68 = 64 + 4), and the
|
||||||
// length emitted down below is is a little lower (at 60 = 64 - 4), because
|
// length emitted down below is a little lower (at 60 = 64 - 4), because
|
||||||
// it's shorter to encode a length 67 copy as a length 60 tagCopy2 followed
|
// it's shorter to encode a length 67 copy as a length 60 tagCopy2 followed
|
||||||
// by a length 7 tagCopy1 (which encodes as 3+2 bytes) than to encode it as
|
// by a length 7 tagCopy1 (which encodes as 3+2 bytes) than to encode it as
|
||||||
// a length 64 tagCopy2 followed by a length 3 tagCopy2 (which encodes as
|
// a length 64 tagCopy2 followed by a length 3 tagCopy2 (which encodes as
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
module github.com/klauspost/compress
|
module github.com/klauspost/compress
|
||||||
|
|
||||||
go 1.16
|
go 1.19
|
||||||
|
|
||||||
|
|
|
@ -554,6 +554,9 @@ func (b *blockDec) prepareSequences(in []byte, hist *history) (err error) {
|
||||||
if debugDecoder {
|
if debugDecoder {
|
||||||
printf("Compression modes: 0b%b", compMode)
|
printf("Compression modes: 0b%b", compMode)
|
||||||
}
|
}
|
||||||
|
if compMode&3 != 0 {
|
||||||
|
return errors.New("corrupt block: reserved bits not zero")
|
||||||
|
}
|
||||||
for i := uint(0); i < 3; i++ {
|
for i := uint(0); i < 3; i++ {
|
||||||
mode := seqCompMode((compMode >> (6 - i*2)) & 3)
|
mode := seqCompMode((compMode >> (6 - i*2)) & 3)
|
||||||
if debugDecoder {
|
if debugDecoder {
|
||||||
|
|
|
@ -427,6 +427,16 @@ func (b *blockEnc) encodeLits(lits []byte, raw bool) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// encodeRLE will encode an RLE block.
|
||||||
|
func (b *blockEnc) encodeRLE(val byte, length uint32) {
|
||||||
|
var bh blockHeader
|
||||||
|
bh.setLast(b.last)
|
||||||
|
bh.setSize(length)
|
||||||
|
bh.setType(blockTypeRLE)
|
||||||
|
b.output = bh.appendTo(b.output)
|
||||||
|
b.output = append(b.output, val)
|
||||||
|
}
|
||||||
|
|
||||||
// fuzzFseEncoder can be used to fuzz the FSE encoder.
|
// fuzzFseEncoder can be used to fuzz the FSE encoder.
|
||||||
func fuzzFseEncoder(data []byte) int {
|
func fuzzFseEncoder(data []byte) int {
|
||||||
if len(data) > maxSequences || len(data) < 2 {
|
if len(data) > maxSequences || len(data) < 2 {
|
||||||
|
@ -479,6 +489,16 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
|
||||||
if len(b.sequences) == 0 {
|
if len(b.sequences) == 0 {
|
||||||
return b.encodeLits(b.literals, rawAllLits)
|
return b.encodeLits(b.literals, rawAllLits)
|
||||||
}
|
}
|
||||||
|
if len(b.sequences) == 1 && len(org) > 0 && len(b.literals) <= 1 {
|
||||||
|
// Check common RLE cases.
|
||||||
|
seq := b.sequences[0]
|
||||||
|
if seq.litLen == uint32(len(b.literals)) && seq.offset-3 == 1 {
|
||||||
|
// Offset == 1 and 0 or 1 literals.
|
||||||
|
b.encodeRLE(org[0], b.sequences[0].matchLen+zstdMinMatch+seq.litLen)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// We want some difference to at least account for the headers.
|
// We want some difference to at least account for the headers.
|
||||||
saved := b.size - len(b.literals) - (b.size >> 6)
|
saved := b.size - len(b.literals) - (b.size >> 6)
|
||||||
if saved < 16 {
|
if saved < 16 {
|
||||||
|
|
|
@ -95,42 +95,54 @@ type Header struct {
|
||||||
// If there isn't enough input, io.ErrUnexpectedEOF is returned.
|
// If there isn't enough input, io.ErrUnexpectedEOF is returned.
|
||||||
// The FirstBlock.OK will indicate if enough information was available to decode the first block header.
|
// The FirstBlock.OK will indicate if enough information was available to decode the first block header.
|
||||||
func (h *Header) Decode(in []byte) error {
|
func (h *Header) Decode(in []byte) error {
|
||||||
|
_, err := h.DecodeAndStrip(in)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecodeAndStrip will decode the header from the beginning of the stream
|
||||||
|
// and on success return the remaining bytes.
|
||||||
|
// This will decode the frame header and the first block header if enough bytes are provided.
|
||||||
|
// It is recommended to provide at least HeaderMaxSize bytes.
|
||||||
|
// If the frame header cannot be read an error will be returned.
|
||||||
|
// If there isn't enough input, io.ErrUnexpectedEOF is returned.
|
||||||
|
// The FirstBlock.OK will indicate if enough information was available to decode the first block header.
|
||||||
|
func (h *Header) DecodeAndStrip(in []byte) (remain []byte, err error) {
|
||||||
*h = Header{}
|
*h = Header{}
|
||||||
if len(in) < 4 {
|
if len(in) < 4 {
|
||||||
return io.ErrUnexpectedEOF
|
return nil, io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
h.HeaderSize += 4
|
h.HeaderSize += 4
|
||||||
b, in := in[:4], in[4:]
|
b, in := in[:4], in[4:]
|
||||||
if string(b) != frameMagic {
|
if string(b) != frameMagic {
|
||||||
if string(b[1:4]) != skippableFrameMagic || b[0]&0xf0 != 0x50 {
|
if string(b[1:4]) != skippableFrameMagic || b[0]&0xf0 != 0x50 {
|
||||||
return ErrMagicMismatch
|
return nil, ErrMagicMismatch
|
||||||
}
|
}
|
||||||
if len(in) < 4 {
|
if len(in) < 4 {
|
||||||
return io.ErrUnexpectedEOF
|
return nil, io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
h.HeaderSize += 4
|
h.HeaderSize += 4
|
||||||
h.Skippable = true
|
h.Skippable = true
|
||||||
h.SkippableID = int(b[0] & 0xf)
|
h.SkippableID = int(b[0] & 0xf)
|
||||||
h.SkippableSize = binary.LittleEndian.Uint32(in)
|
h.SkippableSize = binary.LittleEndian.Uint32(in)
|
||||||
return nil
|
return in[4:], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read Window_Descriptor
|
// Read Window_Descriptor
|
||||||
// https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#window_descriptor
|
// https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#window_descriptor
|
||||||
if len(in) < 1 {
|
if len(in) < 1 {
|
||||||
return io.ErrUnexpectedEOF
|
return nil, io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
fhd, in := in[0], in[1:]
|
fhd, in := in[0], in[1:]
|
||||||
h.HeaderSize++
|
h.HeaderSize++
|
||||||
h.SingleSegment = fhd&(1<<5) != 0
|
h.SingleSegment = fhd&(1<<5) != 0
|
||||||
h.HasCheckSum = fhd&(1<<2) != 0
|
h.HasCheckSum = fhd&(1<<2) != 0
|
||||||
if fhd&(1<<3) != 0 {
|
if fhd&(1<<3) != 0 {
|
||||||
return errors.New("reserved bit set on frame header")
|
return nil, errors.New("reserved bit set on frame header")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !h.SingleSegment {
|
if !h.SingleSegment {
|
||||||
if len(in) < 1 {
|
if len(in) < 1 {
|
||||||
return io.ErrUnexpectedEOF
|
return nil, io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
var wd byte
|
var wd byte
|
||||||
wd, in = in[0], in[1:]
|
wd, in = in[0], in[1:]
|
||||||
|
@ -148,7 +160,7 @@ func (h *Header) Decode(in []byte) error {
|
||||||
size = 4
|
size = 4
|
||||||
}
|
}
|
||||||
if len(in) < int(size) {
|
if len(in) < int(size) {
|
||||||
return io.ErrUnexpectedEOF
|
return nil, io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
b, in = in[:size], in[size:]
|
b, in = in[:size], in[size:]
|
||||||
h.HeaderSize += int(size)
|
h.HeaderSize += int(size)
|
||||||
|
@ -178,7 +190,7 @@ func (h *Header) Decode(in []byte) error {
|
||||||
if fcsSize > 0 {
|
if fcsSize > 0 {
|
||||||
h.HasFCS = true
|
h.HasFCS = true
|
||||||
if len(in) < fcsSize {
|
if len(in) < fcsSize {
|
||||||
return io.ErrUnexpectedEOF
|
return nil, io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
b, in = in[:fcsSize], in[fcsSize:]
|
b, in = in[:fcsSize], in[fcsSize:]
|
||||||
h.HeaderSize += int(fcsSize)
|
h.HeaderSize += int(fcsSize)
|
||||||
|
@ -199,7 +211,7 @@ func (h *Header) Decode(in []byte) error {
|
||||||
|
|
||||||
// Frame Header done, we will not fail from now on.
|
// Frame Header done, we will not fail from now on.
|
||||||
if len(in) < 3 {
|
if len(in) < 3 {
|
||||||
return nil
|
return in, nil
|
||||||
}
|
}
|
||||||
tmp := in[:3]
|
tmp := in[:3]
|
||||||
bh := uint32(tmp[0]) | (uint32(tmp[1]) << 8) | (uint32(tmp[2]) << 16)
|
bh := uint32(tmp[0]) | (uint32(tmp[1]) << 8) | (uint32(tmp[2]) << 16)
|
||||||
|
@ -209,7 +221,7 @@ func (h *Header) Decode(in []byte) error {
|
||||||
cSize := int(bh >> 3)
|
cSize := int(bh >> 3)
|
||||||
switch blockType {
|
switch blockType {
|
||||||
case blockTypeReserved:
|
case blockTypeReserved:
|
||||||
return nil
|
return in, nil
|
||||||
case blockTypeRLE:
|
case blockTypeRLE:
|
||||||
h.FirstBlock.Compressed = true
|
h.FirstBlock.Compressed = true
|
||||||
h.FirstBlock.DecompressedSize = cSize
|
h.FirstBlock.DecompressedSize = cSize
|
||||||
|
@ -225,5 +237,25 @@ func (h *Header) Decode(in []byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
h.FirstBlock.OK = true
|
h.FirstBlock.OK = true
|
||||||
return nil
|
return in, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendTo will append the encoded header to the dst slice.
|
||||||
|
// There is no error checking performed on the header values.
|
||||||
|
func (h *Header) AppendTo(dst []byte) ([]byte, error) {
|
||||||
|
if h.Skippable {
|
||||||
|
magic := [4]byte{0x50, 0x2a, 0x4d, 0x18}
|
||||||
|
magic[0] |= byte(h.SkippableID & 0xf)
|
||||||
|
dst = append(dst, magic[:]...)
|
||||||
|
f := h.SkippableSize
|
||||||
|
return append(dst, uint8(f), uint8(f>>8), uint8(f>>16), uint8(f>>24)), nil
|
||||||
|
}
|
||||||
|
f := frameHeader{
|
||||||
|
ContentSize: h.FrameContentSize,
|
||||||
|
WindowSize: uint32(h.WindowSize),
|
||||||
|
SingleSegment: h.SingleSegment,
|
||||||
|
Checksum: h.HasCheckSum,
|
||||||
|
DictID: h.DictionaryID,
|
||||||
|
}
|
||||||
|
return f.appendTo(dst), nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,7 +82,7 @@ var (
|
||||||
// can run multiple concurrent stateless decodes. It is even possible to
|
// can run multiple concurrent stateless decodes. It is even possible to
|
||||||
// use stateless decodes while a stream is being decoded.
|
// use stateless decodes while a stream is being decoded.
|
||||||
//
|
//
|
||||||
// The Reset function can be used to initiate a new stream, which is will considerably
|
// The Reset function can be used to initiate a new stream, which will considerably
|
||||||
// reduce the allocations normally caused by NewReader.
|
// reduce the allocations normally caused by NewReader.
|
||||||
func NewReader(r io.Reader, opts ...DOption) (*Decoder, error) {
|
func NewReader(r io.Reader, opts ...DOption) (*Decoder, error) {
|
||||||
initPredefined()
|
initPredefined()
|
||||||
|
|
|
@ -273,6 +273,9 @@ func BuildDict(o BuildDictOptions) ([]byte, error) {
|
||||||
enc.Encode(&block, b)
|
enc.Encode(&block, b)
|
||||||
addValues(&remain, block.literals)
|
addValues(&remain, block.literals)
|
||||||
litTotal += len(block.literals)
|
litTotal += len(block.literals)
|
||||||
|
if len(block.sequences) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
seqs += len(block.sequences)
|
seqs += len(block.sequences)
|
||||||
block.genCodes()
|
block.genCodes()
|
||||||
addHist(&ll, block.coders.llEnc.Histogram())
|
addHist(&ll, block.coders.llEnc.Histogram())
|
||||||
|
@ -286,6 +289,9 @@ func BuildDict(o BuildDictOptions) ([]byte, error) {
|
||||||
if offset == 0 {
|
if offset == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if int(offset) >= len(o.History) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if offset > 3 {
|
if offset > 3 {
|
||||||
newOffsets[offset-3]++
|
newOffsets[offset-3]++
|
||||||
} else {
|
} else {
|
||||||
|
@ -336,6 +342,9 @@ func BuildDict(o BuildDictOptions) ([]byte, error) {
|
||||||
if seqs/nUsed < 512 {
|
if seqs/nUsed < 512 {
|
||||||
// Use 512 as minimum.
|
// Use 512 as minimum.
|
||||||
nUsed = seqs / 512
|
nUsed = seqs / 512
|
||||||
|
if nUsed == 0 {
|
||||||
|
nUsed = 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
copyHist := func(dst *fseEncoder, src *[256]int) ([]byte, error) {
|
copyHist := func(dst *fseEncoder, src *[256]int) ([]byte, error) {
|
||||||
hist := dst.Histogram()
|
hist := dst.Histogram()
|
||||||
|
@ -358,6 +367,28 @@ func BuildDict(o BuildDictOptions) ([]byte, error) {
|
||||||
fakeLength += v
|
fakeLength += v
|
||||||
hist[i] = uint32(v)
|
hist[i] = uint32(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure we aren't trying to represent RLE.
|
||||||
|
if maxCount == fakeLength {
|
||||||
|
for i := range hist {
|
||||||
|
if uint8(i) == maxSym {
|
||||||
|
fakeLength++
|
||||||
|
maxSym++
|
||||||
|
hist[i+1] = 1
|
||||||
|
if maxSym > 1 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if hist[0] == 0 {
|
||||||
|
fakeLength++
|
||||||
|
hist[i] = 1
|
||||||
|
if maxSym > 1 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dst.HistogramFinished(maxSym, maxCount)
|
dst.HistogramFinished(maxSym, maxCount)
|
||||||
dst.reUsed = false
|
dst.reUsed = false
|
||||||
dst.useRLE = false
|
dst.useRLE = false
|
||||||
|
|
|
@ -135,8 +135,20 @@ func (e *bestFastEncoder) Encode(blk *blockEnc, src []byte) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add block to history
|
||||||
s := e.addBlock(src)
|
s := e.addBlock(src)
|
||||||
blk.size = len(src)
|
blk.size = len(src)
|
||||||
|
|
||||||
|
// Check RLE first
|
||||||
|
if len(src) > zstdMinMatch {
|
||||||
|
ml := matchLen(src[1:], src)
|
||||||
|
if ml == len(src)-1 {
|
||||||
|
blk.literals = append(blk.literals, src[0])
|
||||||
|
blk.sequences = append(blk.sequences, seq{litLen: 1, matchLen: uint32(len(src)-1) - zstdMinMatch, offset: 1 + 3})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if len(src) < minNonLiteralBlockSize {
|
if len(src) < minNonLiteralBlockSize {
|
||||||
blk.extraLits = len(src)
|
blk.extraLits = len(src)
|
||||||
blk.literals = blk.literals[:len(src)]
|
blk.literals = blk.literals[:len(src)]
|
||||||
|
@ -201,14 +213,6 @@ encodeLoop:
|
||||||
if delta >= e.maxMatchOff || delta <= 0 || load3232(src, offset) != first {
|
if delta >= e.maxMatchOff || delta <= 0 || load3232(src, offset) != first {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if debugAsserts {
|
|
||||||
if offset >= s {
|
|
||||||
panic(fmt.Sprintf("offset: %d - s:%d - rep: %d - cur :%d - max: %d", offset, s, rep, e.cur, e.maxMatchOff))
|
|
||||||
}
|
|
||||||
if !bytes.Equal(src[s:s+4], src[offset:offset+4]) {
|
|
||||||
panic(fmt.Sprintf("first match mismatch: %v != %v, first: %08x", src[s:s+4], src[offset:offset+4], first))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Try to quick reject if we already have a long match.
|
// Try to quick reject if we already have a long match.
|
||||||
if m.length > 16 {
|
if m.length > 16 {
|
||||||
left := len(src) - int(m.s+m.length)
|
left := len(src) - int(m.s+m.length)
|
||||||
|
@ -227,8 +231,10 @@ encodeLoop:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
l := 4 + e.matchlen(s+4, offset+4, src)
|
l := 4 + e.matchlen(s+4, offset+4, src)
|
||||||
if true {
|
if m.rep <= 0 {
|
||||||
// Extend candidate match backwards as far as possible.
|
// Extend candidate match backwards as far as possible.
|
||||||
|
// Do not extend repeats as we can assume they are optimal
|
||||||
|
// and offsets change if s == nextEmit.
|
||||||
tMin := s - e.maxMatchOff
|
tMin := s - e.maxMatchOff
|
||||||
if tMin < 0 {
|
if tMin < 0 {
|
||||||
tMin = 0
|
tMin = 0
|
||||||
|
@ -239,7 +245,14 @@ encodeLoop:
|
||||||
l++
|
l++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if debugAsserts {
|
||||||
|
if offset >= s {
|
||||||
|
panic(fmt.Sprintf("offset: %d - s:%d - rep: %d - cur :%d - max: %d", offset, s, rep, e.cur, e.maxMatchOff))
|
||||||
|
}
|
||||||
|
if !bytes.Equal(src[s:s+l], src[offset:offset+l]) {
|
||||||
|
panic(fmt.Sprintf("second match mismatch: %v != %v, first: %08x", src[s:s+4], src[offset:offset+4], first))
|
||||||
|
}
|
||||||
|
}
|
||||||
cand := match{offset: offset, s: s, length: l, rep: rep}
|
cand := match{offset: offset, s: s, length: l, rep: rep}
|
||||||
cand.estBits(bitsPerByte)
|
cand.estBits(bitsPerByte)
|
||||||
if m.est >= highScore || cand.est-m.est+(cand.s-m.s)*bitsPerByte>>10 < 0 {
|
if m.est >= highScore || cand.est-m.est+(cand.s-m.s)*bitsPerByte>>10 < 0 {
|
||||||
|
@ -336,24 +349,31 @@ encodeLoop:
|
||||||
}
|
}
|
||||||
|
|
||||||
if debugAsserts {
|
if debugAsserts {
|
||||||
|
if best.offset >= best.s {
|
||||||
|
panic(fmt.Sprintf("best.offset > s: %d >= %d", best.offset, best.s))
|
||||||
|
}
|
||||||
|
if best.s < nextEmit {
|
||||||
|
panic(fmt.Sprintf("s %d < nextEmit %d", best.s, nextEmit))
|
||||||
|
}
|
||||||
|
if best.offset < s-e.maxMatchOff {
|
||||||
|
panic(fmt.Sprintf("best.offset < s-e.maxMatchOff: %d < %d", best.offset, s-e.maxMatchOff))
|
||||||
|
}
|
||||||
if !bytes.Equal(src[best.s:best.s+best.length], src[best.offset:best.offset+best.length]) {
|
if !bytes.Equal(src[best.s:best.s+best.length], src[best.offset:best.offset+best.length]) {
|
||||||
panic(fmt.Sprintf("match mismatch: %v != %v", src[best.s:best.s+best.length], src[best.offset:best.offset+best.length]))
|
panic(fmt.Sprintf("match mismatch: %v != %v", src[best.s:best.s+best.length], src[best.offset:best.offset+best.length]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We have a match, we can store the forward value
|
// We have a match, we can store the forward value
|
||||||
|
s = best.s
|
||||||
if best.rep > 0 {
|
if best.rep > 0 {
|
||||||
var seq seq
|
var seq seq
|
||||||
seq.matchLen = uint32(best.length - zstdMinMatch)
|
seq.matchLen = uint32(best.length - zstdMinMatch)
|
||||||
if debugAsserts && s < nextEmit {
|
|
||||||
panic("s < nextEmit")
|
|
||||||
}
|
|
||||||
addLiterals(&seq, best.s)
|
addLiterals(&seq, best.s)
|
||||||
|
|
||||||
// Repeat. If bit 4 is set, this is a non-lit repeat.
|
// Repeat. If bit 4 is set, this is a non-lit repeat.
|
||||||
seq.offset = uint32(best.rep & 3)
|
seq.offset = uint32(best.rep & 3)
|
||||||
if debugSequences {
|
if debugSequences {
|
||||||
println("repeat sequence", seq, "next s:", s)
|
println("repeat sequence", seq, "next s:", best.s, "off:", best.s-best.offset)
|
||||||
}
|
}
|
||||||
blk.sequences = append(blk.sequences, seq)
|
blk.sequences = append(blk.sequences, seq)
|
||||||
|
|
||||||
|
@ -396,7 +416,6 @@ encodeLoop:
|
||||||
|
|
||||||
// A 4-byte match has been found. Update recent offsets.
|
// A 4-byte match has been found. Update recent offsets.
|
||||||
// We'll later see if more than 4 bytes.
|
// We'll later see if more than 4 bytes.
|
||||||
s = best.s
|
|
||||||
t := best.offset
|
t := best.offset
|
||||||
offset1, offset2, offset3 = s-t, offset1, offset2
|
offset1, offset2, offset3 = s-t, offset1, offset2
|
||||||
|
|
||||||
|
|
|
@ -102,9 +102,20 @@ func (e *betterFastEncoder) Encode(blk *blockEnc, src []byte) {
|
||||||
e.cur = e.maxMatchOff
|
e.cur = e.maxMatchOff
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
// Add block to history
|
||||||
s := e.addBlock(src)
|
s := e.addBlock(src)
|
||||||
blk.size = len(src)
|
blk.size = len(src)
|
||||||
|
|
||||||
|
// Check RLE first
|
||||||
|
if len(src) > zstdMinMatch {
|
||||||
|
ml := matchLen(src[1:], src)
|
||||||
|
if ml == len(src)-1 {
|
||||||
|
blk.literals = append(blk.literals, src[0])
|
||||||
|
blk.sequences = append(blk.sequences, seq{litLen: 1, matchLen: uint32(len(src)-1) - zstdMinMatch, offset: 1 + 3})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if len(src) < minNonLiteralBlockSize {
|
if len(src) < minNonLiteralBlockSize {
|
||||||
blk.extraLits = len(src)
|
blk.extraLits = len(src)
|
||||||
blk.literals = blk.literals[:len(src)]
|
blk.literals = blk.literals[:len(src)]
|
||||||
|
|
|
@ -94,7 +94,7 @@ func WithEncoderConcurrency(n int) EOption {
|
||||||
// The value must be a power of two between MinWindowSize and MaxWindowSize.
|
// The value must be a power of two between MinWindowSize and MaxWindowSize.
|
||||||
// A larger value will enable better compression but allocate more memory and,
|
// A larger value will enable better compression but allocate more memory and,
|
||||||
// for above-default values, take considerably longer.
|
// for above-default values, take considerably longer.
|
||||||
// The default value is determined by the compression level.
|
// The default value is determined by the compression level and max 8MB.
|
||||||
func WithWindowSize(n int) EOption {
|
func WithWindowSize(n int) EOption {
|
||||||
return func(o *encoderOptions) error {
|
return func(o *encoderOptions) error {
|
||||||
switch {
|
switch {
|
||||||
|
@ -232,9 +232,9 @@ func WithEncoderLevel(l EncoderLevel) EOption {
|
||||||
case SpeedDefault:
|
case SpeedDefault:
|
||||||
o.windowSize = 8 << 20
|
o.windowSize = 8 << 20
|
||||||
case SpeedBetterCompression:
|
case SpeedBetterCompression:
|
||||||
o.windowSize = 16 << 20
|
o.windowSize = 8 << 20
|
||||||
case SpeedBestCompression:
|
case SpeedBestCompression:
|
||||||
o.windowSize = 32 << 20
|
o.windowSize = 8 << 20
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !o.customALEntropy {
|
if !o.customALEntropy {
|
||||||
|
|
|
@ -76,7 +76,7 @@ func (f frameHeader) appendTo(dst []byte) []byte {
|
||||||
if f.SingleSegment {
|
if f.SingleSegment {
|
||||||
dst = append(dst, uint8(f.ContentSize))
|
dst = append(dst, uint8(f.ContentSize))
|
||||||
}
|
}
|
||||||
// Unless SingleSegment is set, framessizes < 256 are nto stored.
|
// Unless SingleSegment is set, framessizes < 256 are not stored.
|
||||||
case 1:
|
case 1:
|
||||||
f.ContentSize -= 256
|
f.ContentSize -= 256
|
||||||
dst = append(dst, uint8(f.ContentSize), uint8(f.ContentSize>>8))
|
dst = append(dst, uint8(f.ContentSize), uint8(f.ContentSize>>8))
|
||||||
|
|
|
@ -20,10 +20,9 @@ func (s *fseDecoder) buildDtable() error {
|
||||||
if v == -1 {
|
if v == -1 {
|
||||||
s.dt[highThreshold].setAddBits(uint8(i))
|
s.dt[highThreshold].setAddBits(uint8(i))
|
||||||
highThreshold--
|
highThreshold--
|
||||||
symbolNext[i] = 1
|
v = 1
|
||||||
} else {
|
|
||||||
symbolNext[i] = uint16(v)
|
|
||||||
}
|
}
|
||||||
|
symbolNext[i] = uint16(v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,10 +34,12 @@ func (s *fseDecoder) buildDtable() error {
|
||||||
for ss, v := range s.norm[:s.symbolLen] {
|
for ss, v := range s.norm[:s.symbolLen] {
|
||||||
for i := 0; i < int(v); i++ {
|
for i := 0; i < int(v); i++ {
|
||||||
s.dt[position].setAddBits(uint8(ss))
|
s.dt[position].setAddBits(uint8(ss))
|
||||||
position = (position + step) & tableMask
|
for {
|
||||||
for position > highThreshold {
|
|
||||||
// lowprob area
|
// lowprob area
|
||||||
position = (position + step) & tableMask
|
position = (position + step) & tableMask
|
||||||
|
if position <= highThreshold {
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,12 +162,12 @@ finalize:
|
||||||
MOVD h, ret+24(FP)
|
MOVD h, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
// func writeBlocks(d *Digest, b []byte) int
|
// func writeBlocks(s *Digest, b []byte) int
|
||||||
TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40
|
TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40
|
||||||
LDP ·primes+0(SB), (prime1, prime2)
|
LDP ·primes+0(SB), (prime1, prime2)
|
||||||
|
|
||||||
// Load state. Assume v[1-4] are stored contiguously.
|
// Load state. Assume v[1-4] are stored contiguously.
|
||||||
MOVD d+0(FP), digest
|
MOVD s+0(FP), digest
|
||||||
LDP 0(digest), (v1, v2)
|
LDP 0(digest), (v1, v2)
|
||||||
LDP 16(digest), (v3, v4)
|
LDP 16(digest), (v3, v4)
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#include "textflag.h"
|
#include "textflag.h"
|
||||||
|
|
||||||
// func matchLen(a []byte, b []byte) int
|
// func matchLen(a []byte, b []byte) int
|
||||||
// Requires: BMI
|
|
||||||
TEXT ·matchLen(SB), NOSPLIT, $0-56
|
TEXT ·matchLen(SB), NOSPLIT, $0-56
|
||||||
MOVQ a_base+0(FP), AX
|
MOVQ a_base+0(FP), AX
|
||||||
MOVQ b_base+24(FP), CX
|
MOVQ b_base+24(FP), CX
|
||||||
|
@ -19,7 +18,6 @@ TEXT ·matchLen(SB), NOSPLIT, $0-56
|
||||||
matchlen_loopback_standalone:
|
matchlen_loopback_standalone:
|
||||||
MOVQ (AX)(SI*1), BX
|
MOVQ (AX)(SI*1), BX
|
||||||
XORQ (CX)(SI*1), BX
|
XORQ (CX)(SI*1), BX
|
||||||
TESTQ BX, BX
|
|
||||||
JZ matchlen_loop_standalone
|
JZ matchlen_loop_standalone
|
||||||
|
|
||||||
#ifdef GOAMD64_v3
|
#ifdef GOAMD64_v3
|
||||||
|
@ -27,7 +25,7 @@ matchlen_loopback_standalone:
|
||||||
#else
|
#else
|
||||||
BSFQ BX, BX
|
BSFQ BX, BX
|
||||||
#endif
|
#endif
|
||||||
SARQ $0x03, BX
|
SHRL $0x03, BX
|
||||||
LEAL (SI)(BX*1), SI
|
LEAL (SI)(BX*1), SI
|
||||||
JMP gen_match_len_end
|
JMP gen_match_len_end
|
||||||
|
|
||||||
|
|
|
@ -157,8 +157,7 @@ sequenceDecs_decode_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Literal Length State
|
// Update Literal Length State
|
||||||
MOVBQZX DI, R14
|
MOVBQZX DI, R14
|
||||||
SHRQ $0x10, DI
|
SHRL $0x10, DI
|
||||||
MOVWQZX DI, DI
|
|
||||||
LEAQ (BX)(R14*1), CX
|
LEAQ (BX)(R14*1), CX
|
||||||
MOVQ DX, R15
|
MOVQ DX, R15
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -177,8 +176,7 @@ sequenceDecs_decode_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Match Length State
|
// Update Match Length State
|
||||||
MOVBQZX R8, R14
|
MOVBQZX R8, R14
|
||||||
SHRQ $0x10, R8
|
SHRL $0x10, R8
|
||||||
MOVWQZX R8, R8
|
|
||||||
LEAQ (BX)(R14*1), CX
|
LEAQ (BX)(R14*1), CX
|
||||||
MOVQ DX, R15
|
MOVQ DX, R15
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -197,8 +195,7 @@ sequenceDecs_decode_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Offset State
|
// Update Offset State
|
||||||
MOVBQZX R9, R14
|
MOVBQZX R9, R14
|
||||||
SHRQ $0x10, R9
|
SHRL $0x10, R9
|
||||||
MOVWQZX R9, R9
|
|
||||||
LEAQ (BX)(R14*1), CX
|
LEAQ (BX)(R14*1), CX
|
||||||
MOVQ DX, R15
|
MOVQ DX, R15
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -459,8 +456,7 @@ sequenceDecs_decode_56_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Literal Length State
|
// Update Literal Length State
|
||||||
MOVBQZX DI, R14
|
MOVBQZX DI, R14
|
||||||
SHRQ $0x10, DI
|
SHRL $0x10, DI
|
||||||
MOVWQZX DI, DI
|
|
||||||
LEAQ (BX)(R14*1), CX
|
LEAQ (BX)(R14*1), CX
|
||||||
MOVQ DX, R15
|
MOVQ DX, R15
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -479,8 +475,7 @@ sequenceDecs_decode_56_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Match Length State
|
// Update Match Length State
|
||||||
MOVBQZX R8, R14
|
MOVBQZX R8, R14
|
||||||
SHRQ $0x10, R8
|
SHRL $0x10, R8
|
||||||
MOVWQZX R8, R8
|
|
||||||
LEAQ (BX)(R14*1), CX
|
LEAQ (BX)(R14*1), CX
|
||||||
MOVQ DX, R15
|
MOVQ DX, R15
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -499,8 +494,7 @@ sequenceDecs_decode_56_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Offset State
|
// Update Offset State
|
||||||
MOVBQZX R9, R14
|
MOVBQZX R9, R14
|
||||||
SHRQ $0x10, R9
|
SHRL $0x10, R9
|
||||||
MOVWQZX R9, R9
|
|
||||||
LEAQ (BX)(R14*1), CX
|
LEAQ (BX)(R14*1), CX
|
||||||
MOVQ DX, R15
|
MOVQ DX, R15
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -774,8 +768,7 @@ sequenceDecs_decode_bmi2_fill_2_end:
|
||||||
// Update Offset State
|
// Update Offset State
|
||||||
BZHIQ R8, R15, CX
|
BZHIQ R8, R15, CX
|
||||||
SHRXQ R8, R15, R15
|
SHRXQ R8, R15, R15
|
||||||
MOVQ $0x00001010, R14
|
SHRL $0x10, R8
|
||||||
BEXTRQ R14, R8, R8
|
|
||||||
ADDQ CX, R8
|
ADDQ CX, R8
|
||||||
|
|
||||||
// Load ctx.ofTable
|
// Load ctx.ofTable
|
||||||
|
@ -786,8 +779,7 @@ sequenceDecs_decode_bmi2_fill_2_end:
|
||||||
// Update Match Length State
|
// Update Match Length State
|
||||||
BZHIQ DI, R15, CX
|
BZHIQ DI, R15, CX
|
||||||
SHRXQ DI, R15, R15
|
SHRXQ DI, R15, R15
|
||||||
MOVQ $0x00001010, R14
|
SHRL $0x10, DI
|
||||||
BEXTRQ R14, DI, DI
|
|
||||||
ADDQ CX, DI
|
ADDQ CX, DI
|
||||||
|
|
||||||
// Load ctx.mlTable
|
// Load ctx.mlTable
|
||||||
|
@ -797,8 +789,7 @@ sequenceDecs_decode_bmi2_fill_2_end:
|
||||||
|
|
||||||
// Update Literal Length State
|
// Update Literal Length State
|
||||||
BZHIQ SI, R15, CX
|
BZHIQ SI, R15, CX
|
||||||
MOVQ $0x00001010, R14
|
SHRL $0x10, SI
|
||||||
BEXTRQ R14, SI, SI
|
|
||||||
ADDQ CX, SI
|
ADDQ CX, SI
|
||||||
|
|
||||||
// Load ctx.llTable
|
// Load ctx.llTable
|
||||||
|
@ -1034,8 +1025,7 @@ sequenceDecs_decode_56_bmi2_fill_end:
|
||||||
// Update Offset State
|
// Update Offset State
|
||||||
BZHIQ R8, R15, CX
|
BZHIQ R8, R15, CX
|
||||||
SHRXQ R8, R15, R15
|
SHRXQ R8, R15, R15
|
||||||
MOVQ $0x00001010, R14
|
SHRL $0x10, R8
|
||||||
BEXTRQ R14, R8, R8
|
|
||||||
ADDQ CX, R8
|
ADDQ CX, R8
|
||||||
|
|
||||||
// Load ctx.ofTable
|
// Load ctx.ofTable
|
||||||
|
@ -1046,8 +1036,7 @@ sequenceDecs_decode_56_bmi2_fill_end:
|
||||||
// Update Match Length State
|
// Update Match Length State
|
||||||
BZHIQ DI, R15, CX
|
BZHIQ DI, R15, CX
|
||||||
SHRXQ DI, R15, R15
|
SHRXQ DI, R15, R15
|
||||||
MOVQ $0x00001010, R14
|
SHRL $0x10, DI
|
||||||
BEXTRQ R14, DI, DI
|
|
||||||
ADDQ CX, DI
|
ADDQ CX, DI
|
||||||
|
|
||||||
// Load ctx.mlTable
|
// Load ctx.mlTable
|
||||||
|
@ -1057,8 +1046,7 @@ sequenceDecs_decode_56_bmi2_fill_end:
|
||||||
|
|
||||||
// Update Literal Length State
|
// Update Literal Length State
|
||||||
BZHIQ SI, R15, CX
|
BZHIQ SI, R15, CX
|
||||||
MOVQ $0x00001010, R14
|
SHRL $0x10, SI
|
||||||
BEXTRQ R14, SI, SI
|
|
||||||
ADDQ CX, SI
|
ADDQ CX, SI
|
||||||
|
|
||||||
// Load ctx.llTable
|
// Load ctx.llTable
|
||||||
|
@ -1967,8 +1955,7 @@ sequenceDecs_decodeSync_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Literal Length State
|
// Update Literal Length State
|
||||||
MOVBQZX DI, R13
|
MOVBQZX DI, R13
|
||||||
SHRQ $0x10, DI
|
SHRL $0x10, DI
|
||||||
MOVWQZX DI, DI
|
|
||||||
LEAQ (BX)(R13*1), CX
|
LEAQ (BX)(R13*1), CX
|
||||||
MOVQ DX, R14
|
MOVQ DX, R14
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -1987,8 +1974,7 @@ sequenceDecs_decodeSync_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Match Length State
|
// Update Match Length State
|
||||||
MOVBQZX R8, R13
|
MOVBQZX R8, R13
|
||||||
SHRQ $0x10, R8
|
SHRL $0x10, R8
|
||||||
MOVWQZX R8, R8
|
|
||||||
LEAQ (BX)(R13*1), CX
|
LEAQ (BX)(R13*1), CX
|
||||||
MOVQ DX, R14
|
MOVQ DX, R14
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -2007,8 +1993,7 @@ sequenceDecs_decodeSync_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Offset State
|
// Update Offset State
|
||||||
MOVBQZX R9, R13
|
MOVBQZX R9, R13
|
||||||
SHRQ $0x10, R9
|
SHRL $0x10, R9
|
||||||
MOVWQZX R9, R9
|
|
||||||
LEAQ (BX)(R13*1), CX
|
LEAQ (BX)(R13*1), CX
|
||||||
MOVQ DX, R14
|
MOVQ DX, R14
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -2516,8 +2501,7 @@ sequenceDecs_decodeSync_bmi2_fill_2_end:
|
||||||
// Update Offset State
|
// Update Offset State
|
||||||
BZHIQ R8, R14, CX
|
BZHIQ R8, R14, CX
|
||||||
SHRXQ R8, R14, R14
|
SHRXQ R8, R14, R14
|
||||||
MOVQ $0x00001010, R13
|
SHRL $0x10, R8
|
||||||
BEXTRQ R13, R8, R8
|
|
||||||
ADDQ CX, R8
|
ADDQ CX, R8
|
||||||
|
|
||||||
// Load ctx.ofTable
|
// Load ctx.ofTable
|
||||||
|
@ -2528,8 +2512,7 @@ sequenceDecs_decodeSync_bmi2_fill_2_end:
|
||||||
// Update Match Length State
|
// Update Match Length State
|
||||||
BZHIQ DI, R14, CX
|
BZHIQ DI, R14, CX
|
||||||
SHRXQ DI, R14, R14
|
SHRXQ DI, R14, R14
|
||||||
MOVQ $0x00001010, R13
|
SHRL $0x10, DI
|
||||||
BEXTRQ R13, DI, DI
|
|
||||||
ADDQ CX, DI
|
ADDQ CX, DI
|
||||||
|
|
||||||
// Load ctx.mlTable
|
// Load ctx.mlTable
|
||||||
|
@ -2539,8 +2522,7 @@ sequenceDecs_decodeSync_bmi2_fill_2_end:
|
||||||
|
|
||||||
// Update Literal Length State
|
// Update Literal Length State
|
||||||
BZHIQ SI, R14, CX
|
BZHIQ SI, R14, CX
|
||||||
MOVQ $0x00001010, R13
|
SHRL $0x10, SI
|
||||||
BEXTRQ R13, SI, SI
|
|
||||||
ADDQ CX, SI
|
ADDQ CX, SI
|
||||||
|
|
||||||
// Load ctx.llTable
|
// Load ctx.llTable
|
||||||
|
@ -3055,8 +3037,7 @@ sequenceDecs_decodeSync_safe_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Literal Length State
|
// Update Literal Length State
|
||||||
MOVBQZX DI, R13
|
MOVBQZX DI, R13
|
||||||
SHRQ $0x10, DI
|
SHRL $0x10, DI
|
||||||
MOVWQZX DI, DI
|
|
||||||
LEAQ (BX)(R13*1), CX
|
LEAQ (BX)(R13*1), CX
|
||||||
MOVQ DX, R14
|
MOVQ DX, R14
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -3075,8 +3056,7 @@ sequenceDecs_decodeSync_safe_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Match Length State
|
// Update Match Length State
|
||||||
MOVBQZX R8, R13
|
MOVBQZX R8, R13
|
||||||
SHRQ $0x10, R8
|
SHRL $0x10, R8
|
||||||
MOVWQZX R8, R8
|
|
||||||
LEAQ (BX)(R13*1), CX
|
LEAQ (BX)(R13*1), CX
|
||||||
MOVQ DX, R14
|
MOVQ DX, R14
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -3095,8 +3075,7 @@ sequenceDecs_decodeSync_safe_amd64_ll_update_zero:
|
||||||
|
|
||||||
// Update Offset State
|
// Update Offset State
|
||||||
MOVBQZX R9, R13
|
MOVBQZX R9, R13
|
||||||
SHRQ $0x10, R9
|
SHRL $0x10, R9
|
||||||
MOVWQZX R9, R9
|
|
||||||
LEAQ (BX)(R13*1), CX
|
LEAQ (BX)(R13*1), CX
|
||||||
MOVQ DX, R14
|
MOVQ DX, R14
|
||||||
MOVQ CX, BX
|
MOVQ CX, BX
|
||||||
|
@ -3706,8 +3685,7 @@ sequenceDecs_decodeSync_safe_bmi2_fill_2_end:
|
||||||
// Update Offset State
|
// Update Offset State
|
||||||
BZHIQ R8, R14, CX
|
BZHIQ R8, R14, CX
|
||||||
SHRXQ R8, R14, R14
|
SHRXQ R8, R14, R14
|
||||||
MOVQ $0x00001010, R13
|
SHRL $0x10, R8
|
||||||
BEXTRQ R13, R8, R8
|
|
||||||
ADDQ CX, R8
|
ADDQ CX, R8
|
||||||
|
|
||||||
// Load ctx.ofTable
|
// Load ctx.ofTable
|
||||||
|
@ -3718,8 +3696,7 @@ sequenceDecs_decodeSync_safe_bmi2_fill_2_end:
|
||||||
// Update Match Length State
|
// Update Match Length State
|
||||||
BZHIQ DI, R14, CX
|
BZHIQ DI, R14, CX
|
||||||
SHRXQ DI, R14, R14
|
SHRXQ DI, R14, R14
|
||||||
MOVQ $0x00001010, R13
|
SHRL $0x10, DI
|
||||||
BEXTRQ R13, DI, DI
|
|
||||||
ADDQ CX, DI
|
ADDQ CX, DI
|
||||||
|
|
||||||
// Load ctx.mlTable
|
// Load ctx.mlTable
|
||||||
|
@ -3729,8 +3706,7 @@ sequenceDecs_decodeSync_safe_bmi2_fill_2_end:
|
||||||
|
|
||||||
// Update Literal Length State
|
// Update Literal Length State
|
||||||
BZHIQ SI, R14, CX
|
BZHIQ SI, R14, CX
|
||||||
MOVQ $0x00001010, R13
|
SHRL $0x10, SI
|
||||||
BEXTRQ R13, SI, SI
|
|
||||||
ADDQ CX, SI
|
ADDQ CX, SI
|
||||||
|
|
||||||
// Load ctx.llTable
|
// Load ctx.llTable
|
||||||
|
|
|
@ -1,9 +1,16 @@
|
||||||
---
|
---
|
||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
|
- errcheck
|
||||||
- godot
|
- godot
|
||||||
|
- gosimple
|
||||||
|
- govet
|
||||||
|
- ineffassign
|
||||||
- misspell
|
- misspell
|
||||||
- revive
|
- revive
|
||||||
|
- staticcheck
|
||||||
|
- testifylint
|
||||||
|
- unused
|
||||||
|
|
||||||
linter-settings:
|
linter-settings:
|
||||||
godot:
|
godot:
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
* Johannes 'fish' Ziemke <github@freigeist.org> @discordianfish
|
* Johannes 'fish' Ziemke <github@freigeist.org> @discordianfish
|
||||||
* Paul Gier <pgier@redhat.com> @pgier
|
* Paul Gier <paulgier@gmail.com> @pgier
|
||||||
|
* Ben Kochie <superq@gmail.com> @SuperQ
|
||||||
|
|
|
@ -49,23 +49,23 @@ endif
|
||||||
GOTEST := $(GO) test
|
GOTEST := $(GO) test
|
||||||
GOTEST_DIR :=
|
GOTEST_DIR :=
|
||||||
ifneq ($(CIRCLE_JOB),)
|
ifneq ($(CIRCLE_JOB),)
|
||||||
ifneq ($(shell command -v gotestsum > /dev/null),)
|
ifneq ($(shell command -v gotestsum 2> /dev/null),)
|
||||||
GOTEST_DIR := test-results
|
GOTEST_DIR := test-results
|
||||||
GOTEST := gotestsum --junitfile $(GOTEST_DIR)/unit-tests.xml --
|
GOTEST := gotestsum --junitfile $(GOTEST_DIR)/unit-tests.xml --
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
PROMU_VERSION ?= 0.15.0
|
PROMU_VERSION ?= 0.17.0
|
||||||
PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz
|
PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz
|
||||||
|
|
||||||
SKIP_GOLANGCI_LINT :=
|
SKIP_GOLANGCI_LINT :=
|
||||||
GOLANGCI_LINT :=
|
GOLANGCI_LINT :=
|
||||||
GOLANGCI_LINT_OPTS ?=
|
GOLANGCI_LINT_OPTS ?=
|
||||||
GOLANGCI_LINT_VERSION ?= v1.54.2
|
GOLANGCI_LINT_VERSION ?= v1.59.0
|
||||||
# golangci-lint only supports linux, darwin and windows platforms on i386/amd64.
|
# golangci-lint only supports linux, darwin and windows platforms on i386/amd64/arm64.
|
||||||
# windows isn't included here because of the path separator being different.
|
# windows isn't included here because of the path separator being different.
|
||||||
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
|
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
|
||||||
ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386))
|
ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386 arm64))
|
||||||
# If we're in CI and there is an Actions file, that means the linter
|
# If we're in CI and there is an Actions file, that means the linter
|
||||||
# is being run in Actions, so we don't need to run it here.
|
# is being run in Actions, so we don't need to run it here.
|
||||||
ifneq (,$(SKIP_GOLANGCI_LINT))
|
ifneq (,$(SKIP_GOLANGCI_LINT))
|
||||||
|
@ -169,16 +169,20 @@ common-vet:
|
||||||
common-lint: $(GOLANGCI_LINT)
|
common-lint: $(GOLANGCI_LINT)
|
||||||
ifdef GOLANGCI_LINT
|
ifdef GOLANGCI_LINT
|
||||||
@echo ">> running golangci-lint"
|
@echo ">> running golangci-lint"
|
||||||
# 'go list' needs to be executed before staticcheck to prepopulate the modules cache.
|
|
||||||
# Otherwise staticcheck might fail randomly for some reason not yet explained.
|
|
||||||
$(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null
|
|
||||||
$(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs)
|
$(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
.PHONY: common-lint-fix
|
||||||
|
common-lint-fix: $(GOLANGCI_LINT)
|
||||||
|
ifdef GOLANGCI_LINT
|
||||||
|
@echo ">> running golangci-lint fix"
|
||||||
|
$(GOLANGCI_LINT) run --fix $(GOLANGCI_LINT_OPTS) $(pkgs)
|
||||||
|
endif
|
||||||
|
|
||||||
.PHONY: common-yamllint
|
.PHONY: common-yamllint
|
||||||
common-yamllint:
|
common-yamllint:
|
||||||
@echo ">> running yamllint on all YAML files in the repository"
|
@echo ">> running yamllint on all YAML files in the repository"
|
||||||
ifeq (, $(shell command -v yamllint > /dev/null))
|
ifeq (, $(shell command -v yamllint 2> /dev/null))
|
||||||
@echo "yamllint not installed so skipping"
|
@echo "yamllint not installed so skipping"
|
||||||
else
|
else
|
||||||
yamllint .
|
yamllint .
|
||||||
|
@ -204,6 +208,10 @@ common-tarball: promu
|
||||||
@echo ">> building release tarball"
|
@echo ">> building release tarball"
|
||||||
$(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR)
|
$(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR)
|
||||||
|
|
||||||
|
.PHONY: common-docker-repo-name
|
||||||
|
common-docker-repo-name:
|
||||||
|
@echo "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)"
|
||||||
|
|
||||||
.PHONY: common-docker $(BUILD_DOCKER_ARCHS)
|
.PHONY: common-docker $(BUILD_DOCKER_ARCHS)
|
||||||
common-docker: $(BUILD_DOCKER_ARCHS)
|
common-docker: $(BUILD_DOCKER_ARCHS)
|
||||||
$(BUILD_DOCKER_ARCHS): common-docker-%:
|
$(BUILD_DOCKER_ARCHS): common-docker-%:
|
||||||
|
|
|
@ -55,7 +55,7 @@ type ARPEntry struct {
|
||||||
func (fs FS) GatherARPEntries() ([]ARPEntry, error) {
|
func (fs FS) GatherARPEntries() ([]ARPEntry, error) {
|
||||||
data, err := os.ReadFile(fs.proc.Path("net/arp"))
|
data, err := os.ReadFile(fs.proc.Path("net/arp"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: error reading arp %s: %w", ErrFileRead, fs.proc.Path("net/arp"), err)
|
return nil, fmt.Errorf("%w: error reading arp %s: %w", ErrFileRead, fs.proc.Path("net/arp"), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return parseARPEntries(data)
|
return parseARPEntries(data)
|
||||||
|
@ -78,11 +78,11 @@ func parseARPEntries(data []byte) ([]ARPEntry, error) {
|
||||||
} else if width == expectedDataWidth {
|
} else if width == expectedDataWidth {
|
||||||
entry, err := parseARPEntry(columns)
|
entry, err := parseARPEntry(columns)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []ARPEntry{}, fmt.Errorf("%s: Failed to parse ARP entry: %v: %w", ErrFileParse, entry, err)
|
return []ARPEntry{}, fmt.Errorf("%w: Failed to parse ARP entry: %v: %w", ErrFileParse, entry, err)
|
||||||
}
|
}
|
||||||
entries = append(entries, entry)
|
entries = append(entries, entry)
|
||||||
} else {
|
} else {
|
||||||
return []ARPEntry{}, fmt.Errorf("%s: %d columns found, but expected %d: %w", ErrFileParse, width, expectedDataWidth, err)
|
return []ARPEntry{}, fmt.Errorf("%w: %d columns found, but expected %d: %w", ErrFileParse, width, expectedDataWidth, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,8 +58,8 @@ func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) {
|
||||||
return nil, fmt.Errorf("%w: Invalid number of fields, found: %v", ErrFileParse, parts)
|
return nil, fmt.Errorf("%w: Invalid number of fields, found: %v", ErrFileParse, parts)
|
||||||
}
|
}
|
||||||
|
|
||||||
node := strings.TrimRight(parts[1], ",")
|
node := strings.TrimSuffix(parts[1], ",")
|
||||||
zone := strings.TrimRight(parts[3], ",")
|
zone := strings.TrimSuffix(parts[3], ",")
|
||||||
arraySize := len(parts[4:])
|
arraySize := len(parts[4:])
|
||||||
|
|
||||||
if bucketCount == -1 {
|
if bucketCount == -1 {
|
||||||
|
@ -74,7 +74,7 @@ func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) {
|
||||||
for i := 0; i < arraySize; i++ {
|
for i := 0; i < arraySize; i++ {
|
||||||
sizes[i], err = strconv.ParseFloat(parts[i+4], 64)
|
sizes[i], err = strconv.ParseFloat(parts[i+4], 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Invalid valid in buddyinfo: %f: %w", ErrFileParse, sizes[i], err)
|
return nil, fmt.Errorf("%w: Invalid valid in buddyinfo: %f: %w", ErrFileParse, sizes[i], err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -194,7 +194,7 @@ func parseCPUInfoARM(info []byte) ([]CPUInfo, error) {
|
||||||
firstLine := firstNonEmptyLine(scanner)
|
firstLine := firstNonEmptyLine(scanner)
|
||||||
match, err := regexp.MatchString("^[Pp]rocessor", firstLine)
|
match, err := regexp.MatchString("^[Pp]rocessor", firstLine)
|
||||||
if !match || !strings.Contains(firstLine, ":") {
|
if !match || !strings.Contains(firstLine, ":") {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse line: %q: %w", ErrFileParse, firstLine, err)
|
return nil, fmt.Errorf("%w: Cannot parse line: %q: %w", ErrFileParse, firstLine, err)
|
||||||
|
|
||||||
}
|
}
|
||||||
field := strings.SplitN(firstLine, ": ", 2)
|
field := strings.SplitN(firstLine, ": ", 2)
|
||||||
|
@ -386,7 +386,7 @@ func parseCPUInfoLoong(info []byte) ([]CPUInfo, error) {
|
||||||
// find the first "processor" line
|
// find the first "processor" line
|
||||||
firstLine := firstNonEmptyLine(scanner)
|
firstLine := firstNonEmptyLine(scanner)
|
||||||
if !strings.HasPrefix(firstLine, "system type") || !strings.Contains(firstLine, ":") {
|
if !strings.HasPrefix(firstLine, "system type") || !strings.Contains(firstLine, ":") {
|
||||||
return nil, errors.New("invalid cpuinfo file: " + firstLine)
|
return nil, fmt.Errorf("%w: %q", ErrFileParse, firstLine)
|
||||||
}
|
}
|
||||||
field := strings.SplitN(firstLine, ": ", 2)
|
field := strings.SplitN(firstLine, ": ", 2)
|
||||||
cpuinfo := []CPUInfo{}
|
cpuinfo := []CPUInfo{}
|
||||||
|
|
|
@ -55,13 +55,13 @@ func (fs FS) Crypto() ([]Crypto, error) {
|
||||||
path := fs.proc.Path("crypto")
|
path := fs.proc.Path("crypto")
|
||||||
b, err := util.ReadFileNoStat(path)
|
b, err := util.ReadFileNoStat(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot read file %v: %w", ErrFileRead, b, err)
|
return nil, fmt.Errorf("%w: Cannot read file %v: %w", ErrFileRead, b, err)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
crypto, err := parseCrypto(bytes.NewReader(b))
|
crypto, err := parseCrypto(bytes.NewReader(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse %v: %w", ErrFileParse, crypto, err)
|
return nil, fmt.Errorf("%w: Cannot parse %v: %w", ErrFileParse, crypto, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return crypto, nil
|
return crypto, nil
|
||||||
|
@ -84,7 +84,7 @@ func parseCrypto(r io.Reader) ([]Crypto, error) {
|
||||||
|
|
||||||
kv := strings.Split(text, ":")
|
kv := strings.Split(text, ":")
|
||||||
if len(kv) != 2 {
|
if len(kv) != 2 {
|
||||||
return nil, fmt.Errorf("%w: Cannot parae line: %q", ErrFileParse, text)
|
return nil, fmt.Errorf("%w: Cannot parse line: %q", ErrFileParse, text)
|
||||||
}
|
}
|
||||||
|
|
||||||
k := strings.TrimSpace(kv[0])
|
k := strings.TrimSpace(kv[0])
|
||||||
|
|
|
@ -236,7 +236,7 @@ func (fs FS) Fscacheinfo() (Fscacheinfo, error) {
|
||||||
|
|
||||||
m, err := parseFscacheinfo(bytes.NewReader(b))
|
m, err := parseFscacheinfo(bytes.NewReader(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Fscacheinfo{}, fmt.Errorf("%s: Cannot parse %v: %w", ErrFileParse, m, err)
|
return Fscacheinfo{}, fmt.Errorf("%w: Cannot parse %v: %w", ErrFileParse, m, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return *m, nil
|
return *m, nil
|
||||||
|
@ -245,7 +245,7 @@ func (fs FS) Fscacheinfo() (Fscacheinfo, error) {
|
||||||
func setFSCacheFields(fields []string, setFields ...*uint64) error {
|
func setFSCacheFields(fields []string, setFields ...*uint64) error {
|
||||||
var err error
|
var err error
|
||||||
if len(fields) < len(setFields) {
|
if len(fields) < len(setFields) {
|
||||||
return fmt.Errorf("%s: Expected %d, but got %d: %w", ErrFileParse, len(setFields), len(fields), err)
|
return fmt.Errorf("%w: Expected %d, but got %d: %w", ErrFileParse, len(setFields), len(fields), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := range setFields {
|
for i := range setFields {
|
||||||
|
|
|
@ -221,16 +221,16 @@ func parseIPPort(s string) (net.IP, uint16, error) {
|
||||||
case 46:
|
case 46:
|
||||||
ip = net.ParseIP(s[1:40])
|
ip = net.ParseIP(s[1:40])
|
||||||
if ip == nil {
|
if ip == nil {
|
||||||
return nil, 0, fmt.Errorf("%s: Invalid IPv6 addr %s: %w", ErrFileParse, s[1:40], err)
|
return nil, 0, fmt.Errorf("%w: Invalid IPv6 addr %s: %w", ErrFileParse, s[1:40], err)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return nil, 0, fmt.Errorf("%s: Unexpected IP:Port %s: %w", ErrFileParse, s, err)
|
return nil, 0, fmt.Errorf("%w: Unexpected IP:Port %s: %w", ErrFileParse, s, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
portString := s[len(s)-4:]
|
portString := s[len(s)-4:]
|
||||||
if len(portString) != 4 {
|
if len(portString) != 4 {
|
||||||
return nil, 0,
|
return nil, 0,
|
||||||
fmt.Errorf("%s: Unexpected port string format %s: %w", ErrFileParse, portString, err)
|
fmt.Errorf("%w: Unexpected port string format %s: %w", ErrFileParse, portString, err)
|
||||||
}
|
}
|
||||||
port, err := strconv.ParseUint(portString, 16, 16)
|
port, err := strconv.ParseUint(portString, 16, 16)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -51,7 +51,7 @@ func parseLoad(loadavgBytes []byte) (*LoadAvg, error) {
|
||||||
for i, load := range parts[0:3] {
|
for i, load := range parts[0:3] {
|
||||||
loads[i], err = strconv.ParseFloat(load, 64)
|
loads[i], err = strconv.ParseFloat(load, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse load: %f: %w", ErrFileParse, loads[i], err)
|
return nil, fmt.Errorf("%w: Cannot parse load: %f: %w", ErrFileParse, loads[i], err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return &LoadAvg{
|
return &LoadAvg{
|
||||||
|
|
|
@ -23,7 +23,7 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
statusLineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[([U_]+)\]`)
|
statusLineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[([U_]+)\]`)
|
||||||
recoveryLineBlocksRE = regexp.MustCompile(`\((\d+)/\d+\)`)
|
recoveryLineBlocksRE = regexp.MustCompile(`\((\d+/\d+)\)`)
|
||||||
recoveryLinePctRE = regexp.MustCompile(`= (.+)%`)
|
recoveryLinePctRE = regexp.MustCompile(`= (.+)%`)
|
||||||
recoveryLineFinishRE = regexp.MustCompile(`finish=(.+)min`)
|
recoveryLineFinishRE = regexp.MustCompile(`finish=(.+)min`)
|
||||||
recoveryLineSpeedRE = regexp.MustCompile(`speed=(.+)[A-Z]`)
|
recoveryLineSpeedRE = regexp.MustCompile(`speed=(.+)[A-Z]`)
|
||||||
|
@ -50,6 +50,8 @@ type MDStat struct {
|
||||||
BlocksTotal int64
|
BlocksTotal int64
|
||||||
// Number of blocks on the device that are in sync.
|
// Number of blocks on the device that are in sync.
|
||||||
BlocksSynced int64
|
BlocksSynced int64
|
||||||
|
// Number of blocks on the device that need to be synced.
|
||||||
|
BlocksToBeSynced int64
|
||||||
// progress percentage of current sync
|
// progress percentage of current sync
|
||||||
BlocksSyncedPct float64
|
BlocksSyncedPct float64
|
||||||
// estimated finishing time for current sync (in minutes)
|
// estimated finishing time for current sync (in minutes)
|
||||||
|
@ -70,7 +72,7 @@ func (fs FS) MDStat() ([]MDStat, error) {
|
||||||
}
|
}
|
||||||
mdstat, err := parseMDStat(data)
|
mdstat, err := parseMDStat(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse %v: %w", ErrFileParse, fs.proc.Path("mdstat"), err)
|
return nil, fmt.Errorf("%w: Cannot parse %v: %w", ErrFileParse, fs.proc.Path("mdstat"), err)
|
||||||
}
|
}
|
||||||
return mdstat, nil
|
return mdstat, nil
|
||||||
}
|
}
|
||||||
|
@ -90,7 +92,7 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) {
|
||||||
|
|
||||||
deviceFields := strings.Fields(line)
|
deviceFields := strings.Fields(line)
|
||||||
if len(deviceFields) < 3 {
|
if len(deviceFields) < 3 {
|
||||||
return nil, fmt.Errorf("%s: Expected 3+ lines, got %q", ErrFileParse, line)
|
return nil, fmt.Errorf("%w: Expected 3+ lines, got %q", ErrFileParse, line)
|
||||||
}
|
}
|
||||||
mdName := deviceFields[0] // mdx
|
mdName := deviceFields[0] // mdx
|
||||||
state := deviceFields[2] // active or inactive
|
state := deviceFields[2] // active or inactive
|
||||||
|
@ -105,7 +107,7 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) {
|
||||||
active, total, down, size, err := evalStatusLine(lines[i], lines[i+1])
|
active, total, down, size, err := evalStatusLine(lines[i], lines[i+1])
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse md device lines: %v: %w", ErrFileParse, active, err)
|
return nil, fmt.Errorf("%w: Cannot parse md device lines: %v: %w", ErrFileParse, active, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
syncLineIdx := i + 2
|
syncLineIdx := i + 2
|
||||||
|
@ -115,7 +117,8 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) {
|
||||||
|
|
||||||
// If device is syncing at the moment, get the number of currently
|
// If device is syncing at the moment, get the number of currently
|
||||||
// synced bytes, otherwise that number equals the size of the device.
|
// synced bytes, otherwise that number equals the size of the device.
|
||||||
syncedBlocks := size
|
blocksSynced := size
|
||||||
|
blocksToBeSynced := size
|
||||||
speed := float64(0)
|
speed := float64(0)
|
||||||
finish := float64(0)
|
finish := float64(0)
|
||||||
pct := float64(0)
|
pct := float64(0)
|
||||||
|
@ -136,11 +139,11 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) {
|
||||||
// Handle case when resync=PENDING or resync=DELAYED.
|
// Handle case when resync=PENDING or resync=DELAYED.
|
||||||
if strings.Contains(lines[syncLineIdx], "PENDING") ||
|
if strings.Contains(lines[syncLineIdx], "PENDING") ||
|
||||||
strings.Contains(lines[syncLineIdx], "DELAYED") {
|
strings.Contains(lines[syncLineIdx], "DELAYED") {
|
||||||
syncedBlocks = 0
|
blocksSynced = 0
|
||||||
} else {
|
} else {
|
||||||
syncedBlocks, pct, finish, speed, err = evalRecoveryLine(lines[syncLineIdx])
|
blocksSynced, blocksToBeSynced, pct, finish, speed, err = evalRecoveryLine(lines[syncLineIdx])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse sync line in md device: %q: %w", ErrFileParse, mdName, err)
|
return nil, fmt.Errorf("%w: Cannot parse sync line in md device: %q: %w", ErrFileParse, mdName, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -154,7 +157,8 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) {
|
||||||
DisksSpare: spare,
|
DisksSpare: spare,
|
||||||
DisksTotal: total,
|
DisksTotal: total,
|
||||||
BlocksTotal: size,
|
BlocksTotal: size,
|
||||||
BlocksSynced: syncedBlocks,
|
BlocksSynced: blocksSynced,
|
||||||
|
BlocksToBeSynced: blocksToBeSynced,
|
||||||
BlocksSyncedPct: pct,
|
BlocksSyncedPct: pct,
|
||||||
BlocksSyncedFinishTime: finish,
|
BlocksSyncedFinishTime: finish,
|
||||||
BlocksSyncedSpeed: speed,
|
BlocksSyncedSpeed: speed,
|
||||||
|
@ -168,13 +172,13 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) {
|
||||||
func evalStatusLine(deviceLine, statusLine string) (active, total, down, size int64, err error) {
|
func evalStatusLine(deviceLine, statusLine string) (active, total, down, size int64, err error) {
|
||||||
statusFields := strings.Fields(statusLine)
|
statusFields := strings.Fields(statusLine)
|
||||||
if len(statusFields) < 1 {
|
if len(statusFields) < 1 {
|
||||||
return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected statusline %q: %w", ErrFileParse, statusLine, err)
|
return 0, 0, 0, 0, fmt.Errorf("%w: Unexpected statusline %q: %w", ErrFileParse, statusLine, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sizeStr := statusFields[0]
|
sizeStr := statusFields[0]
|
||||||
size, err = strconv.ParseInt(sizeStr, 10, 64)
|
size, err = strconv.ParseInt(sizeStr, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected statusline %q: %w", ErrFileParse, statusLine, err)
|
return 0, 0, 0, 0, fmt.Errorf("%w: Unexpected statusline %q: %w", ErrFileParse, statusLine, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.Contains(deviceLine, "raid0") || strings.Contains(deviceLine, "linear") {
|
if strings.Contains(deviceLine, "raid0") || strings.Contains(deviceLine, "linear") {
|
||||||
|
@ -189,65 +193,71 @@ func evalStatusLine(deviceLine, statusLine string) (active, total, down, size in
|
||||||
|
|
||||||
matches := statusLineRE.FindStringSubmatch(statusLine)
|
matches := statusLineRE.FindStringSubmatch(statusLine)
|
||||||
if len(matches) != 5 {
|
if len(matches) != 5 {
|
||||||
return 0, 0, 0, 0, fmt.Errorf("%s: Could not fild all substring matches %s: %w", ErrFileParse, statusLine, err)
|
return 0, 0, 0, 0, fmt.Errorf("%w: Could not fild all substring matches %s: %w", ErrFileParse, statusLine, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
total, err = strconv.ParseInt(matches[2], 10, 64)
|
total, err = strconv.ParseInt(matches[2], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected statusline %q: %w", ErrFileParse, statusLine, err)
|
return 0, 0, 0, 0, fmt.Errorf("%w: Unexpected statusline %q: %w", ErrFileParse, statusLine, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
active, err = strconv.ParseInt(matches[3], 10, 64)
|
active, err = strconv.ParseInt(matches[3], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected active %d: %w", ErrFileParse, active, err)
|
return 0, 0, 0, 0, fmt.Errorf("%w: Unexpected active %d: %w", ErrFileParse, active, err)
|
||||||
}
|
}
|
||||||
down = int64(strings.Count(matches[4], "_"))
|
down = int64(strings.Count(matches[4], "_"))
|
||||||
|
|
||||||
return active, total, down, size, nil
|
return active, total, down, size, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func evalRecoveryLine(recoveryLine string) (syncedBlocks int64, pct float64, finish float64, speed float64, err error) {
|
func evalRecoveryLine(recoveryLine string) (blocksSynced int64, blocksToBeSynced int64, pct float64, finish float64, speed float64, err error) {
|
||||||
matches := recoveryLineBlocksRE.FindStringSubmatch(recoveryLine)
|
matches := recoveryLineBlocksRE.FindStringSubmatch(recoveryLine)
|
||||||
if len(matches) != 2 {
|
if len(matches) != 2 {
|
||||||
return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected recoveryLine %s: %w", ErrFileParse, recoveryLine, err)
|
return 0, 0, 0, 0, 0, fmt.Errorf("%w: Unexpected recoveryLine blocks %s: %w", ErrFileParse, recoveryLine, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64)
|
blocks := strings.Split(matches[1], "/")
|
||||||
|
blocksSynced, err = strconv.ParseInt(blocks[0], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, 0, 0, fmt.Errorf("%s: Unexpected parsing of recoveryLine %q: %w", ErrFileParse, recoveryLine, err)
|
return 0, 0, 0, 0, 0, fmt.Errorf("%w: Unable to parse recovery blocks synced %q: %w", ErrFileParse, matches[1], err)
|
||||||
|
}
|
||||||
|
|
||||||
|
blocksToBeSynced, err = strconv.ParseInt(blocks[1], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return blocksSynced, 0, 0, 0, 0, fmt.Errorf("%w: Unable to parse recovery to be synced blocks %q: %w", ErrFileParse, matches[2], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get percentage complete
|
// Get percentage complete
|
||||||
matches = recoveryLinePctRE.FindStringSubmatch(recoveryLine)
|
matches = recoveryLinePctRE.FindStringSubmatch(recoveryLine)
|
||||||
if len(matches) != 2 {
|
if len(matches) != 2 {
|
||||||
return syncedBlocks, 0, 0, 0, fmt.Errorf("%w: Unexpected recoveryLine matching percentage %s", ErrFileParse, recoveryLine)
|
return blocksSynced, blocksToBeSynced, 0, 0, 0, fmt.Errorf("%w: Unexpected recoveryLine matching percentage %s", ErrFileParse, recoveryLine)
|
||||||
}
|
}
|
||||||
pct, err = strconv.ParseFloat(strings.TrimSpace(matches[1]), 64)
|
pct, err = strconv.ParseFloat(strings.TrimSpace(matches[1]), 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return syncedBlocks, 0, 0, 0, fmt.Errorf("%w: Error parsing float from recoveryLine %q", ErrFileParse, recoveryLine)
|
return blocksSynced, blocksToBeSynced, 0, 0, 0, fmt.Errorf("%w: Error parsing float from recoveryLine %q", ErrFileParse, recoveryLine)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get time expected left to complete
|
// Get time expected left to complete
|
||||||
matches = recoveryLineFinishRE.FindStringSubmatch(recoveryLine)
|
matches = recoveryLineFinishRE.FindStringSubmatch(recoveryLine)
|
||||||
if len(matches) != 2 {
|
if len(matches) != 2 {
|
||||||
return syncedBlocks, pct, 0, 0, fmt.Errorf("%w: Unexpected recoveryLine matching est. finish time: %s", ErrFileParse, recoveryLine)
|
return blocksSynced, blocksToBeSynced, pct, 0, 0, fmt.Errorf("%w: Unexpected recoveryLine matching est. finish time: %s", ErrFileParse, recoveryLine)
|
||||||
}
|
}
|
||||||
finish, err = strconv.ParseFloat(matches[1], 64)
|
finish, err = strconv.ParseFloat(matches[1], 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return syncedBlocks, pct, 0, 0, fmt.Errorf("%w: Unable to parse float from recoveryLine: %q", ErrFileParse, recoveryLine)
|
return blocksSynced, blocksToBeSynced, pct, 0, 0, fmt.Errorf("%w: Unable to parse float from recoveryLine: %q", ErrFileParse, recoveryLine)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get recovery speed
|
// Get recovery speed
|
||||||
matches = recoveryLineSpeedRE.FindStringSubmatch(recoveryLine)
|
matches = recoveryLineSpeedRE.FindStringSubmatch(recoveryLine)
|
||||||
if len(matches) != 2 {
|
if len(matches) != 2 {
|
||||||
return syncedBlocks, pct, finish, 0, fmt.Errorf("%w: Unexpected recoveryLine value: %s", ErrFileParse, recoveryLine)
|
return blocksSynced, blocksToBeSynced, pct, finish, 0, fmt.Errorf("%w: Unexpected recoveryLine value: %s", ErrFileParse, recoveryLine)
|
||||||
}
|
}
|
||||||
speed, err = strconv.ParseFloat(matches[1], 64)
|
speed, err = strconv.ParseFloat(matches[1], 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return syncedBlocks, pct, finish, 0, fmt.Errorf("%s: Error parsing float from recoveryLine: %q: %w", ErrFileParse, recoveryLine, err)
|
return blocksSynced, blocksToBeSynced, pct, finish, 0, fmt.Errorf("%w: Error parsing float from recoveryLine: %q: %w", ErrFileParse, recoveryLine, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return syncedBlocks, pct, finish, speed, nil
|
return blocksSynced, blocksToBeSynced, pct, finish, speed, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func evalComponentDevices(deviceFields []string) []string {
|
func evalComponentDevices(deviceFields []string) []string {
|
||||||
|
|
|
@ -126,6 +126,7 @@ type Meminfo struct {
|
||||||
VmallocUsed *uint64
|
VmallocUsed *uint64
|
||||||
// largest contiguous block of vmalloc area which is free
|
// largest contiguous block of vmalloc area which is free
|
||||||
VmallocChunk *uint64
|
VmallocChunk *uint64
|
||||||
|
Percpu *uint64
|
||||||
HardwareCorrupted *uint64
|
HardwareCorrupted *uint64
|
||||||
AnonHugePages *uint64
|
AnonHugePages *uint64
|
||||||
ShmemHugePages *uint64
|
ShmemHugePages *uint64
|
||||||
|
@ -140,6 +141,55 @@ type Meminfo struct {
|
||||||
DirectMap4k *uint64
|
DirectMap4k *uint64
|
||||||
DirectMap2M *uint64
|
DirectMap2M *uint64
|
||||||
DirectMap1G *uint64
|
DirectMap1G *uint64
|
||||||
|
|
||||||
|
// The struct fields below are the byte-normalized counterparts to the
|
||||||
|
// existing struct fields. Values are normalized using the optional
|
||||||
|
// unit field in the meminfo line.
|
||||||
|
MemTotalBytes *uint64
|
||||||
|
MemFreeBytes *uint64
|
||||||
|
MemAvailableBytes *uint64
|
||||||
|
BuffersBytes *uint64
|
||||||
|
CachedBytes *uint64
|
||||||
|
SwapCachedBytes *uint64
|
||||||
|
ActiveBytes *uint64
|
||||||
|
InactiveBytes *uint64
|
||||||
|
ActiveAnonBytes *uint64
|
||||||
|
InactiveAnonBytes *uint64
|
||||||
|
ActiveFileBytes *uint64
|
||||||
|
InactiveFileBytes *uint64
|
||||||
|
UnevictableBytes *uint64
|
||||||
|
MlockedBytes *uint64
|
||||||
|
SwapTotalBytes *uint64
|
||||||
|
SwapFreeBytes *uint64
|
||||||
|
DirtyBytes *uint64
|
||||||
|
WritebackBytes *uint64
|
||||||
|
AnonPagesBytes *uint64
|
||||||
|
MappedBytes *uint64
|
||||||
|
ShmemBytes *uint64
|
||||||
|
SlabBytes *uint64
|
||||||
|
SReclaimableBytes *uint64
|
||||||
|
SUnreclaimBytes *uint64
|
||||||
|
KernelStackBytes *uint64
|
||||||
|
PageTablesBytes *uint64
|
||||||
|
NFSUnstableBytes *uint64
|
||||||
|
BounceBytes *uint64
|
||||||
|
WritebackTmpBytes *uint64
|
||||||
|
CommitLimitBytes *uint64
|
||||||
|
CommittedASBytes *uint64
|
||||||
|
VmallocTotalBytes *uint64
|
||||||
|
VmallocUsedBytes *uint64
|
||||||
|
VmallocChunkBytes *uint64
|
||||||
|
PercpuBytes *uint64
|
||||||
|
HardwareCorruptedBytes *uint64
|
||||||
|
AnonHugePagesBytes *uint64
|
||||||
|
ShmemHugePagesBytes *uint64
|
||||||
|
ShmemPmdMappedBytes *uint64
|
||||||
|
CmaTotalBytes *uint64
|
||||||
|
CmaFreeBytes *uint64
|
||||||
|
HugepagesizeBytes *uint64
|
||||||
|
DirectMap4kBytes *uint64
|
||||||
|
DirectMap2MBytes *uint64
|
||||||
|
DirectMap1GBytes *uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// Meminfo returns an information about current kernel/system memory statistics.
|
// Meminfo returns an information about current kernel/system memory statistics.
|
||||||
|
@ -152,7 +202,7 @@ func (fs FS) Meminfo() (Meminfo, error) {
|
||||||
|
|
||||||
m, err := parseMemInfo(bytes.NewReader(b))
|
m, err := parseMemInfo(bytes.NewReader(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Meminfo{}, fmt.Errorf("%s: %w", ErrFileParse, err)
|
return Meminfo{}, fmt.Errorf("%w: %w", ErrFileParse, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return *m, nil
|
return *m, nil
|
||||||
|
@ -162,114 +212,176 @@ func parseMemInfo(r io.Reader) (*Meminfo, error) {
|
||||||
var m Meminfo
|
var m Meminfo
|
||||||
s := bufio.NewScanner(r)
|
s := bufio.NewScanner(r)
|
||||||
for s.Scan() {
|
for s.Scan() {
|
||||||
// Each line has at least a name and value; we ignore the unit.
|
|
||||||
fields := strings.Fields(s.Text())
|
fields := strings.Fields(s.Text())
|
||||||
if len(fields) < 2 {
|
var val, valBytes uint64
|
||||||
return nil, fmt.Errorf("%w: Malformed line %q", ErrFileParse, s.Text())
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err := strconv.ParseUint(fields[1], 0, 64)
|
val, err := strconv.ParseUint(fields[1], 0, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch len(fields) {
|
||||||
|
case 2:
|
||||||
|
// No unit present, use the parsed the value as bytes directly.
|
||||||
|
valBytes = val
|
||||||
|
case 3:
|
||||||
|
// Unit present in optional 3rd field, convert it to
|
||||||
|
// bytes. The only unit supported within the Linux
|
||||||
|
// kernel is `kB`.
|
||||||
|
if fields[2] != "kB" {
|
||||||
|
return nil, fmt.Errorf("%w: Unsupported unit in optional 3rd field %q", ErrFileParse, fields[2])
|
||||||
|
}
|
||||||
|
|
||||||
|
valBytes = 1024 * val
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("%w: Malformed line %q", ErrFileParse, s.Text())
|
||||||
|
}
|
||||||
|
|
||||||
switch fields[0] {
|
switch fields[0] {
|
||||||
case "MemTotal:":
|
case "MemTotal:":
|
||||||
m.MemTotal = &v
|
m.MemTotal = &val
|
||||||
|
m.MemTotalBytes = &valBytes
|
||||||
case "MemFree:":
|
case "MemFree:":
|
||||||
m.MemFree = &v
|
m.MemFree = &val
|
||||||
|
m.MemFreeBytes = &valBytes
|
||||||
case "MemAvailable:":
|
case "MemAvailable:":
|
||||||
m.MemAvailable = &v
|
m.MemAvailable = &val
|
||||||
|
m.MemAvailableBytes = &valBytes
|
||||||
case "Buffers:":
|
case "Buffers:":
|
||||||
m.Buffers = &v
|
m.Buffers = &val
|
||||||
|
m.BuffersBytes = &valBytes
|
||||||
case "Cached:":
|
case "Cached:":
|
||||||
m.Cached = &v
|
m.Cached = &val
|
||||||
|
m.CachedBytes = &valBytes
|
||||||
case "SwapCached:":
|
case "SwapCached:":
|
||||||
m.SwapCached = &v
|
m.SwapCached = &val
|
||||||
|
m.SwapCachedBytes = &valBytes
|
||||||
case "Active:":
|
case "Active:":
|
||||||
m.Active = &v
|
m.Active = &val
|
||||||
|
m.ActiveBytes = &valBytes
|
||||||
case "Inactive:":
|
case "Inactive:":
|
||||||
m.Inactive = &v
|
m.Inactive = &val
|
||||||
|
m.InactiveBytes = &valBytes
|
||||||
case "Active(anon):":
|
case "Active(anon):":
|
||||||
m.ActiveAnon = &v
|
m.ActiveAnon = &val
|
||||||
|
m.ActiveAnonBytes = &valBytes
|
||||||
case "Inactive(anon):":
|
case "Inactive(anon):":
|
||||||
m.InactiveAnon = &v
|
m.InactiveAnon = &val
|
||||||
|
m.InactiveAnonBytes = &valBytes
|
||||||
case "Active(file):":
|
case "Active(file):":
|
||||||
m.ActiveFile = &v
|
m.ActiveFile = &val
|
||||||
|
m.ActiveFileBytes = &valBytes
|
||||||
case "Inactive(file):":
|
case "Inactive(file):":
|
||||||
m.InactiveFile = &v
|
m.InactiveFile = &val
|
||||||
|
m.InactiveFileBytes = &valBytes
|
||||||
case "Unevictable:":
|
case "Unevictable:":
|
||||||
m.Unevictable = &v
|
m.Unevictable = &val
|
||||||
|
m.UnevictableBytes = &valBytes
|
||||||
case "Mlocked:":
|
case "Mlocked:":
|
||||||
m.Mlocked = &v
|
m.Mlocked = &val
|
||||||
|
m.MlockedBytes = &valBytes
|
||||||
case "SwapTotal:":
|
case "SwapTotal:":
|
||||||
m.SwapTotal = &v
|
m.SwapTotal = &val
|
||||||
|
m.SwapTotalBytes = &valBytes
|
||||||
case "SwapFree:":
|
case "SwapFree:":
|
||||||
m.SwapFree = &v
|
m.SwapFree = &val
|
||||||
|
m.SwapFreeBytes = &valBytes
|
||||||
case "Dirty:":
|
case "Dirty:":
|
||||||
m.Dirty = &v
|
m.Dirty = &val
|
||||||
|
m.DirtyBytes = &valBytes
|
||||||
case "Writeback:":
|
case "Writeback:":
|
||||||
m.Writeback = &v
|
m.Writeback = &val
|
||||||
|
m.WritebackBytes = &valBytes
|
||||||
case "AnonPages:":
|
case "AnonPages:":
|
||||||
m.AnonPages = &v
|
m.AnonPages = &val
|
||||||
|
m.AnonPagesBytes = &valBytes
|
||||||
case "Mapped:":
|
case "Mapped:":
|
||||||
m.Mapped = &v
|
m.Mapped = &val
|
||||||
|
m.MappedBytes = &valBytes
|
||||||
case "Shmem:":
|
case "Shmem:":
|
||||||
m.Shmem = &v
|
m.Shmem = &val
|
||||||
|
m.ShmemBytes = &valBytes
|
||||||
case "Slab:":
|
case "Slab:":
|
||||||
m.Slab = &v
|
m.Slab = &val
|
||||||
|
m.SlabBytes = &valBytes
|
||||||
case "SReclaimable:":
|
case "SReclaimable:":
|
||||||
m.SReclaimable = &v
|
m.SReclaimable = &val
|
||||||
|
m.SReclaimableBytes = &valBytes
|
||||||
case "SUnreclaim:":
|
case "SUnreclaim:":
|
||||||
m.SUnreclaim = &v
|
m.SUnreclaim = &val
|
||||||
|
m.SUnreclaimBytes = &valBytes
|
||||||
case "KernelStack:":
|
case "KernelStack:":
|
||||||
m.KernelStack = &v
|
m.KernelStack = &val
|
||||||
|
m.KernelStackBytes = &valBytes
|
||||||
case "PageTables:":
|
case "PageTables:":
|
||||||
m.PageTables = &v
|
m.PageTables = &val
|
||||||
|
m.PageTablesBytes = &valBytes
|
||||||
case "NFS_Unstable:":
|
case "NFS_Unstable:":
|
||||||
m.NFSUnstable = &v
|
m.NFSUnstable = &val
|
||||||
|
m.NFSUnstableBytes = &valBytes
|
||||||
case "Bounce:":
|
case "Bounce:":
|
||||||
m.Bounce = &v
|
m.Bounce = &val
|
||||||
|
m.BounceBytes = &valBytes
|
||||||
case "WritebackTmp:":
|
case "WritebackTmp:":
|
||||||
m.WritebackTmp = &v
|
m.WritebackTmp = &val
|
||||||
|
m.WritebackTmpBytes = &valBytes
|
||||||
case "CommitLimit:":
|
case "CommitLimit:":
|
||||||
m.CommitLimit = &v
|
m.CommitLimit = &val
|
||||||
|
m.CommitLimitBytes = &valBytes
|
||||||
case "Committed_AS:":
|
case "Committed_AS:":
|
||||||
m.CommittedAS = &v
|
m.CommittedAS = &val
|
||||||
|
m.CommittedASBytes = &valBytes
|
||||||
case "VmallocTotal:":
|
case "VmallocTotal:":
|
||||||
m.VmallocTotal = &v
|
m.VmallocTotal = &val
|
||||||
|
m.VmallocTotalBytes = &valBytes
|
||||||
case "VmallocUsed:":
|
case "VmallocUsed:":
|
||||||
m.VmallocUsed = &v
|
m.VmallocUsed = &val
|
||||||
|
m.VmallocUsedBytes = &valBytes
|
||||||
case "VmallocChunk:":
|
case "VmallocChunk:":
|
||||||
m.VmallocChunk = &v
|
m.VmallocChunk = &val
|
||||||
|
m.VmallocChunkBytes = &valBytes
|
||||||
|
case "Percpu:":
|
||||||
|
m.Percpu = &val
|
||||||
|
m.PercpuBytes = &valBytes
|
||||||
case "HardwareCorrupted:":
|
case "HardwareCorrupted:":
|
||||||
m.HardwareCorrupted = &v
|
m.HardwareCorrupted = &val
|
||||||
|
m.HardwareCorruptedBytes = &valBytes
|
||||||
case "AnonHugePages:":
|
case "AnonHugePages:":
|
||||||
m.AnonHugePages = &v
|
m.AnonHugePages = &val
|
||||||
|
m.AnonHugePagesBytes = &valBytes
|
||||||
case "ShmemHugePages:":
|
case "ShmemHugePages:":
|
||||||
m.ShmemHugePages = &v
|
m.ShmemHugePages = &val
|
||||||
|
m.ShmemHugePagesBytes = &valBytes
|
||||||
case "ShmemPmdMapped:":
|
case "ShmemPmdMapped:":
|
||||||
m.ShmemPmdMapped = &v
|
m.ShmemPmdMapped = &val
|
||||||
|
m.ShmemPmdMappedBytes = &valBytes
|
||||||
case "CmaTotal:":
|
case "CmaTotal:":
|
||||||
m.CmaTotal = &v
|
m.CmaTotal = &val
|
||||||
|
m.CmaTotalBytes = &valBytes
|
||||||
case "CmaFree:":
|
case "CmaFree:":
|
||||||
m.CmaFree = &v
|
m.CmaFree = &val
|
||||||
|
m.CmaFreeBytes = &valBytes
|
||||||
case "HugePages_Total:":
|
case "HugePages_Total:":
|
||||||
m.HugePagesTotal = &v
|
m.HugePagesTotal = &val
|
||||||
case "HugePages_Free:":
|
case "HugePages_Free:":
|
||||||
m.HugePagesFree = &v
|
m.HugePagesFree = &val
|
||||||
case "HugePages_Rsvd:":
|
case "HugePages_Rsvd:":
|
||||||
m.HugePagesRsvd = &v
|
m.HugePagesRsvd = &val
|
||||||
case "HugePages_Surp:":
|
case "HugePages_Surp:":
|
||||||
m.HugePagesSurp = &v
|
m.HugePagesSurp = &val
|
||||||
case "Hugepagesize:":
|
case "Hugepagesize:":
|
||||||
m.Hugepagesize = &v
|
m.Hugepagesize = &val
|
||||||
|
m.HugepagesizeBytes = &valBytes
|
||||||
case "DirectMap4k:":
|
case "DirectMap4k:":
|
||||||
m.DirectMap4k = &v
|
m.DirectMap4k = &val
|
||||||
|
m.DirectMap4kBytes = &valBytes
|
||||||
case "DirectMap2M:":
|
case "DirectMap2M:":
|
||||||
m.DirectMap2M = &v
|
m.DirectMap2M = &val
|
||||||
|
m.DirectMap2MBytes = &valBytes
|
||||||
case "DirectMap1G:":
|
case "DirectMap1G:":
|
||||||
m.DirectMap1G = &v
|
m.DirectMap1G = &val
|
||||||
|
m.DirectMap1GBytes = &valBytes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -109,7 +109,7 @@ func parseMountInfoString(mountString string) (*MountInfo, error) {
|
||||||
if mountInfo[6] != "" {
|
if mountInfo[6] != "" {
|
||||||
mount.OptionalFields, err = mountOptionsParseOptionalFields(mountInfo[6 : mountInfoLength-4])
|
mount.OptionalFields, err = mountOptionsParseOptionalFields(mountInfo[6 : mountInfoLength-4])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: %w", ErrFileParse, err)
|
return nil, fmt.Errorf("%w: %w", ErrFileParse, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return mount, nil
|
return mount, nil
|
||||||
|
|
|
@ -88,7 +88,7 @@ type MountStatsNFS struct {
|
||||||
// Statistics broken down by filesystem operation.
|
// Statistics broken down by filesystem operation.
|
||||||
Operations []NFSOperationStats
|
Operations []NFSOperationStats
|
||||||
// Statistics about the NFS RPC transport.
|
// Statistics about the NFS RPC transport.
|
||||||
Transport NFSTransportStats
|
Transport []NFSTransportStats
|
||||||
}
|
}
|
||||||
|
|
||||||
// mountStats implements MountStats.
|
// mountStats implements MountStats.
|
||||||
|
@ -194,8 +194,6 @@ type NFSOperationStats struct {
|
||||||
CumulativeTotalResponseMilliseconds uint64
|
CumulativeTotalResponseMilliseconds uint64
|
||||||
// Duration from when a request was enqueued to when it was completely handled.
|
// Duration from when a request was enqueued to when it was completely handled.
|
||||||
CumulativeTotalRequestMilliseconds uint64
|
CumulativeTotalRequestMilliseconds uint64
|
||||||
// The average time from the point the client sends RPC requests until it receives the response.
|
|
||||||
AverageRTTMilliseconds float64
|
|
||||||
// The count of operations that complete with tk_status < 0. These statuses usually indicate error conditions.
|
// The count of operations that complete with tk_status < 0. These statuses usually indicate error conditions.
|
||||||
Errors uint64
|
Errors uint64
|
||||||
}
|
}
|
||||||
|
@ -434,7 +432,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
stats.Transport = *tstats
|
stats.Transport = append(stats.Transport, *tstats)
|
||||||
}
|
}
|
||||||
|
|
||||||
// When encountering "per-operation statistics", we must break this
|
// When encountering "per-operation statistics", we must break this
|
||||||
|
@ -582,9 +580,6 @@ func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) {
|
||||||
CumulativeTotalResponseMilliseconds: ns[6],
|
CumulativeTotalResponseMilliseconds: ns[6],
|
||||||
CumulativeTotalRequestMilliseconds: ns[7],
|
CumulativeTotalRequestMilliseconds: ns[7],
|
||||||
}
|
}
|
||||||
if ns[0] != 0 {
|
|
||||||
opStats.AverageRTTMilliseconds = float64(ns[6]) / float64(ns[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(ns) > 8 {
|
if len(ns) > 8 {
|
||||||
opStats.Errors = ns[8]
|
opStats.Errors = ns[8]
|
||||||
|
@ -632,7 +627,7 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats
|
||||||
return nil, fmt.Errorf("%w: invalid NFS transport stats 1.1 statement: %v, protocol: %v", ErrFileParse, ss, protocol)
|
return nil, fmt.Errorf("%w: invalid NFS transport stats 1.1 statement: %v, protocol: %v", ErrFileParse, ss, protocol)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("%s: Unrecognized NFS transport stats version: %q, protocol: %v", ErrFileParse, statVersion, protocol)
|
return nil, fmt.Errorf("%w: Unrecognized NFS transport stats version: %q, protocol: %v", ErrFileParse, statVersion, protocol)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay
|
// Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay
|
||||||
|
|
|
@ -58,7 +58,7 @@ func readConntrackStat(path string) ([]ConntrackStatEntry, error) {
|
||||||
|
|
||||||
stat, err := parseConntrackStat(bytes.NewReader(b))
|
stat, err := parseConntrackStat(bytes.NewReader(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot read file: %v: %w", ErrFileRead, path, err)
|
return nil, fmt.Errorf("%w: Cannot read file: %v: %w", ErrFileRead, path, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return stat, nil
|
return stat, nil
|
||||||
|
@ -86,7 +86,7 @@ func parseConntrackStat(r io.Reader) ([]ConntrackStatEntry, error) {
|
||||||
func parseConntrackStatEntry(fields []string) (*ConntrackStatEntry, error) {
|
func parseConntrackStatEntry(fields []string) (*ConntrackStatEntry, error) {
|
||||||
entries, err := util.ParseHexUint64s(fields)
|
entries, err := util.ParseHexUint64s(fields)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse entry: %d: %w", ErrFileParse, entries, err)
|
return nil, fmt.Errorf("%w: Cannot parse entry: %d: %w", ErrFileParse, entries, err)
|
||||||
}
|
}
|
||||||
numEntries := len(entries)
|
numEntries := len(entries)
|
||||||
if numEntries < 16 || numEntries > 17 {
|
if numEntries < 16 || numEntries > 17 {
|
||||||
|
|
|
@ -50,10 +50,13 @@ type (
|
||||||
// UsedSockets shows the total number of parsed lines representing the
|
// UsedSockets shows the total number of parsed lines representing the
|
||||||
// number of used sockets.
|
// number of used sockets.
|
||||||
UsedSockets uint64
|
UsedSockets uint64
|
||||||
|
// Drops shows the total number of dropped packets of all UPD sockets.
|
||||||
|
Drops *uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// netIPSocketLine represents the fields parsed from a single line
|
// netIPSocketLine represents the fields parsed from a single line
|
||||||
// in /proc/net/{t,u}dp{,6}. Fields which are not used by IPSocket are skipped.
|
// in /proc/net/{t,u}dp{,6}. Fields which are not used by IPSocket are skipped.
|
||||||
|
// Drops is non-nil for udp{,6}, but nil for tcp{,6}.
|
||||||
// For the proc file format details, see https://linux.die.net/man/5/proc.
|
// For the proc file format details, see https://linux.die.net/man/5/proc.
|
||||||
netIPSocketLine struct {
|
netIPSocketLine struct {
|
||||||
Sl uint64
|
Sl uint64
|
||||||
|
@ -66,6 +69,7 @@ type (
|
||||||
RxQueue uint64
|
RxQueue uint64
|
||||||
UID uint64
|
UID uint64
|
||||||
Inode uint64
|
Inode uint64
|
||||||
|
Drops *uint64
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -77,13 +81,14 @@ func newNetIPSocket(file string) (NetIPSocket, error) {
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
var netIPSocket NetIPSocket
|
var netIPSocket NetIPSocket
|
||||||
|
isUDP := strings.Contains(file, "udp")
|
||||||
|
|
||||||
lr := io.LimitReader(f, readLimit)
|
lr := io.LimitReader(f, readLimit)
|
||||||
s := bufio.NewScanner(lr)
|
s := bufio.NewScanner(lr)
|
||||||
s.Scan() // skip first line with headers
|
s.Scan() // skip first line with headers
|
||||||
for s.Scan() {
|
for s.Scan() {
|
||||||
fields := strings.Fields(s.Text())
|
fields := strings.Fields(s.Text())
|
||||||
line, err := parseNetIPSocketLine(fields)
|
line, err := parseNetIPSocketLine(fields, isUDP)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -104,19 +109,25 @@ func newNetIPSocketSummary(file string) (*NetIPSocketSummary, error) {
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
var netIPSocketSummary NetIPSocketSummary
|
var netIPSocketSummary NetIPSocketSummary
|
||||||
|
var udpPacketDrops uint64
|
||||||
|
isUDP := strings.Contains(file, "udp")
|
||||||
|
|
||||||
lr := io.LimitReader(f, readLimit)
|
lr := io.LimitReader(f, readLimit)
|
||||||
s := bufio.NewScanner(lr)
|
s := bufio.NewScanner(lr)
|
||||||
s.Scan() // skip first line with headers
|
s.Scan() // skip first line with headers
|
||||||
for s.Scan() {
|
for s.Scan() {
|
||||||
fields := strings.Fields(s.Text())
|
fields := strings.Fields(s.Text())
|
||||||
line, err := parseNetIPSocketLine(fields)
|
line, err := parseNetIPSocketLine(fields, isUDP)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
netIPSocketSummary.TxQueueLength += line.TxQueue
|
netIPSocketSummary.TxQueueLength += line.TxQueue
|
||||||
netIPSocketSummary.RxQueueLength += line.RxQueue
|
netIPSocketSummary.RxQueueLength += line.RxQueue
|
||||||
netIPSocketSummary.UsedSockets++
|
netIPSocketSummary.UsedSockets++
|
||||||
|
if isUDP {
|
||||||
|
udpPacketDrops += *line.Drops
|
||||||
|
netIPSocketSummary.Drops = &udpPacketDrops
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if err := s.Err(); err != nil {
|
if err := s.Err(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -130,7 +141,7 @@ func parseIP(hexIP string) (net.IP, error) {
|
||||||
var byteIP []byte
|
var byteIP []byte
|
||||||
byteIP, err := hex.DecodeString(hexIP)
|
byteIP, err := hex.DecodeString(hexIP)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse socket field in %q: %w", ErrFileParse, hexIP, err)
|
return nil, fmt.Errorf("%w: Cannot parse socket field in %q: %w", ErrFileParse, hexIP, err)
|
||||||
}
|
}
|
||||||
switch len(byteIP) {
|
switch len(byteIP) {
|
||||||
case 4:
|
case 4:
|
||||||
|
@ -144,12 +155,12 @@ func parseIP(hexIP string) (net.IP, error) {
|
||||||
}
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("%s: Unable to parse IP %s: %w", ErrFileParse, hexIP, nil)
|
return nil, fmt.Errorf("%w: Unable to parse IP %s: %v", ErrFileParse, hexIP, nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseNetIPSocketLine parses a single line, represented by a list of fields.
|
// parseNetIPSocketLine parses a single line, represented by a list of fields.
|
||||||
func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) {
|
func parseNetIPSocketLine(fields []string, isUDP bool) (*netIPSocketLine, error) {
|
||||||
line := &netIPSocketLine{}
|
line := &netIPSocketLine{}
|
||||||
if len(fields) < 10 {
|
if len(fields) < 10 {
|
||||||
return nil, fmt.Errorf(
|
return nil, fmt.Errorf(
|
||||||
|
@ -167,7 +178,7 @@ func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if line.Sl, err = strconv.ParseUint(s[0], 0, 64); err != nil {
|
if line.Sl, err = strconv.ParseUint(s[0], 0, 64); err != nil {
|
||||||
return nil, fmt.Errorf("%s: Unable to parse sl field in %q: %w", ErrFileParse, line.Sl, err)
|
return nil, fmt.Errorf("%w: Unable to parse sl field in %q: %w", ErrFileParse, line.Sl, err)
|
||||||
}
|
}
|
||||||
// local_address
|
// local_address
|
||||||
l := strings.Split(fields[1], ":")
|
l := strings.Split(fields[1], ":")
|
||||||
|
@ -178,7 +189,7 @@ func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if line.LocalPort, err = strconv.ParseUint(l[1], 16, 64); err != nil {
|
if line.LocalPort, err = strconv.ParseUint(l[1], 16, 64); err != nil {
|
||||||
return nil, fmt.Errorf("%s: Unable to parse local_address port value line %q: %w", ErrFileParse, line.LocalPort, err)
|
return nil, fmt.Errorf("%w: Unable to parse local_address port value line %q: %w", ErrFileParse, line.LocalPort, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// remote_address
|
// remote_address
|
||||||
|
@ -190,12 +201,12 @@ func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if line.RemPort, err = strconv.ParseUint(r[1], 16, 64); err != nil {
|
if line.RemPort, err = strconv.ParseUint(r[1], 16, 64); err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse rem_address port value in %q: %w", ErrFileParse, line.RemPort, err)
|
return nil, fmt.Errorf("%w: Cannot parse rem_address port value in %q: %w", ErrFileParse, line.RemPort, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// st
|
// st
|
||||||
if line.St, err = strconv.ParseUint(fields[3], 16, 64); err != nil {
|
if line.St, err = strconv.ParseUint(fields[3], 16, 64); err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse st value in %q: %w", ErrFileParse, line.St, err)
|
return nil, fmt.Errorf("%w: Cannot parse st value in %q: %w", ErrFileParse, line.St, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// tx_queue and rx_queue
|
// tx_queue and rx_queue
|
||||||
|
@ -208,20 +219,29 @@ func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if line.TxQueue, err = strconv.ParseUint(q[0], 16, 64); err != nil {
|
if line.TxQueue, err = strconv.ParseUint(q[0], 16, 64); err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse tx_queue value in %q: %w", ErrFileParse, line.TxQueue, err)
|
return nil, fmt.Errorf("%w: Cannot parse tx_queue value in %q: %w", ErrFileParse, line.TxQueue, err)
|
||||||
}
|
}
|
||||||
if line.RxQueue, err = strconv.ParseUint(q[1], 16, 64); err != nil {
|
if line.RxQueue, err = strconv.ParseUint(q[1], 16, 64); err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse trx_queue value in %q: %w", ErrFileParse, line.RxQueue, err)
|
return nil, fmt.Errorf("%w: Cannot parse trx_queue value in %q: %w", ErrFileParse, line.RxQueue, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// uid
|
// uid
|
||||||
if line.UID, err = strconv.ParseUint(fields[7], 0, 64); err != nil {
|
if line.UID, err = strconv.ParseUint(fields[7], 0, 64); err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse UID value in %q: %w", ErrFileParse, line.UID, err)
|
return nil, fmt.Errorf("%w: Cannot parse UID value in %q: %w", ErrFileParse, line.UID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// inode
|
// inode
|
||||||
if line.Inode, err = strconv.ParseUint(fields[9], 0, 64); err != nil {
|
if line.Inode, err = strconv.ParseUint(fields[9], 0, 64); err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse inode value in %q: %w", ErrFileParse, line.Inode, err)
|
return nil, fmt.Errorf("%w: Cannot parse inode value in %q: %w", ErrFileParse, line.Inode, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// drops
|
||||||
|
if isUDP {
|
||||||
|
drops, err := strconv.ParseUint(fields[12], 0, 64)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("%w: Cannot parse drops value in %q: %w", ErrFileParse, drops, err)
|
||||||
|
}
|
||||||
|
line.Drops = &drops
|
||||||
}
|
}
|
||||||
|
|
||||||
return line, nil
|
return line, nil
|
||||||
|
|
|
@ -69,7 +69,7 @@ func readSockstat(name string) (*NetSockstat, error) {
|
||||||
|
|
||||||
stat, err := parseSockstat(bytes.NewReader(b))
|
stat, err := parseSockstat(bytes.NewReader(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: sockstats from %q: %w", ErrFileRead, name, err)
|
return nil, fmt.Errorf("%w: sockstats from %q: %w", ErrFileRead, name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return stat, nil
|
return stat, nil
|
||||||
|
@ -89,7 +89,7 @@ func parseSockstat(r io.Reader) (*NetSockstat, error) {
|
||||||
// The remaining fields are key/value pairs.
|
// The remaining fields are key/value pairs.
|
||||||
kvs, err := parseSockstatKVs(fields[1:])
|
kvs, err := parseSockstatKVs(fields[1:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: sockstat key/value pairs from %q: %w", ErrFileParse, s.Text(), err)
|
return nil, fmt.Errorf("%w: sockstat key/value pairs from %q: %w", ErrFileParse, s.Text(), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// The first field is the protocol. We must trim its colon suffix.
|
// The first field is the protocol. We must trim its colon suffix.
|
||||||
|
|
|
@ -64,7 +64,7 @@ func (fs FS) NetSoftnetStat() ([]SoftnetStat, error) {
|
||||||
|
|
||||||
entries, err := parseSoftnet(bytes.NewReader(b))
|
entries, err := parseSoftnet(bytes.NewReader(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: /proc/net/softnet_stat: %w", ErrFileParse, err)
|
return nil, fmt.Errorf("%w: /proc/net/softnet_stat: %w", ErrFileParse, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return entries, nil
|
return entries, nil
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
// Copyright 2023 Prometheus Team
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package procfs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TLSStat struct represents data in /proc/net/tls_stat.
|
||||||
|
// See https://docs.kernel.org/networking/tls.html#statistics
|
||||||
|
type TLSStat struct {
|
||||||
|
// number of TX sessions currently installed where host handles cryptography
|
||||||
|
TLSCurrTxSw int
|
||||||
|
// number of RX sessions currently installed where host handles cryptography
|
||||||
|
TLSCurrRxSw int
|
||||||
|
// number of TX sessions currently installed where NIC handles cryptography
|
||||||
|
TLSCurrTxDevice int
|
||||||
|
// number of RX sessions currently installed where NIC handles cryptography
|
||||||
|
TLSCurrRxDevice int
|
||||||
|
//number of TX sessions opened with host cryptography
|
||||||
|
TLSTxSw int
|
||||||
|
//number of RX sessions opened with host cryptography
|
||||||
|
TLSRxSw int
|
||||||
|
// number of TX sessions opened with NIC cryptography
|
||||||
|
TLSTxDevice int
|
||||||
|
// number of RX sessions opened with NIC cryptography
|
||||||
|
TLSRxDevice int
|
||||||
|
// record decryption failed (e.g. due to incorrect authentication tag)
|
||||||
|
TLSDecryptError int
|
||||||
|
// number of RX resyncs sent to NICs handling cryptography
|
||||||
|
TLSRxDeviceResync int
|
||||||
|
// number of RX records which had to be re-decrypted due to TLS_RX_EXPECT_NO_PAD mis-prediction. Note that this counter will also increment for non-data records.
|
||||||
|
TLSDecryptRetry int
|
||||||
|
// number of data RX records which had to be re-decrypted due to TLS_RX_EXPECT_NO_PAD mis-prediction.
|
||||||
|
TLSRxNoPadViolation int
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewTLSStat reads the tls_stat statistics.
|
||||||
|
func NewTLSStat() (TLSStat, error) {
|
||||||
|
fs, err := NewFS(DefaultMountPoint)
|
||||||
|
if err != nil {
|
||||||
|
return TLSStat{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return fs.NewTLSStat()
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewTLSStat reads the tls_stat statistics.
|
||||||
|
func (fs FS) NewTLSStat() (TLSStat, error) {
|
||||||
|
file, err := os.Open(fs.proc.Path("net/tls_stat"))
|
||||||
|
if err != nil {
|
||||||
|
return TLSStat{}, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
var (
|
||||||
|
tlsstat = TLSStat{}
|
||||||
|
s = bufio.NewScanner(file)
|
||||||
|
)
|
||||||
|
|
||||||
|
for s.Scan() {
|
||||||
|
fields := strings.Fields(s.Text())
|
||||||
|
|
||||||
|
if len(fields) != 2 {
|
||||||
|
return TLSStat{}, fmt.Errorf("%w: %q line %q", ErrFileParse, file.Name(), s.Text())
|
||||||
|
}
|
||||||
|
|
||||||
|
name := fields[0]
|
||||||
|
value, err := strconv.Atoi(fields[1])
|
||||||
|
if err != nil {
|
||||||
|
return TLSStat{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch name {
|
||||||
|
case "TlsCurrTxSw":
|
||||||
|
tlsstat.TLSCurrTxSw = value
|
||||||
|
case "TlsCurrRxSw":
|
||||||
|
tlsstat.TLSCurrRxSw = value
|
||||||
|
case "TlsCurrTxDevice":
|
||||||
|
tlsstat.TLSCurrTxDevice = value
|
||||||
|
case "TlsCurrRxDevice":
|
||||||
|
tlsstat.TLSCurrRxDevice = value
|
||||||
|
case "TlsTxSw":
|
||||||
|
tlsstat.TLSTxSw = value
|
||||||
|
case "TlsRxSw":
|
||||||
|
tlsstat.TLSRxSw = value
|
||||||
|
case "TlsTxDevice":
|
||||||
|
tlsstat.TLSTxDevice = value
|
||||||
|
case "TlsRxDevice":
|
||||||
|
tlsstat.TLSRxDevice = value
|
||||||
|
case "TlsDecryptError":
|
||||||
|
tlsstat.TLSDecryptError = value
|
||||||
|
case "TlsRxDeviceResync":
|
||||||
|
tlsstat.TLSRxDeviceResync = value
|
||||||
|
case "TlsDecryptRetry":
|
||||||
|
tlsstat.TLSDecryptRetry = value
|
||||||
|
case "TlsRxNoPadViolation":
|
||||||
|
tlsstat.TLSRxNoPadViolation = value
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return tlsstat, s.Err()
|
||||||
|
}
|
|
@ -108,14 +108,14 @@ func parseNetUNIX(r io.Reader) (*NetUNIX, error) {
|
||||||
line := s.Text()
|
line := s.Text()
|
||||||
item, err := nu.parseLine(line, hasInode, minFields)
|
item, err := nu.parseLine(line, hasInode, minFields)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: /proc/net/unix encountered data %q: %w", ErrFileParse, line, err)
|
return nil, fmt.Errorf("%w: /proc/net/unix encountered data %q: %w", ErrFileParse, line, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
nu.Rows = append(nu.Rows, item)
|
nu.Rows = append(nu.Rows, item)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := s.Err(); err != nil {
|
if err := s.Err(); err != nil {
|
||||||
return nil, fmt.Errorf("%s: /proc/net/unix encountered data: %w", ErrFileParse, err)
|
return nil, fmt.Errorf("%w: /proc/net/unix encountered data: %w", ErrFileParse, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &nu, nil
|
return &nu, nil
|
||||||
|
@ -136,29 +136,29 @@ func (u *NetUNIX) parseLine(line string, hasInode bool, min int) (*NetUNIXLine,
|
||||||
|
|
||||||
users, err := u.parseUsers(fields[1])
|
users, err := u.parseUsers(fields[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: ref count %q: %w", ErrFileParse, fields[1], err)
|
return nil, fmt.Errorf("%w: ref count %q: %w", ErrFileParse, fields[1], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
flags, err := u.parseFlags(fields[3])
|
flags, err := u.parseFlags(fields[3])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Unable to parse flags %q: %w", ErrFileParse, fields[3], err)
|
return nil, fmt.Errorf("%w: Unable to parse flags %q: %w", ErrFileParse, fields[3], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
typ, err := u.parseType(fields[4])
|
typ, err := u.parseType(fields[4])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Failed to parse type %q: %w", ErrFileParse, fields[4], err)
|
return nil, fmt.Errorf("%w: Failed to parse type %q: %w", ErrFileParse, fields[4], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
state, err := u.parseState(fields[5])
|
state, err := u.parseState(fields[5])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Failed to parse state %q: %w", ErrFileParse, fields[5], err)
|
return nil, fmt.Errorf("%w: Failed to parse state %q: %w", ErrFileParse, fields[5], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var inode uint64
|
var inode uint64
|
||||||
if hasInode {
|
if hasInode {
|
||||||
inode, err = u.parseInode(fields[6])
|
inode, err = u.parseInode(fields[6])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s failed to parse inode %q: %w", ErrFileParse, fields[6], err)
|
return nil, fmt.Errorf("%w failed to parse inode %q: %w", ErrFileParse, fields[6], err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ func (fs FS) Wireless() ([]*Wireless, error) {
|
||||||
|
|
||||||
m, err := parseWireless(bytes.NewReader(b))
|
m, err := parseWireless(bytes.NewReader(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: wireless: %w", ErrFileParse, err)
|
return nil, fmt.Errorf("%w: wireless: %w", ErrFileParse, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return m, nil
|
return m, nil
|
||||||
|
@ -114,47 +114,47 @@ func parseWireless(r io.Reader) ([]*Wireless, error) {
|
||||||
|
|
||||||
qlink, err := strconv.Atoi(strings.TrimSuffix(stats[1], "."))
|
qlink, err := strconv.Atoi(strings.TrimSuffix(stats[1], "."))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: parse Quality:link as integer %q: %w", ErrFileParse, qlink, err)
|
return nil, fmt.Errorf("%w: parse Quality:link as integer %q: %w", ErrFileParse, qlink, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
qlevel, err := strconv.Atoi(strings.TrimSuffix(stats[2], "."))
|
qlevel, err := strconv.Atoi(strings.TrimSuffix(stats[2], "."))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Quality:level as integer %q: %w", ErrFileParse, qlevel, err)
|
return nil, fmt.Errorf("%w: Quality:level as integer %q: %w", ErrFileParse, qlevel, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
qnoise, err := strconv.Atoi(strings.TrimSuffix(stats[3], "."))
|
qnoise, err := strconv.Atoi(strings.TrimSuffix(stats[3], "."))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Quality:noise as integer %q: %w", ErrFileParse, qnoise, err)
|
return nil, fmt.Errorf("%w: Quality:noise as integer %q: %w", ErrFileParse, qnoise, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dnwid, err := strconv.Atoi(stats[4])
|
dnwid, err := strconv.Atoi(stats[4])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Discarded:nwid as integer %q: %w", ErrFileParse, dnwid, err)
|
return nil, fmt.Errorf("%w: Discarded:nwid as integer %q: %w", ErrFileParse, dnwid, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dcrypt, err := strconv.Atoi(stats[5])
|
dcrypt, err := strconv.Atoi(stats[5])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Discarded:crypt as integer %q: %w", ErrFileParse, dcrypt, err)
|
return nil, fmt.Errorf("%w: Discarded:crypt as integer %q: %w", ErrFileParse, dcrypt, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dfrag, err := strconv.Atoi(stats[6])
|
dfrag, err := strconv.Atoi(stats[6])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Discarded:frag as integer %q: %w", ErrFileParse, dfrag, err)
|
return nil, fmt.Errorf("%w: Discarded:frag as integer %q: %w", ErrFileParse, dfrag, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dretry, err := strconv.Atoi(stats[7])
|
dretry, err := strconv.Atoi(stats[7])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Discarded:retry as integer %q: %w", ErrFileParse, dretry, err)
|
return nil, fmt.Errorf("%w: Discarded:retry as integer %q: %w", ErrFileParse, dretry, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dmisc, err := strconv.Atoi(stats[8])
|
dmisc, err := strconv.Atoi(stats[8])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Discarded:misc as integer %q: %w", ErrFileParse, dmisc, err)
|
return nil, fmt.Errorf("%w: Discarded:misc as integer %q: %w", ErrFileParse, dmisc, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
mbeacon, err := strconv.Atoi(stats[9])
|
mbeacon, err := strconv.Atoi(stats[9])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Missed:beacon as integer %q: %w", ErrFileParse, mbeacon, err)
|
return nil, fmt.Errorf("%w: Missed:beacon as integer %q: %w", ErrFileParse, mbeacon, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
w := &Wireless{
|
w := &Wireless{
|
||||||
|
@ -175,7 +175,7 @@ func parseWireless(r io.Reader) ([]*Wireless, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := scanner.Err(); err != nil {
|
if err := scanner.Err(); err != nil {
|
||||||
return nil, fmt.Errorf("%s: Failed to scan /proc/net/wireless: %w", ErrFileRead, err)
|
return nil, fmt.Errorf("%w: Failed to scan /proc/net/wireless: %w", ErrFileRead, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return interfaces, nil
|
return interfaces, nil
|
||||||
|
|
|
@ -111,7 +111,7 @@ func (fs FS) AllProcs() (Procs, error) {
|
||||||
|
|
||||||
names, err := d.Readdirnames(-1)
|
names, err := d.Readdirnames(-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Procs{}, fmt.Errorf("%s: Cannot read file: %v: %w", ErrFileRead, names, err)
|
return Procs{}, fmt.Errorf("%w: Cannot read file: %v: %w", ErrFileRead, names, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p := Procs{}
|
p := Procs{}
|
||||||
|
@ -137,7 +137,7 @@ func (p Proc) CmdLine() ([]string, error) {
|
||||||
return []string{}, nil
|
return []string{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Split(string(bytes.TrimRight(data, string("\x00"))), string(byte(0))), nil
|
return strings.Split(string(bytes.TrimRight(data, "\x00")), "\x00"), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wchan returns the wchan (wait channel) of a process.
|
// Wchan returns the wchan (wait channel) of a process.
|
||||||
|
@ -212,7 +212,7 @@ func (p Proc) FileDescriptors() ([]uintptr, error) {
|
||||||
for i, n := range names {
|
for i, n := range names {
|
||||||
fd, err := strconv.ParseInt(n, 10, 32)
|
fd, err := strconv.ParseInt(n, 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot parse line: %v: %w", ErrFileParse, i, err)
|
return nil, fmt.Errorf("%w: Cannot parse line: %v: %w", ErrFileParse, i, err)
|
||||||
}
|
}
|
||||||
fds[i] = uintptr(fd)
|
fds[i] = uintptr(fd)
|
||||||
}
|
}
|
||||||
|
@ -297,7 +297,7 @@ func (p Proc) fileDescriptors() ([]string, error) {
|
||||||
|
|
||||||
names, err := d.Readdirnames(-1)
|
names, err := d.Readdirnames(-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: Cannot read file: %v: %w", ErrFileRead, names, err)
|
return nil, fmt.Errorf("%w: Cannot read file: %v: %w", ErrFileRead, names, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return names, nil
|
return names, nil
|
||||||
|
|
|
@ -154,7 +154,7 @@ func parseUint(s string) (uint64, error) {
|
||||||
}
|
}
|
||||||
i, err := strconv.ParseUint(s, 10, 64)
|
i, err := strconv.ParseUint(s, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("%s: couldn't parse value %q: %w", ErrFileParse, s, err)
|
return 0, fmt.Errorf("%w: couldn't parse value %q: %w", ErrFileParse, s, err)
|
||||||
}
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ func (p Proc) Namespaces() (Namespaces, error) {
|
||||||
|
|
||||||
names, err := d.Readdirnames(-1)
|
names, err := d.Readdirnames(-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: failed to read contents of ns dir: %w", ErrFileRead, err)
|
return nil, fmt.Errorf("%w: failed to read contents of ns dir: %w", ErrFileRead, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ns := make(Namespaces, len(names))
|
ns := make(Namespaces, len(names))
|
||||||
|
@ -58,7 +58,7 @@ func (p Proc) Namespaces() (Namespaces, error) {
|
||||||
typ := fields[0]
|
typ := fields[0]
|
||||||
inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32)
|
inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: inode from %q: %w", ErrFileParse, fields[1], err)
|
return nil, fmt.Errorf("%w: inode from %q: %w", ErrFileParse, fields[1], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ns[name] = Namespace{typ, uint32(inode)}
|
ns[name] = Namespace{typ, uint32(inode)}
|
||||||
|
|
|
@ -61,7 +61,7 @@ type PSIStats struct {
|
||||||
func (fs FS) PSIStatsForResource(resource string) (PSIStats, error) {
|
func (fs FS) PSIStatsForResource(resource string) (PSIStats, error) {
|
||||||
data, err := util.ReadFileNoStat(fs.proc.Path(fmt.Sprintf("%s/%s", "pressure", resource)))
|
data, err := util.ReadFileNoStat(fs.proc.Path(fmt.Sprintf("%s/%s", "pressure", resource)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return PSIStats{}, fmt.Errorf("%s: psi_stats: unavailable for %q: %w", ErrFileRead, resource, err)
|
return PSIStats{}, fmt.Errorf("%w: psi_stats: unavailable for %q: %w", ErrFileRead, resource, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return parsePSIStats(bytes.NewReader(data))
|
return parsePSIStats(bytes.NewReader(data))
|
||||||
|
|
|
@ -127,7 +127,7 @@ func (s *ProcSMapsRollup) parseLine(line string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
v := strings.TrimSpace(kv[1])
|
v := strings.TrimSpace(kv[1])
|
||||||
v = strings.TrimRight(v, " kB")
|
v = strings.TrimSuffix(v, " kB")
|
||||||
|
|
||||||
vKBytes, err := strconv.ParseUint(v, 10, 64)
|
vKBytes, err := strconv.ParseUint(v, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -110,6 +110,11 @@ type ProcStat struct {
|
||||||
Policy uint
|
Policy uint
|
||||||
// Aggregated block I/O delays, measured in clock ticks (centiseconds).
|
// Aggregated block I/O delays, measured in clock ticks (centiseconds).
|
||||||
DelayAcctBlkIOTicks uint64
|
DelayAcctBlkIOTicks uint64
|
||||||
|
// Guest time of the process (time spent running a virtual CPU for a guest
|
||||||
|
// operating system), measured in clock ticks.
|
||||||
|
GuestTime int
|
||||||
|
// Guest time of the process's children, measured in clock ticks.
|
||||||
|
CGuestTime int
|
||||||
|
|
||||||
proc FS
|
proc FS
|
||||||
}
|
}
|
||||||
|
@ -189,6 +194,8 @@ func (p Proc) Stat() (ProcStat, error) {
|
||||||
&s.RTPriority,
|
&s.RTPriority,
|
||||||
&s.Policy,
|
&s.Policy,
|
||||||
&s.DelayAcctBlkIOTicks,
|
&s.DelayAcctBlkIOTicks,
|
||||||
|
&s.GuestTime,
|
||||||
|
&s.CGuestTime,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ProcStat{}, err
|
return ProcStat{}, err
|
||||||
|
|
|
@ -15,6 +15,7 @@ package procfs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"math/bits"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -76,9 +77,9 @@ type ProcStatus struct {
|
||||||
NonVoluntaryCtxtSwitches uint64
|
NonVoluntaryCtxtSwitches uint64
|
||||||
|
|
||||||
// UIDs of the process (Real, effective, saved set, and filesystem UIDs)
|
// UIDs of the process (Real, effective, saved set, and filesystem UIDs)
|
||||||
UIDs [4]string
|
UIDs [4]uint64
|
||||||
// GIDs of the process (Real, effective, saved set, and filesystem GIDs)
|
// GIDs of the process (Real, effective, saved set, and filesystem GIDs)
|
||||||
GIDs [4]string
|
GIDs [4]uint64
|
||||||
|
|
||||||
// CpusAllowedList: List of cpu cores processes are allowed to run on.
|
// CpusAllowedList: List of cpu cores processes are allowed to run on.
|
||||||
CpusAllowedList []uint64
|
CpusAllowedList []uint64
|
||||||
|
@ -113,22 +114,37 @@ func (p Proc) NewStatus() (ProcStatus, error) {
|
||||||
// convert kB to B
|
// convert kB to B
|
||||||
vBytes := vKBytes * 1024
|
vBytes := vKBytes * 1024
|
||||||
|
|
||||||
s.fillStatus(k, v, vKBytes, vBytes)
|
err = s.fillStatus(k, v, vKBytes, vBytes)
|
||||||
|
if err != nil {
|
||||||
|
return ProcStatus{}, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64, vUintBytes uint64) {
|
func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64, vUintBytes uint64) error {
|
||||||
switch k {
|
switch k {
|
||||||
case "Tgid":
|
case "Tgid":
|
||||||
s.TGID = int(vUint)
|
s.TGID = int(vUint)
|
||||||
case "Name":
|
case "Name":
|
||||||
s.Name = vString
|
s.Name = vString
|
||||||
case "Uid":
|
case "Uid":
|
||||||
copy(s.UIDs[:], strings.Split(vString, "\t"))
|
var err error
|
||||||
|
for i, v := range strings.Split(vString, "\t") {
|
||||||
|
s.UIDs[i], err = strconv.ParseUint(v, 10, bits.UintSize)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
case "Gid":
|
case "Gid":
|
||||||
copy(s.GIDs[:], strings.Split(vString, "\t"))
|
var err error
|
||||||
|
for i, v := range strings.Split(vString, "\t") {
|
||||||
|
s.GIDs[i], err = strconv.ParseUint(v, 10, bits.UintSize)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
case "NSpid":
|
case "NSpid":
|
||||||
s.NSpids = calcNSPidsList(vString)
|
s.NSpids = calcNSPidsList(vString)
|
||||||
case "VmPeak":
|
case "VmPeak":
|
||||||
|
@ -173,6 +189,7 @@ func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64, vUintByt
|
||||||
s.CpusAllowedList = calcCpusAllowedList(vString)
|
s.CpusAllowedList = calcCpusAllowedList(vString)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TotalCtxtSwitches returns the total context switch.
|
// TotalCtxtSwitches returns the total context switch.
|
||||||
|
|
|
@ -44,7 +44,7 @@ func (fs FS) SysctlInts(sysctl string) ([]int, error) {
|
||||||
vp := util.NewValueParser(f)
|
vp := util.NewValueParser(f)
|
||||||
values[i] = vp.Int()
|
values[i] = vp.Int()
|
||||||
if err := vp.Err(); err != nil {
|
if err := vp.Err(); err != nil {
|
||||||
return nil, fmt.Errorf("%s: field %d in sysctl %s is not a valid int: %w", ErrFileParse, i, sysctl, err)
|
return nil, fmt.Errorf("%w: field %d in sysctl %s is not a valid int: %w", ErrFileParse, i, sysctl, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return values, nil
|
return values, nil
|
||||||
|
|
|
@ -74,7 +74,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) {
|
||||||
softirqs.Hi = make([]uint64, len(perCPU))
|
softirqs.Hi = make([]uint64, len(perCPU))
|
||||||
for i, count := range perCPU {
|
for i, count := range perCPU {
|
||||||
if softirqs.Hi[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if softirqs.Hi[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (HI%d): %w", ErrFileParse, count, i, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (HI%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case parts[0] == "TIMER:":
|
case parts[0] == "TIMER:":
|
||||||
|
@ -82,7 +82,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) {
|
||||||
softirqs.Timer = make([]uint64, len(perCPU))
|
softirqs.Timer = make([]uint64, len(perCPU))
|
||||||
for i, count := range perCPU {
|
for i, count := range perCPU {
|
||||||
if softirqs.Timer[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if softirqs.Timer[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (TIMER%d): %w", ErrFileParse, count, i, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (TIMER%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case parts[0] == "NET_TX:":
|
case parts[0] == "NET_TX:":
|
||||||
|
@ -90,7 +90,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) {
|
||||||
softirqs.NetTx = make([]uint64, len(perCPU))
|
softirqs.NetTx = make([]uint64, len(perCPU))
|
||||||
for i, count := range perCPU {
|
for i, count := range perCPU {
|
||||||
if softirqs.NetTx[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if softirqs.NetTx[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (NET_TX%d): %w", ErrFileParse, count, i, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (NET_TX%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case parts[0] == "NET_RX:":
|
case parts[0] == "NET_RX:":
|
||||||
|
@ -98,7 +98,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) {
|
||||||
softirqs.NetRx = make([]uint64, len(perCPU))
|
softirqs.NetRx = make([]uint64, len(perCPU))
|
||||||
for i, count := range perCPU {
|
for i, count := range perCPU {
|
||||||
if softirqs.NetRx[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if softirqs.NetRx[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (NET_RX%d): %w", ErrFileParse, count, i, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (NET_RX%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case parts[0] == "BLOCK:":
|
case parts[0] == "BLOCK:":
|
||||||
|
@ -106,7 +106,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) {
|
||||||
softirqs.Block = make([]uint64, len(perCPU))
|
softirqs.Block = make([]uint64, len(perCPU))
|
||||||
for i, count := range perCPU {
|
for i, count := range perCPU {
|
||||||
if softirqs.Block[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if softirqs.Block[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (BLOCK%d): %w", ErrFileParse, count, i, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (BLOCK%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case parts[0] == "IRQ_POLL:":
|
case parts[0] == "IRQ_POLL:":
|
||||||
|
@ -114,7 +114,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) {
|
||||||
softirqs.IRQPoll = make([]uint64, len(perCPU))
|
softirqs.IRQPoll = make([]uint64, len(perCPU))
|
||||||
for i, count := range perCPU {
|
for i, count := range perCPU {
|
||||||
if softirqs.IRQPoll[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if softirqs.IRQPoll[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (IRQ_POLL%d): %w", ErrFileParse, count, i, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (IRQ_POLL%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case parts[0] == "TASKLET:":
|
case parts[0] == "TASKLET:":
|
||||||
|
@ -122,7 +122,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) {
|
||||||
softirqs.Tasklet = make([]uint64, len(perCPU))
|
softirqs.Tasklet = make([]uint64, len(perCPU))
|
||||||
for i, count := range perCPU {
|
for i, count := range perCPU {
|
||||||
if softirqs.Tasklet[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if softirqs.Tasklet[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (TASKLET%d): %w", ErrFileParse, count, i, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (TASKLET%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case parts[0] == "SCHED:":
|
case parts[0] == "SCHED:":
|
||||||
|
@ -130,7 +130,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) {
|
||||||
softirqs.Sched = make([]uint64, len(perCPU))
|
softirqs.Sched = make([]uint64, len(perCPU))
|
||||||
for i, count := range perCPU {
|
for i, count := range perCPU {
|
||||||
if softirqs.Sched[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if softirqs.Sched[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (SCHED%d): %w", ErrFileParse, count, i, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (SCHED%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case parts[0] == "HRTIMER:":
|
case parts[0] == "HRTIMER:":
|
||||||
|
@ -138,7 +138,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) {
|
||||||
softirqs.HRTimer = make([]uint64, len(perCPU))
|
softirqs.HRTimer = make([]uint64, len(perCPU))
|
||||||
for i, count := range perCPU {
|
for i, count := range perCPU {
|
||||||
if softirqs.HRTimer[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if softirqs.HRTimer[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (HRTIMER%d): %w", ErrFileParse, count, i, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (HRTIMER%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case parts[0] == "RCU:":
|
case parts[0] == "RCU:":
|
||||||
|
@ -146,14 +146,14 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) {
|
||||||
softirqs.RCU = make([]uint64, len(perCPU))
|
softirqs.RCU = make([]uint64, len(perCPU))
|
||||||
for i, count := range perCPU {
|
for i, count := range perCPU {
|
||||||
if softirqs.RCU[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if softirqs.RCU[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse %q (RCU%d): %w", ErrFileParse, count, i, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (RCU%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := scanner.Err(); err != nil {
|
if err := scanner.Err(); err != nil {
|
||||||
return Softirqs{}, fmt.Errorf("%s: couldn't parse softirqs: %w", ErrFileParse, err)
|
return Softirqs{}, fmt.Errorf("%w: couldn't parse softirqs: %w", ErrFileParse, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return softirqs, scanner.Err()
|
return softirqs, scanner.Err()
|
||||||
|
|
|
@ -93,7 +93,7 @@ func parseCPUStat(line string) (CPUStat, int64, error) {
|
||||||
&cpuStat.Guest, &cpuStat.GuestNice)
|
&cpuStat.Guest, &cpuStat.GuestNice)
|
||||||
|
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
return CPUStat{}, -1, fmt.Errorf("%s: couldn't parse %q (cpu): %w", ErrFileParse, line, err)
|
return CPUStat{}, -1, fmt.Errorf("%w: couldn't parse %q (cpu): %w", ErrFileParse, line, err)
|
||||||
}
|
}
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
return CPUStat{}, -1, fmt.Errorf("%w: couldn't parse %q (cpu): 0 elements parsed", ErrFileParse, line)
|
return CPUStat{}, -1, fmt.Errorf("%w: couldn't parse %q (cpu): 0 elements parsed", ErrFileParse, line)
|
||||||
|
@ -116,7 +116,7 @@ func parseCPUStat(line string) (CPUStat, int64, error) {
|
||||||
|
|
||||||
cpuID, err := strconv.ParseInt(cpu[3:], 10, 64)
|
cpuID, err := strconv.ParseInt(cpu[3:], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return CPUStat{}, -1, fmt.Errorf("%s: couldn't parse %q (cpu/cpuid): %w", ErrFileParse, line, err)
|
return CPUStat{}, -1, fmt.Errorf("%w: couldn't parse %q (cpu/cpuid): %w", ErrFileParse, line, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return cpuStat, cpuID, nil
|
return cpuStat, cpuID, nil
|
||||||
|
@ -136,7 +136,7 @@ func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) {
|
||||||
&softIRQStat.Hrtimer, &softIRQStat.Rcu)
|
&softIRQStat.Hrtimer, &softIRQStat.Rcu)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return SoftIRQStat{}, 0, fmt.Errorf("%s: couldn't parse %q (softirq): %w", ErrFileParse, line, err)
|
return SoftIRQStat{}, 0, fmt.Errorf("%w: couldn't parse %q (softirq): %w", ErrFileParse, line, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return softIRQStat, total, nil
|
return softIRQStat, total, nil
|
||||||
|
@ -201,34 +201,34 @@ func parseStat(r io.Reader, fileName string) (Stat, error) {
|
||||||
switch {
|
switch {
|
||||||
case parts[0] == "btime":
|
case parts[0] == "btime":
|
||||||
if stat.BootTime, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
if stat.BootTime, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
||||||
return Stat{}, fmt.Errorf("%s: couldn't parse %q (btime): %w", ErrFileParse, parts[1], err)
|
return Stat{}, fmt.Errorf("%w: couldn't parse %q (btime): %w", ErrFileParse, parts[1], err)
|
||||||
}
|
}
|
||||||
case parts[0] == "intr":
|
case parts[0] == "intr":
|
||||||
if stat.IRQTotal, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
if stat.IRQTotal, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
||||||
return Stat{}, fmt.Errorf("%s: couldn't parse %q (intr): %w", ErrFileParse, parts[1], err)
|
return Stat{}, fmt.Errorf("%w: couldn't parse %q (intr): %w", ErrFileParse, parts[1], err)
|
||||||
}
|
}
|
||||||
numberedIRQs := parts[2:]
|
numberedIRQs := parts[2:]
|
||||||
stat.IRQ = make([]uint64, len(numberedIRQs))
|
stat.IRQ = make([]uint64, len(numberedIRQs))
|
||||||
for i, count := range numberedIRQs {
|
for i, count := range numberedIRQs {
|
||||||
if stat.IRQ[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
if stat.IRQ[i], err = strconv.ParseUint(count, 10, 64); err != nil {
|
||||||
return Stat{}, fmt.Errorf("%s: couldn't parse %q (intr%d): %w", ErrFileParse, count, i, err)
|
return Stat{}, fmt.Errorf("%w: couldn't parse %q (intr%d): %w", ErrFileParse, count, i, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case parts[0] == "ctxt":
|
case parts[0] == "ctxt":
|
||||||
if stat.ContextSwitches, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
if stat.ContextSwitches, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
||||||
return Stat{}, fmt.Errorf("%s: couldn't parse %q (ctxt): %w", ErrFileParse, parts[1], err)
|
return Stat{}, fmt.Errorf("%w: couldn't parse %q (ctxt): %w", ErrFileParse, parts[1], err)
|
||||||
}
|
}
|
||||||
case parts[0] == "processes":
|
case parts[0] == "processes":
|
||||||
if stat.ProcessCreated, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
if stat.ProcessCreated, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
||||||
return Stat{}, fmt.Errorf("%s: couldn't parse %q (processes): %w", ErrFileParse, parts[1], err)
|
return Stat{}, fmt.Errorf("%w: couldn't parse %q (processes): %w", ErrFileParse, parts[1], err)
|
||||||
}
|
}
|
||||||
case parts[0] == "procs_running":
|
case parts[0] == "procs_running":
|
||||||
if stat.ProcessesRunning, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
if stat.ProcessesRunning, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
||||||
return Stat{}, fmt.Errorf("%s: couldn't parse %q (procs_running): %w", ErrFileParse, parts[1], err)
|
return Stat{}, fmt.Errorf("%w: couldn't parse %q (procs_running): %w", ErrFileParse, parts[1], err)
|
||||||
}
|
}
|
||||||
case parts[0] == "procs_blocked":
|
case parts[0] == "procs_blocked":
|
||||||
if stat.ProcessesBlocked, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
if stat.ProcessesBlocked, err = strconv.ParseUint(parts[1], 10, 64); err != nil {
|
||||||
return Stat{}, fmt.Errorf("%s: couldn't parse %q (procs_blocked): %w", ErrFileParse, parts[1], err)
|
return Stat{}, fmt.Errorf("%w: couldn't parse %q (procs_blocked): %w", ErrFileParse, parts[1], err)
|
||||||
}
|
}
|
||||||
case parts[0] == "softirq":
|
case parts[0] == "softirq":
|
||||||
softIRQStats, total, err := parseSoftIRQStat(line)
|
softIRQStats, total, err := parseSoftIRQStat(line)
|
||||||
|
@ -251,7 +251,7 @@ func parseStat(r io.Reader, fileName string) (Stat, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := scanner.Err(); err != nil {
|
if err := scanner.Err(); err != nil {
|
||||||
return Stat{}, fmt.Errorf("%s: couldn't parse %q: %w", ErrFileParse, fileName, err)
|
return Stat{}, fmt.Errorf("%w: couldn't parse %q: %w", ErrFileParse, fileName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return stat, nil
|
return stat, nil
|
||||||
|
|
|
@ -74,15 +74,15 @@ func parseSwapString(swapString string) (*Swap, error) {
|
||||||
|
|
||||||
swap.Size, err = strconv.Atoi(swapFields[2])
|
swap.Size, err = strconv.Atoi(swapFields[2])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: invalid swap size: %s: %w", ErrFileParse, swapFields[2], err)
|
return nil, fmt.Errorf("%w: invalid swap size: %s: %w", ErrFileParse, swapFields[2], err)
|
||||||
}
|
}
|
||||||
swap.Used, err = strconv.Atoi(swapFields[3])
|
swap.Used, err = strconv.Atoi(swapFields[3])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: invalid swap used: %s: %w", ErrFileParse, swapFields[3], err)
|
return nil, fmt.Errorf("%w: invalid swap used: %s: %w", ErrFileParse, swapFields[3], err)
|
||||||
}
|
}
|
||||||
swap.Priority, err = strconv.Atoi(swapFields[4])
|
swap.Priority, err = strconv.Atoi(swapFields[4])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: invalid swap priority: %s: %w", ErrFileParse, swapFields[4], err)
|
return nil, fmt.Errorf("%w: invalid swap priority: %s: %w", ErrFileParse, swapFields[4], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return swap, nil
|
return swap, nil
|
||||||
|
|
|
@ -45,7 +45,7 @@ func (fs FS) AllThreads(pid int) (Procs, error) {
|
||||||
|
|
||||||
names, err := d.Readdirnames(-1)
|
names, err := d.Readdirnames(-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Procs{}, fmt.Errorf("%s: could not read %q: %w", ErrFileRead, d.Name(), err)
|
return Procs{}, fmt.Errorf("%w: could not read %q: %w", ErrFileRead, d.Name(), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
t := Procs{}
|
t := Procs{}
|
||||||
|
|
|
@ -75,11 +75,11 @@ var nodeZoneRE = regexp.MustCompile(`(\d+), zone\s+(\w+)`)
|
||||||
func (fs FS) Zoneinfo() ([]Zoneinfo, error) {
|
func (fs FS) Zoneinfo() ([]Zoneinfo, error) {
|
||||||
data, err := os.ReadFile(fs.proc.Path("zoneinfo"))
|
data, err := os.ReadFile(fs.proc.Path("zoneinfo"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: error reading zoneinfo %q: %w", ErrFileRead, fs.proc.Path("zoneinfo"), err)
|
return nil, fmt.Errorf("%w: error reading zoneinfo %q: %w", ErrFileRead, fs.proc.Path("zoneinfo"), err)
|
||||||
}
|
}
|
||||||
zoneinfo, err := parseZoneinfo(data)
|
zoneinfo, err := parseZoneinfo(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: error parsing zoneinfo %q: %w", ErrFileParse, fs.proc.Path("zoneinfo"), err)
|
return nil, fmt.Errorf("%w: error parsing zoneinfo %q: %w", ErrFileParse, fs.proc.Path("zoneinfo"), err)
|
||||||
}
|
}
|
||||||
return zoneinfo, nil
|
return zoneinfo, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
"golang.org/x/net/idna"
|
"golang.org/x/net/idna"
|
||||||
)
|
)
|
||||||
|
|
||||||
var isTokenTable = [127]bool{
|
var isTokenTable = [256]bool{
|
||||||
'!': true,
|
'!': true,
|
||||||
'#': true,
|
'#': true,
|
||||||
'$': true,
|
'$': true,
|
||||||
|
@ -93,12 +93,7 @@ var isTokenTable = [127]bool{
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsTokenRune(r rune) bool {
|
func IsTokenRune(r rune) bool {
|
||||||
i := int(r)
|
return r < utf8.RuneSelf && isTokenTable[byte(r)]
|
||||||
return i < len(isTokenTable) && isTokenTable[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
func isNotToken(r rune) bool {
|
|
||||||
return !IsTokenRune(r)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// HeaderValuesContainsToken reports whether any string in values
|
// HeaderValuesContainsToken reports whether any string in values
|
||||||
|
@ -202,8 +197,8 @@ func ValidHeaderFieldName(v string) bool {
|
||||||
if len(v) == 0 {
|
if len(v) == 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
for _, r := range v {
|
for i := 0; i < len(v); i++ {
|
||||||
if !IsTokenRune(r) {
|
if !isTokenTable[v[i]] {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -490,6 +490,9 @@ func terminalReadFrameError(err error) bool {
|
||||||
// returned error is ErrFrameTooLarge. Other errors may be of type
|
// returned error is ErrFrameTooLarge. Other errors may be of type
|
||||||
// ConnectionError, StreamError, or anything else from the underlying
|
// ConnectionError, StreamError, or anything else from the underlying
|
||||||
// reader.
|
// reader.
|
||||||
|
//
|
||||||
|
// If ReadFrame returns an error and a non-nil Frame, the Frame's StreamID
|
||||||
|
// indicates the stream responsible for the error.
|
||||||
func (fr *Framer) ReadFrame() (Frame, error) {
|
func (fr *Framer) ReadFrame() (Frame, error) {
|
||||||
fr.errDetail = nil
|
fr.errDetail = nil
|
||||||
if fr.lastFrame != nil {
|
if fr.lastFrame != nil {
|
||||||
|
@ -1521,7 +1524,7 @@ func (fr *Framer) maxHeaderStringLen() int {
|
||||||
// readMetaFrame returns 0 or more CONTINUATION frames from fr and
|
// readMetaFrame returns 0 or more CONTINUATION frames from fr and
|
||||||
// merge them into the provided hf and returns a MetaHeadersFrame
|
// merge them into the provided hf and returns a MetaHeadersFrame
|
||||||
// with the decoded hpack values.
|
// with the decoded hpack values.
|
||||||
func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) {
|
func (fr *Framer) readMetaFrame(hf *HeadersFrame) (Frame, error) {
|
||||||
if fr.AllowIllegalReads {
|
if fr.AllowIllegalReads {
|
||||||
return nil, errors.New("illegal use of AllowIllegalReads with ReadMetaHeaders")
|
return nil, errors.New("illegal use of AllowIllegalReads with ReadMetaHeaders")
|
||||||
}
|
}
|
||||||
|
@ -1592,7 +1595,7 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) {
|
||||||
}
|
}
|
||||||
// It would be nice to send a RST_STREAM before sending the GOAWAY,
|
// It would be nice to send a RST_STREAM before sending the GOAWAY,
|
||||||
// but the structure of the server's frame writer makes this difficult.
|
// but the structure of the server's frame writer makes this difficult.
|
||||||
return nil, ConnectionError(ErrCodeProtocol)
|
return mh, ConnectionError(ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also close the connection after any CONTINUATION frame following an
|
// Also close the connection after any CONTINUATION frame following an
|
||||||
|
@ -1604,11 +1607,11 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) {
|
||||||
}
|
}
|
||||||
// It would be nice to send a RST_STREAM before sending the GOAWAY,
|
// It would be nice to send a RST_STREAM before sending the GOAWAY,
|
||||||
// but the structure of the server's frame writer makes this difficult.
|
// but the structure of the server's frame writer makes this difficult.
|
||||||
return nil, ConnectionError(ErrCodeProtocol)
|
return mh, ConnectionError(ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := hdec.Write(frag); err != nil {
|
if _, err := hdec.Write(frag); err != nil {
|
||||||
return nil, ConnectionError(ErrCodeCompression)
|
return mh, ConnectionError(ErrCodeCompression)
|
||||||
}
|
}
|
||||||
|
|
||||||
if hc.HeadersEnded() {
|
if hc.HeadersEnded() {
|
||||||
|
@ -1625,7 +1628,7 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) {
|
||||||
mh.HeadersFrame.invalidate()
|
mh.HeadersFrame.invalidate()
|
||||||
|
|
||||||
if err := hdec.Close(); err != nil {
|
if err := hdec.Close(); err != nil {
|
||||||
return nil, ConnectionError(ErrCodeCompression)
|
return mh, ConnectionError(ErrCodeCompression)
|
||||||
}
|
}
|
||||||
if invalid != nil {
|
if invalid != nil {
|
||||||
fr.errDetail = invalid
|
fr.errDetail = invalid
|
||||||
|
|
|
@ -732,11 +732,7 @@ func isClosedConnError(err error) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: remove this string search and be more like the Windows
|
if errors.Is(err, net.ErrClosed) {
|
||||||
// case below. That might involve modifying the standard library
|
|
||||||
// to return better error types.
|
|
||||||
str := err.Error()
|
|
||||||
if strings.Contains(str, "use of closed network connection") {
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1482,6 +1478,11 @@ func (sc *serverConn) processFrameFromReader(res readFrameResult) bool {
|
||||||
sc.goAway(ErrCodeFlowControl)
|
sc.goAway(ErrCodeFlowControl)
|
||||||
return true
|
return true
|
||||||
case ConnectionError:
|
case ConnectionError:
|
||||||
|
if res.f != nil {
|
||||||
|
if id := res.f.Header().StreamID; id > sc.maxClientStreamID {
|
||||||
|
sc.maxClientStreamID = id
|
||||||
|
}
|
||||||
|
}
|
||||||
sc.logf("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev)
|
sc.logf("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev)
|
||||||
sc.goAway(ErrCode(ev))
|
sc.goAway(ErrCode(ev))
|
||||||
return true // goAway will handle shutdown
|
return true // goAway will handle shutdown
|
||||||
|
|
|
@ -936,7 +936,20 @@ func (cc *ClientConn) setGoAway(f *GoAwayFrame) {
|
||||||
}
|
}
|
||||||
last := f.LastStreamID
|
last := f.LastStreamID
|
||||||
for streamID, cs := range cc.streams {
|
for streamID, cs := range cc.streams {
|
||||||
if streamID > last {
|
if streamID <= last {
|
||||||
|
// The server's GOAWAY indicates that it received this stream.
|
||||||
|
// It will either finish processing it, or close the connection
|
||||||
|
// without doing so. Either way, leave the stream alone for now.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if streamID == 1 && cc.goAway.ErrCode != ErrCodeNo {
|
||||||
|
// Don't retry the first stream on a connection if we get a non-NO error.
|
||||||
|
// If the server is sending an error on a new connection,
|
||||||
|
// retrying the request on a new one probably isn't going to work.
|
||||||
|
cs.abortStreamLocked(fmt.Errorf("http2: Transport received GOAWAY from server ErrCode:%v", cc.goAway.ErrCode))
|
||||||
|
} else {
|
||||||
|
// Aborting the stream with errClentConnGotGoAway indicates that
|
||||||
|
// the request should be retried on a new connection.
|
||||||
cs.abortStreamLocked(errClientConnGotGoAway)
|
cs.abortStreamLocked(errClientConnGotGoAway)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,9 +9,11 @@
|
||||||
#define PSALAA 1208(R0)
|
#define PSALAA 1208(R0)
|
||||||
#define GTAB64(x) 80(x)
|
#define GTAB64(x) 80(x)
|
||||||
#define LCA64(x) 88(x)
|
#define LCA64(x) 88(x)
|
||||||
#define CAA(x) 8(x)
|
|
||||||
#define EDCHPXV(x) 1016(x) // in the CAA
|
|
||||||
#define SAVSTACK_ASYNC(x) 336(x) // in the LCA
|
#define SAVSTACK_ASYNC(x) 336(x) // in the LCA
|
||||||
|
#define CAA(x) 8(x)
|
||||||
|
#define CEECAATHDID(x) 976(x) // in the CAA
|
||||||
|
#define EDCHPXV(x) 1016(x) // in the CAA
|
||||||
|
#define GOCB(x) 1104(x) // in the CAA
|
||||||
|
|
||||||
// SS_*, where x=SAVSTACK_ASYNC
|
// SS_*, where x=SAVSTACK_ASYNC
|
||||||
#define SS_LE(x) 0(x)
|
#define SS_LE(x) 0(x)
|
||||||
|
@ -19,7 +21,30 @@
|
||||||
#define SS_ERRNO(x) 16(x)
|
#define SS_ERRNO(x) 16(x)
|
||||||
#define SS_ERRNOJR(x) 20(x)
|
#define SS_ERRNOJR(x) 20(x)
|
||||||
|
|
||||||
#define LE_CALL BYTE $0x0D; BYTE $0x76; // BL R7, R6
|
// Function Descriptor Offsets
|
||||||
|
#define __errno 0x156*16
|
||||||
|
#define __err2ad 0x16C*16
|
||||||
|
|
||||||
|
// Call Instructions
|
||||||
|
#define LE_CALL BYTE $0x0D; BYTE $0x76 // BL R7, R6
|
||||||
|
#define SVC_LOAD BYTE $0x0A; BYTE $0x08 // SVC 08 LOAD
|
||||||
|
#define SVC_DELETE BYTE $0x0A; BYTE $0x09 // SVC 09 DELETE
|
||||||
|
|
||||||
|
DATA zosLibVec<>(SB)/8, $0
|
||||||
|
GLOBL zosLibVec<>(SB), NOPTR, $8
|
||||||
|
|
||||||
|
TEXT ·initZosLibVec(SB), NOSPLIT|NOFRAME, $0-0
|
||||||
|
MOVW PSALAA, R8
|
||||||
|
MOVD LCA64(R8), R8
|
||||||
|
MOVD CAA(R8), R8
|
||||||
|
MOVD EDCHPXV(R8), R8
|
||||||
|
MOVD R8, zosLibVec<>(SB)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·GetZosLibVec(SB), NOSPLIT|NOFRAME, $0-0
|
||||||
|
MOVD zosLibVec<>(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
TEXT ·clearErrno(SB), NOSPLIT, $0-0
|
TEXT ·clearErrno(SB), NOSPLIT, $0-0
|
||||||
BL addrerrno<>(SB)
|
BL addrerrno<>(SB)
|
||||||
|
@ -35,7 +60,7 @@ TEXT addrerrno<>(SB),NOSPLIT|NOFRAME,$0-0
|
||||||
// Get __errno FuncDesc.
|
// Get __errno FuncDesc.
|
||||||
MOVD CAA(R8), R9
|
MOVD CAA(R8), R9
|
||||||
MOVD EDCHPXV(R9), R9
|
MOVD EDCHPXV(R9), R9
|
||||||
ADD $(0x156*16), R9
|
ADD $(__errno), R9
|
||||||
LMG 0(R9), R5, R6
|
LMG 0(R9), R5, R6
|
||||||
|
|
||||||
// Switch to saved LE stack.
|
// Switch to saved LE stack.
|
||||||
|
@ -52,296 +77,6 @@ TEXT addrerrno<>(SB),NOSPLIT|NOFRAME,$0-0
|
||||||
MOVD R4, 0(R9) // Save stack pointer.
|
MOVD R4, 0(R9) // Save stack pointer.
|
||||||
RET
|
RET
|
||||||
|
|
||||||
TEXT ·syscall_syscall(SB),NOSPLIT,$0-56
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVD a1+8(FP), R1
|
|
||||||
MOVD a2+16(FP), R2
|
|
||||||
MOVD a3+24(FP), R3
|
|
||||||
|
|
||||||
// Get library control area (LCA).
|
|
||||||
MOVW PSALAA, R8
|
|
||||||
MOVD LCA64(R8), R8
|
|
||||||
|
|
||||||
// Get function.
|
|
||||||
MOVD CAA(R8), R9
|
|
||||||
MOVD EDCHPXV(R9), R9
|
|
||||||
MOVD trap+0(FP), R5
|
|
||||||
SLD $4, R5
|
|
||||||
ADD R5, R9
|
|
||||||
LMG 0(R9), R5, R6
|
|
||||||
|
|
||||||
// Restore LE stack.
|
|
||||||
MOVD SAVSTACK_ASYNC(R8), R9
|
|
||||||
MOVD 0(R9), R4
|
|
||||||
MOVD $0, 0(R9)
|
|
||||||
|
|
||||||
// Call function.
|
|
||||||
LE_CALL
|
|
||||||
NOPH
|
|
||||||
XOR R0, R0 // Restore R0 to $0.
|
|
||||||
MOVD R4, 0(R9) // Save stack pointer.
|
|
||||||
|
|
||||||
MOVD R3, r1+32(FP)
|
|
||||||
MOVD R0, r2+40(FP)
|
|
||||||
MOVD R0, err+48(FP)
|
|
||||||
MOVW R3, R4
|
|
||||||
CMP R4, $-1
|
|
||||||
BNE done
|
|
||||||
BL addrerrno<>(SB)
|
|
||||||
MOVWZ 0(R3), R3
|
|
||||||
MOVD R3, err+48(FP)
|
|
||||||
done:
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·syscall_rawsyscall(SB),NOSPLIT,$0-56
|
|
||||||
MOVD a1+8(FP), R1
|
|
||||||
MOVD a2+16(FP), R2
|
|
||||||
MOVD a3+24(FP), R3
|
|
||||||
|
|
||||||
// Get library control area (LCA).
|
|
||||||
MOVW PSALAA, R8
|
|
||||||
MOVD LCA64(R8), R8
|
|
||||||
|
|
||||||
// Get function.
|
|
||||||
MOVD CAA(R8), R9
|
|
||||||
MOVD EDCHPXV(R9), R9
|
|
||||||
MOVD trap+0(FP), R5
|
|
||||||
SLD $4, R5
|
|
||||||
ADD R5, R9
|
|
||||||
LMG 0(R9), R5, R6
|
|
||||||
|
|
||||||
// Restore LE stack.
|
|
||||||
MOVD SAVSTACK_ASYNC(R8), R9
|
|
||||||
MOVD 0(R9), R4
|
|
||||||
MOVD $0, 0(R9)
|
|
||||||
|
|
||||||
// Call function.
|
|
||||||
LE_CALL
|
|
||||||
NOPH
|
|
||||||
XOR R0, R0 // Restore R0 to $0.
|
|
||||||
MOVD R4, 0(R9) // Save stack pointer.
|
|
||||||
|
|
||||||
MOVD R3, r1+32(FP)
|
|
||||||
MOVD R0, r2+40(FP)
|
|
||||||
MOVD R0, err+48(FP)
|
|
||||||
MOVW R3, R4
|
|
||||||
CMP R4, $-1
|
|
||||||
BNE done
|
|
||||||
BL addrerrno<>(SB)
|
|
||||||
MOVWZ 0(R3), R3
|
|
||||||
MOVD R3, err+48(FP)
|
|
||||||
done:
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·syscall_syscall6(SB),NOSPLIT,$0-80
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVD a1+8(FP), R1
|
|
||||||
MOVD a2+16(FP), R2
|
|
||||||
MOVD a3+24(FP), R3
|
|
||||||
|
|
||||||
// Get library control area (LCA).
|
|
||||||
MOVW PSALAA, R8
|
|
||||||
MOVD LCA64(R8), R8
|
|
||||||
|
|
||||||
// Get function.
|
|
||||||
MOVD CAA(R8), R9
|
|
||||||
MOVD EDCHPXV(R9), R9
|
|
||||||
MOVD trap+0(FP), R5
|
|
||||||
SLD $4, R5
|
|
||||||
ADD R5, R9
|
|
||||||
LMG 0(R9), R5, R6
|
|
||||||
|
|
||||||
// Restore LE stack.
|
|
||||||
MOVD SAVSTACK_ASYNC(R8), R9
|
|
||||||
MOVD 0(R9), R4
|
|
||||||
MOVD $0, 0(R9)
|
|
||||||
|
|
||||||
// Fill in parameter list.
|
|
||||||
MOVD a4+32(FP), R12
|
|
||||||
MOVD R12, (2176+24)(R4)
|
|
||||||
MOVD a5+40(FP), R12
|
|
||||||
MOVD R12, (2176+32)(R4)
|
|
||||||
MOVD a6+48(FP), R12
|
|
||||||
MOVD R12, (2176+40)(R4)
|
|
||||||
|
|
||||||
// Call function.
|
|
||||||
LE_CALL
|
|
||||||
NOPH
|
|
||||||
XOR R0, R0 // Restore R0 to $0.
|
|
||||||
MOVD R4, 0(R9) // Save stack pointer.
|
|
||||||
|
|
||||||
MOVD R3, r1+56(FP)
|
|
||||||
MOVD R0, r2+64(FP)
|
|
||||||
MOVD R0, err+72(FP)
|
|
||||||
MOVW R3, R4
|
|
||||||
CMP R4, $-1
|
|
||||||
BNE done
|
|
||||||
BL addrerrno<>(SB)
|
|
||||||
MOVWZ 0(R3), R3
|
|
||||||
MOVD R3, err+72(FP)
|
|
||||||
done:
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·syscall_rawsyscall6(SB),NOSPLIT,$0-80
|
|
||||||
MOVD a1+8(FP), R1
|
|
||||||
MOVD a2+16(FP), R2
|
|
||||||
MOVD a3+24(FP), R3
|
|
||||||
|
|
||||||
// Get library control area (LCA).
|
|
||||||
MOVW PSALAA, R8
|
|
||||||
MOVD LCA64(R8), R8
|
|
||||||
|
|
||||||
// Get function.
|
|
||||||
MOVD CAA(R8), R9
|
|
||||||
MOVD EDCHPXV(R9), R9
|
|
||||||
MOVD trap+0(FP), R5
|
|
||||||
SLD $4, R5
|
|
||||||
ADD R5, R9
|
|
||||||
LMG 0(R9), R5, R6
|
|
||||||
|
|
||||||
// Restore LE stack.
|
|
||||||
MOVD SAVSTACK_ASYNC(R8), R9
|
|
||||||
MOVD 0(R9), R4
|
|
||||||
MOVD $0, 0(R9)
|
|
||||||
|
|
||||||
// Fill in parameter list.
|
|
||||||
MOVD a4+32(FP), R12
|
|
||||||
MOVD R12, (2176+24)(R4)
|
|
||||||
MOVD a5+40(FP), R12
|
|
||||||
MOVD R12, (2176+32)(R4)
|
|
||||||
MOVD a6+48(FP), R12
|
|
||||||
MOVD R12, (2176+40)(R4)
|
|
||||||
|
|
||||||
// Call function.
|
|
||||||
LE_CALL
|
|
||||||
NOPH
|
|
||||||
XOR R0, R0 // Restore R0 to $0.
|
|
||||||
MOVD R4, 0(R9) // Save stack pointer.
|
|
||||||
|
|
||||||
MOVD R3, r1+56(FP)
|
|
||||||
MOVD R0, r2+64(FP)
|
|
||||||
MOVD R0, err+72(FP)
|
|
||||||
MOVW R3, R4
|
|
||||||
CMP R4, $-1
|
|
||||||
BNE done
|
|
||||||
BL ·rrno<>(SB)
|
|
||||||
MOVWZ 0(R3), R3
|
|
||||||
MOVD R3, err+72(FP)
|
|
||||||
done:
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·syscall_syscall9(SB),NOSPLIT,$0
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVD a1+8(FP), R1
|
|
||||||
MOVD a2+16(FP), R2
|
|
||||||
MOVD a3+24(FP), R3
|
|
||||||
|
|
||||||
// Get library control area (LCA).
|
|
||||||
MOVW PSALAA, R8
|
|
||||||
MOVD LCA64(R8), R8
|
|
||||||
|
|
||||||
// Get function.
|
|
||||||
MOVD CAA(R8), R9
|
|
||||||
MOVD EDCHPXV(R9), R9
|
|
||||||
MOVD trap+0(FP), R5
|
|
||||||
SLD $4, R5
|
|
||||||
ADD R5, R9
|
|
||||||
LMG 0(R9), R5, R6
|
|
||||||
|
|
||||||
// Restore LE stack.
|
|
||||||
MOVD SAVSTACK_ASYNC(R8), R9
|
|
||||||
MOVD 0(R9), R4
|
|
||||||
MOVD $0, 0(R9)
|
|
||||||
|
|
||||||
// Fill in parameter list.
|
|
||||||
MOVD a4+32(FP), R12
|
|
||||||
MOVD R12, (2176+24)(R4)
|
|
||||||
MOVD a5+40(FP), R12
|
|
||||||
MOVD R12, (2176+32)(R4)
|
|
||||||
MOVD a6+48(FP), R12
|
|
||||||
MOVD R12, (2176+40)(R4)
|
|
||||||
MOVD a7+56(FP), R12
|
|
||||||
MOVD R12, (2176+48)(R4)
|
|
||||||
MOVD a8+64(FP), R12
|
|
||||||
MOVD R12, (2176+56)(R4)
|
|
||||||
MOVD a9+72(FP), R12
|
|
||||||
MOVD R12, (2176+64)(R4)
|
|
||||||
|
|
||||||
// Call function.
|
|
||||||
LE_CALL
|
|
||||||
NOPH
|
|
||||||
XOR R0, R0 // Restore R0 to $0.
|
|
||||||
MOVD R4, 0(R9) // Save stack pointer.
|
|
||||||
|
|
||||||
MOVD R3, r1+80(FP)
|
|
||||||
MOVD R0, r2+88(FP)
|
|
||||||
MOVD R0, err+96(FP)
|
|
||||||
MOVW R3, R4
|
|
||||||
CMP R4, $-1
|
|
||||||
BNE done
|
|
||||||
BL addrerrno<>(SB)
|
|
||||||
MOVWZ 0(R3), R3
|
|
||||||
MOVD R3, err+96(FP)
|
|
||||||
done:
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·syscall_rawsyscall9(SB),NOSPLIT,$0
|
|
||||||
MOVD a1+8(FP), R1
|
|
||||||
MOVD a2+16(FP), R2
|
|
||||||
MOVD a3+24(FP), R3
|
|
||||||
|
|
||||||
// Get library control area (LCA).
|
|
||||||
MOVW PSALAA, R8
|
|
||||||
MOVD LCA64(R8), R8
|
|
||||||
|
|
||||||
// Get function.
|
|
||||||
MOVD CAA(R8), R9
|
|
||||||
MOVD EDCHPXV(R9), R9
|
|
||||||
MOVD trap+0(FP), R5
|
|
||||||
SLD $4, R5
|
|
||||||
ADD R5, R9
|
|
||||||
LMG 0(R9), R5, R6
|
|
||||||
|
|
||||||
// Restore LE stack.
|
|
||||||
MOVD SAVSTACK_ASYNC(R8), R9
|
|
||||||
MOVD 0(R9), R4
|
|
||||||
MOVD $0, 0(R9)
|
|
||||||
|
|
||||||
// Fill in parameter list.
|
|
||||||
MOVD a4+32(FP), R12
|
|
||||||
MOVD R12, (2176+24)(R4)
|
|
||||||
MOVD a5+40(FP), R12
|
|
||||||
MOVD R12, (2176+32)(R4)
|
|
||||||
MOVD a6+48(FP), R12
|
|
||||||
MOVD R12, (2176+40)(R4)
|
|
||||||
MOVD a7+56(FP), R12
|
|
||||||
MOVD R12, (2176+48)(R4)
|
|
||||||
MOVD a8+64(FP), R12
|
|
||||||
MOVD R12, (2176+56)(R4)
|
|
||||||
MOVD a9+72(FP), R12
|
|
||||||
MOVD R12, (2176+64)(R4)
|
|
||||||
|
|
||||||
// Call function.
|
|
||||||
LE_CALL
|
|
||||||
NOPH
|
|
||||||
XOR R0, R0 // Restore R0 to $0.
|
|
||||||
MOVD R4, 0(R9) // Save stack pointer.
|
|
||||||
|
|
||||||
MOVD R3, r1+80(FP)
|
|
||||||
MOVD R0, r2+88(FP)
|
|
||||||
MOVD R0, err+96(FP)
|
|
||||||
MOVW R3, R4
|
|
||||||
CMP R4, $-1
|
|
||||||
BNE done
|
|
||||||
BL addrerrno<>(SB)
|
|
||||||
MOVWZ 0(R3), R3
|
|
||||||
MOVD R3, err+96(FP)
|
|
||||||
done:
|
|
||||||
RET
|
|
||||||
|
|
||||||
// func svcCall(fnptr unsafe.Pointer, argv *unsafe.Pointer, dsa *uint64)
|
// func svcCall(fnptr unsafe.Pointer, argv *unsafe.Pointer, dsa *uint64)
|
||||||
TEXT ·svcCall(SB), NOSPLIT, $0
|
TEXT ·svcCall(SB), NOSPLIT, $0
|
||||||
BL runtime·save_g(SB) // Save g and stack pointer
|
BL runtime·save_g(SB) // Save g and stack pointer
|
||||||
|
@ -371,8 +106,7 @@ TEXT ·svcLoad(SB),NOSPLIT,$0
|
||||||
MOVD name+0(FP), R0 // Move SVC args into registers
|
MOVD name+0(FP), R0 // Move SVC args into registers
|
||||||
MOVD $0x80000000, R1
|
MOVD $0x80000000, R1
|
||||||
MOVD $0, R15
|
MOVD $0, R15
|
||||||
BYTE $0x0A // SVC 08 LOAD
|
SVC_LOAD
|
||||||
BYTE $0x08
|
|
||||||
MOVW R15, R3 // Save return code from SVC
|
MOVW R15, R3 // Save return code from SVC
|
||||||
MOVD R2, R15 // Restore go stack pointer
|
MOVD R2, R15 // Restore go stack pointer
|
||||||
CMP R3, $0 // Check SVC return code
|
CMP R3, $0 // Check SVC return code
|
||||||
|
@ -380,18 +114,18 @@ TEXT ·svcLoad(SB),NOSPLIT,$0
|
||||||
|
|
||||||
MOVD $-2, R3 // Reset last bit of entry point to zero
|
MOVD $-2, R3 // Reset last bit of entry point to zero
|
||||||
AND R0, R3
|
AND R0, R3
|
||||||
MOVD R3, addr+8(FP) // Return entry point returned by SVC
|
MOVD R3, ret+8(FP) // Return entry point returned by SVC
|
||||||
CMP R0, R3 // Check if last bit of entry point was set
|
CMP R0, R3 // Check if last bit of entry point was set
|
||||||
BNE done
|
BNE done
|
||||||
|
|
||||||
MOVD R15, R2 // Save go stack pointer
|
MOVD R15, R2 // Save go stack pointer
|
||||||
MOVD $0, R15 // Move SVC args into registers (entry point still in r0 from SVC 08)
|
MOVD $0, R15 // Move SVC args into registers (entry point still in r0 from SVC 08)
|
||||||
BYTE $0x0A // SVC 09 DELETE
|
SVC_DELETE
|
||||||
BYTE $0x09
|
|
||||||
MOVD R2, R15 // Restore go stack pointer
|
MOVD R2, R15 // Restore go stack pointer
|
||||||
|
|
||||||
error:
|
error:
|
||||||
MOVD $0, addr+8(FP) // Return 0 on failure
|
MOVD $0, ret+8(FP) // Return 0 on failure
|
||||||
|
|
||||||
done:
|
done:
|
||||||
XOR R0, R0 // Reset r0 to 0
|
XOR R0, R0 // Reset r0 to 0
|
||||||
RET
|
RET
|
||||||
|
@ -400,13 +134,12 @@ done:
|
||||||
TEXT ·svcUnload(SB), NOSPLIT, $0
|
TEXT ·svcUnload(SB), NOSPLIT, $0
|
||||||
MOVD R15, R2 // Save go stack pointer
|
MOVD R15, R2 // Save go stack pointer
|
||||||
MOVD name+0(FP), R0 // Move SVC args into registers
|
MOVD name+0(FP), R0 // Move SVC args into registers
|
||||||
MOVD addr+8(FP), R15
|
MOVD fnptr+8(FP), R15
|
||||||
BYTE $0x0A // SVC 09
|
SVC_DELETE
|
||||||
BYTE $0x09
|
|
||||||
XOR R0, R0 // Reset r0 to 0
|
XOR R0, R0 // Reset r0 to 0
|
||||||
MOVD R15, R1 // Save SVC return code
|
MOVD R15, R1 // Save SVC return code
|
||||||
MOVD R2, R15 // Restore go stack pointer
|
MOVD R2, R15 // Restore go stack pointer
|
||||||
MOVD R1, rc+0(FP) // Return SVC return code
|
MOVD R1, ret+16(FP) // Return SVC return code
|
||||||
RET
|
RET
|
||||||
|
|
||||||
// func gettid() uint64
|
// func gettid() uint64
|
||||||
|
@ -417,7 +150,233 @@ TEXT ·gettid(SB), NOSPLIT, $0
|
||||||
|
|
||||||
// Get CEECAATHDID
|
// Get CEECAATHDID
|
||||||
MOVD CAA(R8), R9
|
MOVD CAA(R8), R9
|
||||||
MOVD 0x3D0(R9), R9
|
MOVD CEECAATHDID(R9), R9
|
||||||
MOVD R9, ret+0(FP)
|
MOVD R9, ret+0(FP)
|
||||||
|
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
//
|
||||||
|
// Call LE function, if the return is -1
|
||||||
|
// errno and errno2 is retrieved
|
||||||
|
//
|
||||||
|
TEXT ·CallLeFuncWithErr(SB), NOSPLIT, $0
|
||||||
|
MOVW PSALAA, R8
|
||||||
|
MOVD LCA64(R8), R8
|
||||||
|
MOVD CAA(R8), R9
|
||||||
|
MOVD g, GOCB(R9)
|
||||||
|
|
||||||
|
// Restore LE stack.
|
||||||
|
MOVD SAVSTACK_ASYNC(R8), R9 // R9-> LE stack frame saving address
|
||||||
|
MOVD 0(R9), R4 // R4-> restore previously saved stack frame pointer
|
||||||
|
|
||||||
|
MOVD parms_base+8(FP), R7 // R7 -> argument array
|
||||||
|
MOVD parms_len+16(FP), R8 // R8 number of arguments
|
||||||
|
|
||||||
|
// arg 1 ---> R1
|
||||||
|
CMP R8, $0
|
||||||
|
BEQ docall
|
||||||
|
SUB $1, R8
|
||||||
|
MOVD 0(R7), R1
|
||||||
|
|
||||||
|
// arg 2 ---> R2
|
||||||
|
CMP R8, $0
|
||||||
|
BEQ docall
|
||||||
|
SUB $1, R8
|
||||||
|
ADD $8, R7
|
||||||
|
MOVD 0(R7), R2
|
||||||
|
|
||||||
|
// arg 3 --> R3
|
||||||
|
CMP R8, $0
|
||||||
|
BEQ docall
|
||||||
|
SUB $1, R8
|
||||||
|
ADD $8, R7
|
||||||
|
MOVD 0(R7), R3
|
||||||
|
|
||||||
|
CMP R8, $0
|
||||||
|
BEQ docall
|
||||||
|
MOVD $2176+16, R6 // starting LE stack address-8 to store 4th argument
|
||||||
|
|
||||||
|
repeat:
|
||||||
|
ADD $8, R7
|
||||||
|
MOVD 0(R7), R0 // advance arg pointer by 8 byte
|
||||||
|
ADD $8, R6 // advance LE argument address by 8 byte
|
||||||
|
MOVD R0, (R4)(R6*1) // copy argument from go-slice to le-frame
|
||||||
|
SUB $1, R8
|
||||||
|
CMP R8, $0
|
||||||
|
BNE repeat
|
||||||
|
|
||||||
|
docall:
|
||||||
|
MOVD funcdesc+0(FP), R8 // R8-> function descriptor
|
||||||
|
LMG 0(R8), R5, R6
|
||||||
|
MOVD $0, 0(R9) // R9 address of SAVSTACK_ASYNC
|
||||||
|
LE_CALL // balr R7, R6 (return #1)
|
||||||
|
NOPH
|
||||||
|
MOVD R3, ret+32(FP)
|
||||||
|
CMP R3, $-1 // compare result to -1
|
||||||
|
BNE done
|
||||||
|
|
||||||
|
// retrieve errno and errno2
|
||||||
|
MOVD zosLibVec<>(SB), R8
|
||||||
|
ADD $(__errno), R8
|
||||||
|
LMG 0(R8), R5, R6
|
||||||
|
LE_CALL // balr R7, R6 __errno (return #3)
|
||||||
|
NOPH
|
||||||
|
MOVWZ 0(R3), R3
|
||||||
|
MOVD R3, err+48(FP)
|
||||||
|
MOVD zosLibVec<>(SB), R8
|
||||||
|
ADD $(__err2ad), R8
|
||||||
|
LMG 0(R8), R5, R6
|
||||||
|
LE_CALL // balr R7, R6 __err2ad (return #2)
|
||||||
|
NOPH
|
||||||
|
MOVW (R3), R2 // retrieve errno2
|
||||||
|
MOVD R2, errno2+40(FP) // store in return area
|
||||||
|
|
||||||
|
done:
|
||||||
|
MOVD R4, 0(R9) // Save stack pointer.
|
||||||
|
RET
|
||||||
|
|
||||||
|
//
|
||||||
|
// Call LE function, if the return is 0
|
||||||
|
// errno and errno2 is retrieved
|
||||||
|
//
|
||||||
|
TEXT ·CallLeFuncWithPtrReturn(SB), NOSPLIT, $0
|
||||||
|
MOVW PSALAA, R8
|
||||||
|
MOVD LCA64(R8), R8
|
||||||
|
MOVD CAA(R8), R9
|
||||||
|
MOVD g, GOCB(R9)
|
||||||
|
|
||||||
|
// Restore LE stack.
|
||||||
|
MOVD SAVSTACK_ASYNC(R8), R9 // R9-> LE stack frame saving address
|
||||||
|
MOVD 0(R9), R4 // R4-> restore previously saved stack frame pointer
|
||||||
|
|
||||||
|
MOVD parms_base+8(FP), R7 // R7 -> argument array
|
||||||
|
MOVD parms_len+16(FP), R8 // R8 number of arguments
|
||||||
|
|
||||||
|
// arg 1 ---> R1
|
||||||
|
CMP R8, $0
|
||||||
|
BEQ docall
|
||||||
|
SUB $1, R8
|
||||||
|
MOVD 0(R7), R1
|
||||||
|
|
||||||
|
// arg 2 ---> R2
|
||||||
|
CMP R8, $0
|
||||||
|
BEQ docall
|
||||||
|
SUB $1, R8
|
||||||
|
ADD $8, R7
|
||||||
|
MOVD 0(R7), R2
|
||||||
|
|
||||||
|
// arg 3 --> R3
|
||||||
|
CMP R8, $0
|
||||||
|
BEQ docall
|
||||||
|
SUB $1, R8
|
||||||
|
ADD $8, R7
|
||||||
|
MOVD 0(R7), R3
|
||||||
|
|
||||||
|
CMP R8, $0
|
||||||
|
BEQ docall
|
||||||
|
MOVD $2176+16, R6 // starting LE stack address-8 to store 4th argument
|
||||||
|
|
||||||
|
repeat:
|
||||||
|
ADD $8, R7
|
||||||
|
MOVD 0(R7), R0 // advance arg pointer by 8 byte
|
||||||
|
ADD $8, R6 // advance LE argument address by 8 byte
|
||||||
|
MOVD R0, (R4)(R6*1) // copy argument from go-slice to le-frame
|
||||||
|
SUB $1, R8
|
||||||
|
CMP R8, $0
|
||||||
|
BNE repeat
|
||||||
|
|
||||||
|
docall:
|
||||||
|
MOVD funcdesc+0(FP), R8 // R8-> function descriptor
|
||||||
|
LMG 0(R8), R5, R6
|
||||||
|
MOVD $0, 0(R9) // R9 address of SAVSTACK_ASYNC
|
||||||
|
LE_CALL // balr R7, R6 (return #1)
|
||||||
|
NOPH
|
||||||
|
MOVD R3, ret+32(FP)
|
||||||
|
CMP R3, $0 // compare result to 0
|
||||||
|
BNE done
|
||||||
|
|
||||||
|
// retrieve errno and errno2
|
||||||
|
MOVD zosLibVec<>(SB), R8
|
||||||
|
ADD $(__errno), R8
|
||||||
|
LMG 0(R8), R5, R6
|
||||||
|
LE_CALL // balr R7, R6 __errno (return #3)
|
||||||
|
NOPH
|
||||||
|
MOVWZ 0(R3), R3
|
||||||
|
MOVD R3, err+48(FP)
|
||||||
|
MOVD zosLibVec<>(SB), R8
|
||||||
|
ADD $(__err2ad), R8
|
||||||
|
LMG 0(R8), R5, R6
|
||||||
|
LE_CALL // balr R7, R6 __err2ad (return #2)
|
||||||
|
NOPH
|
||||||
|
MOVW (R3), R2 // retrieve errno2
|
||||||
|
MOVD R2, errno2+40(FP) // store in return area
|
||||||
|
XOR R2, R2
|
||||||
|
MOVWZ R2, (R3) // clear errno2
|
||||||
|
|
||||||
|
done:
|
||||||
|
MOVD R4, 0(R9) // Save stack pointer.
|
||||||
|
RET
|
||||||
|
|
||||||
|
//
|
||||||
|
// function to test if a pointer can be safely dereferenced (content read)
|
||||||
|
// return 0 for succces
|
||||||
|
//
|
||||||
|
TEXT ·ptrtest(SB), NOSPLIT, $0-16
|
||||||
|
MOVD arg+0(FP), R10 // test pointer in R10
|
||||||
|
|
||||||
|
// set up R2 to point to CEECAADMC
|
||||||
|
BYTE $0xE3; BYTE $0x20; BYTE $0x04; BYTE $0xB8; BYTE $0x00; BYTE $0x17 // llgt 2,1208
|
||||||
|
BYTE $0xB9; BYTE $0x17; BYTE $0x00; BYTE $0x22 // llgtr 2,2
|
||||||
|
BYTE $0xA5; BYTE $0x26; BYTE $0x7F; BYTE $0xFF // nilh 2,32767
|
||||||
|
BYTE $0xE3; BYTE $0x22; BYTE $0x00; BYTE $0x58; BYTE $0x00; BYTE $0x04 // lg 2,88(2)
|
||||||
|
BYTE $0xE3; BYTE $0x22; BYTE $0x00; BYTE $0x08; BYTE $0x00; BYTE $0x04 // lg 2,8(2)
|
||||||
|
BYTE $0x41; BYTE $0x22; BYTE $0x03; BYTE $0x68 // la 2,872(2)
|
||||||
|
|
||||||
|
// set up R5 to point to the "shunt" path which set 1 to R3 (failure)
|
||||||
|
BYTE $0xB9; BYTE $0x82; BYTE $0x00; BYTE $0x33 // xgr 3,3
|
||||||
|
BYTE $0xA7; BYTE $0x55; BYTE $0x00; BYTE $0x04 // bras 5,lbl1
|
||||||
|
BYTE $0xA7; BYTE $0x39; BYTE $0x00; BYTE $0x01 // lghi 3,1
|
||||||
|
|
||||||
|
// if r3 is not zero (failed) then branch to finish
|
||||||
|
BYTE $0xB9; BYTE $0x02; BYTE $0x00; BYTE $0x33 // lbl1 ltgr 3,3
|
||||||
|
BYTE $0xA7; BYTE $0x74; BYTE $0x00; BYTE $0x08 // brc b'0111',lbl2
|
||||||
|
|
||||||
|
// stomic store shunt address in R5 into CEECAADMC
|
||||||
|
BYTE $0xE3; BYTE $0x52; BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x24 // stg 5,0(2)
|
||||||
|
|
||||||
|
// now try reading from the test pointer in R10, if it fails it branches to the "lghi" instruction above
|
||||||
|
BYTE $0xE3; BYTE $0x9A; BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x04 // lg 9,0(10)
|
||||||
|
|
||||||
|
// finish here, restore 0 into CEECAADMC
|
||||||
|
BYTE $0xB9; BYTE $0x82; BYTE $0x00; BYTE $0x99 // lbl2 xgr 9,9
|
||||||
|
BYTE $0xE3; BYTE $0x92; BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x24 // stg 9,0(2)
|
||||||
|
MOVD R3, ret+8(FP) // result in R3
|
||||||
|
RET
|
||||||
|
|
||||||
|
//
|
||||||
|
// function to test if a untptr can be loaded from a pointer
|
||||||
|
// return 1: the 8-byte content
|
||||||
|
// 2: 0 for success, 1 for failure
|
||||||
|
//
|
||||||
|
// func safeload(ptr uintptr) ( value uintptr, error uintptr)
|
||||||
|
TEXT ·safeload(SB), NOSPLIT, $0-24
|
||||||
|
MOVD ptr+0(FP), R10 // test pointer in R10
|
||||||
|
MOVD $0x0, R6
|
||||||
|
BYTE $0xE3; BYTE $0x20; BYTE $0x04; BYTE $0xB8; BYTE $0x00; BYTE $0x17 // llgt 2,1208
|
||||||
|
BYTE $0xB9; BYTE $0x17; BYTE $0x00; BYTE $0x22 // llgtr 2,2
|
||||||
|
BYTE $0xA5; BYTE $0x26; BYTE $0x7F; BYTE $0xFF // nilh 2,32767
|
||||||
|
BYTE $0xE3; BYTE $0x22; BYTE $0x00; BYTE $0x58; BYTE $0x00; BYTE $0x04 // lg 2,88(2)
|
||||||
|
BYTE $0xE3; BYTE $0x22; BYTE $0x00; BYTE $0x08; BYTE $0x00; BYTE $0x04 // lg 2,8(2)
|
||||||
|
BYTE $0x41; BYTE $0x22; BYTE $0x03; BYTE $0x68 // la 2,872(2)
|
||||||
|
BYTE $0xB9; BYTE $0x82; BYTE $0x00; BYTE $0x33 // xgr 3,3
|
||||||
|
BYTE $0xA7; BYTE $0x55; BYTE $0x00; BYTE $0x04 // bras 5,lbl1
|
||||||
|
BYTE $0xA7; BYTE $0x39; BYTE $0x00; BYTE $0x01 // lghi 3,1
|
||||||
|
BYTE $0xB9; BYTE $0x02; BYTE $0x00; BYTE $0x33 // lbl1 ltgr 3,3
|
||||||
|
BYTE $0xA7; BYTE $0x74; BYTE $0x00; BYTE $0x08 // brc b'0111',lbl2
|
||||||
|
BYTE $0xE3; BYTE $0x52; BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x24 // stg 5,0(2)
|
||||||
|
BYTE $0xE3; BYTE $0x6A; BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x04 // lg 6,0(10)
|
||||||
|
BYTE $0xB9; BYTE $0x82; BYTE $0x00; BYTE $0x99 // lbl2 xgr 9,9
|
||||||
|
BYTE $0xE3; BYTE $0x92; BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x24 // stg 9,0(2)
|
||||||
|
MOVD R6, value+8(FP) // result in R6
|
||||||
|
MOVD R3, error+16(FP) // error in R3
|
||||||
|
RET
|
||||||
|
|
|
@ -0,0 +1,657 @@
|
||||||
|
// Copyright 2024 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build zos
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func bpxcall(plist []unsafe.Pointer, bpx_offset int64)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func A2e([]byte)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func E2a([]byte)
|
||||||
|
|
||||||
|
const (
|
||||||
|
BPX4STA = 192 // stat
|
||||||
|
BPX4FST = 104 // fstat
|
||||||
|
BPX4LST = 132 // lstat
|
||||||
|
BPX4OPN = 156 // open
|
||||||
|
BPX4CLO = 72 // close
|
||||||
|
BPX4CHR = 500 // chattr
|
||||||
|
BPX4FCR = 504 // fchattr
|
||||||
|
BPX4LCR = 1180 // lchattr
|
||||||
|
BPX4CTW = 492 // cond_timed_wait
|
||||||
|
BPX4GTH = 1056 // __getthent
|
||||||
|
BPX4PTQ = 412 // pthread_quiesc
|
||||||
|
BPX4PTR = 320 // ptrace
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
//options
|
||||||
|
//byte1
|
||||||
|
BPX_OPNFHIGH = 0x80
|
||||||
|
//byte2
|
||||||
|
BPX_OPNFEXEC = 0x80
|
||||||
|
//byte3
|
||||||
|
BPX_O_NOLARGEFILE = 0x08
|
||||||
|
BPX_O_LARGEFILE = 0x04
|
||||||
|
BPX_O_ASYNCSIG = 0x02
|
||||||
|
BPX_O_SYNC = 0x01
|
||||||
|
//byte4
|
||||||
|
BPX_O_CREXCL = 0xc0
|
||||||
|
BPX_O_CREAT = 0x80
|
||||||
|
BPX_O_EXCL = 0x40
|
||||||
|
BPX_O_NOCTTY = 0x20
|
||||||
|
BPX_O_TRUNC = 0x10
|
||||||
|
BPX_O_APPEND = 0x08
|
||||||
|
BPX_O_NONBLOCK = 0x04
|
||||||
|
BPX_FNDELAY = 0x04
|
||||||
|
BPX_O_RDWR = 0x03
|
||||||
|
BPX_O_RDONLY = 0x02
|
||||||
|
BPX_O_WRONLY = 0x01
|
||||||
|
BPX_O_ACCMODE = 0x03
|
||||||
|
BPX_O_GETFL = 0x0f
|
||||||
|
|
||||||
|
//mode
|
||||||
|
// byte1 (file type)
|
||||||
|
BPX_FT_DIR = 1
|
||||||
|
BPX_FT_CHARSPEC = 2
|
||||||
|
BPX_FT_REGFILE = 3
|
||||||
|
BPX_FT_FIFO = 4
|
||||||
|
BPX_FT_SYMLINK = 5
|
||||||
|
BPX_FT_SOCKET = 6
|
||||||
|
//byte3
|
||||||
|
BPX_S_ISUID = 0x08
|
||||||
|
BPX_S_ISGID = 0x04
|
||||||
|
BPX_S_ISVTX = 0x02
|
||||||
|
BPX_S_IRWXU1 = 0x01
|
||||||
|
BPX_S_IRUSR = 0x01
|
||||||
|
//byte4
|
||||||
|
BPX_S_IRWXU2 = 0xc0
|
||||||
|
BPX_S_IWUSR = 0x80
|
||||||
|
BPX_S_IXUSR = 0x40
|
||||||
|
BPX_S_IRWXG = 0x38
|
||||||
|
BPX_S_IRGRP = 0x20
|
||||||
|
BPX_S_IWGRP = 0x10
|
||||||
|
BPX_S_IXGRP = 0x08
|
||||||
|
BPX_S_IRWXOX = 0x07
|
||||||
|
BPX_S_IROTH = 0x04
|
||||||
|
BPX_S_IWOTH = 0x02
|
||||||
|
BPX_S_IXOTH = 0x01
|
||||||
|
|
||||||
|
CW_INTRPT = 1
|
||||||
|
CW_CONDVAR = 32
|
||||||
|
CW_TIMEOUT = 64
|
||||||
|
|
||||||
|
PGTHA_NEXT = 2
|
||||||
|
PGTHA_CURRENT = 1
|
||||||
|
PGTHA_FIRST = 0
|
||||||
|
PGTHA_LAST = 3
|
||||||
|
PGTHA_PROCESS = 0x80
|
||||||
|
PGTHA_CONTTY = 0x40
|
||||||
|
PGTHA_PATH = 0x20
|
||||||
|
PGTHA_COMMAND = 0x10
|
||||||
|
PGTHA_FILEDATA = 0x08
|
||||||
|
PGTHA_THREAD = 0x04
|
||||||
|
PGTHA_PTAG = 0x02
|
||||||
|
PGTHA_COMMANDLONG = 0x01
|
||||||
|
PGTHA_THREADFAST = 0x80
|
||||||
|
PGTHA_FILEPATH = 0x40
|
||||||
|
PGTHA_THDSIGMASK = 0x20
|
||||||
|
// thread quiece mode
|
||||||
|
QUIESCE_TERM int32 = 1
|
||||||
|
QUIESCE_FORCE int32 = 2
|
||||||
|
QUIESCE_QUERY int32 = 3
|
||||||
|
QUIESCE_FREEZE int32 = 4
|
||||||
|
QUIESCE_UNFREEZE int32 = 5
|
||||||
|
FREEZE_THIS_THREAD int32 = 6
|
||||||
|
FREEZE_EXIT int32 = 8
|
||||||
|
QUIESCE_SRB int32 = 9
|
||||||
|
)
|
||||||
|
|
||||||
|
type Pgtha struct {
|
||||||
|
Pid uint32 // 0
|
||||||
|
Tid0 uint32 // 4
|
||||||
|
Tid1 uint32
|
||||||
|
Accesspid byte // C
|
||||||
|
Accesstid byte // D
|
||||||
|
Accessasid uint16 // E
|
||||||
|
Loginname [8]byte // 10
|
||||||
|
Flag1 byte // 18
|
||||||
|
Flag1b2 byte // 19
|
||||||
|
}
|
||||||
|
|
||||||
|
type Bpxystat_t struct { // DSECT BPXYSTAT
|
||||||
|
St_id [4]uint8 // 0
|
||||||
|
St_length uint16 // 0x4
|
||||||
|
St_version uint16 // 0x6
|
||||||
|
St_mode uint32 // 0x8
|
||||||
|
St_ino uint32 // 0xc
|
||||||
|
St_dev uint32 // 0x10
|
||||||
|
St_nlink uint32 // 0x14
|
||||||
|
St_uid uint32 // 0x18
|
||||||
|
St_gid uint32 // 0x1c
|
||||||
|
St_size uint64 // 0x20
|
||||||
|
St_atime uint32 // 0x28
|
||||||
|
St_mtime uint32 // 0x2c
|
||||||
|
St_ctime uint32 // 0x30
|
||||||
|
St_rdev uint32 // 0x34
|
||||||
|
St_auditoraudit uint32 // 0x38
|
||||||
|
St_useraudit uint32 // 0x3c
|
||||||
|
St_blksize uint32 // 0x40
|
||||||
|
St_createtime uint32 // 0x44
|
||||||
|
St_auditid [4]uint32 // 0x48
|
||||||
|
St_res01 uint32 // 0x58
|
||||||
|
Ft_ccsid uint16 // 0x5c
|
||||||
|
Ft_flags uint16 // 0x5e
|
||||||
|
St_res01a [2]uint32 // 0x60
|
||||||
|
St_res02 uint32 // 0x68
|
||||||
|
St_blocks uint32 // 0x6c
|
||||||
|
St_opaque [3]uint8 // 0x70
|
||||||
|
St_visible uint8 // 0x73
|
||||||
|
St_reftime uint32 // 0x74
|
||||||
|
St_fid uint64 // 0x78
|
||||||
|
St_filefmt uint8 // 0x80
|
||||||
|
St_fspflag2 uint8 // 0x81
|
||||||
|
St_res03 [2]uint8 // 0x82
|
||||||
|
St_ctimemsec uint32 // 0x84
|
||||||
|
St_seclabel [8]uint8 // 0x88
|
||||||
|
St_res04 [4]uint8 // 0x90
|
||||||
|
// end of version 1
|
||||||
|
_ uint32 // 0x94
|
||||||
|
St_atime64 uint64 // 0x98
|
||||||
|
St_mtime64 uint64 // 0xa0
|
||||||
|
St_ctime64 uint64 // 0xa8
|
||||||
|
St_createtime64 uint64 // 0xb0
|
||||||
|
St_reftime64 uint64 // 0xb8
|
||||||
|
_ uint64 // 0xc0
|
||||||
|
St_res05 [16]uint8 // 0xc8
|
||||||
|
// end of version 2
|
||||||
|
}
|
||||||
|
|
||||||
|
type BpxFilestatus struct {
|
||||||
|
Oflag1 byte
|
||||||
|
Oflag2 byte
|
||||||
|
Oflag3 byte
|
||||||
|
Oflag4 byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type BpxMode struct {
|
||||||
|
Ftype byte
|
||||||
|
Mode1 byte
|
||||||
|
Mode2 byte
|
||||||
|
Mode3 byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// Thr attribute structure for extended attributes
|
||||||
|
type Bpxyatt_t struct { // DSECT BPXYATT
|
||||||
|
Att_id [4]uint8
|
||||||
|
Att_version uint16
|
||||||
|
Att_res01 [2]uint8
|
||||||
|
Att_setflags1 uint8
|
||||||
|
Att_setflags2 uint8
|
||||||
|
Att_setflags3 uint8
|
||||||
|
Att_setflags4 uint8
|
||||||
|
Att_mode uint32
|
||||||
|
Att_uid uint32
|
||||||
|
Att_gid uint32
|
||||||
|
Att_opaquemask [3]uint8
|
||||||
|
Att_visblmaskres uint8
|
||||||
|
Att_opaque [3]uint8
|
||||||
|
Att_visibleres uint8
|
||||||
|
Att_size_h uint32
|
||||||
|
Att_size_l uint32
|
||||||
|
Att_atime uint32
|
||||||
|
Att_mtime uint32
|
||||||
|
Att_auditoraudit uint32
|
||||||
|
Att_useraudit uint32
|
||||||
|
Att_ctime uint32
|
||||||
|
Att_reftime uint32
|
||||||
|
// end of version 1
|
||||||
|
Att_filefmt uint8
|
||||||
|
Att_res02 [3]uint8
|
||||||
|
Att_filetag uint32
|
||||||
|
Att_res03 [8]uint8
|
||||||
|
// end of version 2
|
||||||
|
Att_atime64 uint64
|
||||||
|
Att_mtime64 uint64
|
||||||
|
Att_ctime64 uint64
|
||||||
|
Att_reftime64 uint64
|
||||||
|
Att_seclabel [8]uint8
|
||||||
|
Att_ver3res02 [8]uint8
|
||||||
|
// end of version 3
|
||||||
|
}
|
||||||
|
|
||||||
|
func BpxOpen(name string, options *BpxFilestatus, mode *BpxMode) (rv int32, rc int32, rn int32) {
|
||||||
|
if len(name) < 1024 {
|
||||||
|
var namebuf [1024]byte
|
||||||
|
sz := int32(copy(namebuf[:], name))
|
||||||
|
A2e(namebuf[:sz])
|
||||||
|
var parms [7]unsafe.Pointer
|
||||||
|
parms[0] = unsafe.Pointer(&sz)
|
||||||
|
parms[1] = unsafe.Pointer(&namebuf[0])
|
||||||
|
parms[2] = unsafe.Pointer(options)
|
||||||
|
parms[3] = unsafe.Pointer(mode)
|
||||||
|
parms[4] = unsafe.Pointer(&rv)
|
||||||
|
parms[5] = unsafe.Pointer(&rc)
|
||||||
|
parms[6] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4OPN)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
return -1, -1, -1
|
||||||
|
}
|
||||||
|
|
||||||
|
func BpxClose(fd int32) (rv int32, rc int32, rn int32) {
|
||||||
|
var parms [4]unsafe.Pointer
|
||||||
|
parms[0] = unsafe.Pointer(&fd)
|
||||||
|
parms[1] = unsafe.Pointer(&rv)
|
||||||
|
parms[2] = unsafe.Pointer(&rc)
|
||||||
|
parms[3] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4CLO)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
|
||||||
|
func BpxFileFStat(fd int32, st *Bpxystat_t) (rv int32, rc int32, rn int32) {
|
||||||
|
st.St_id = [4]uint8{0xe2, 0xe3, 0xc1, 0xe3}
|
||||||
|
st.St_version = 2
|
||||||
|
stat_sz := uint32(unsafe.Sizeof(*st))
|
||||||
|
var parms [6]unsafe.Pointer
|
||||||
|
parms[0] = unsafe.Pointer(&fd)
|
||||||
|
parms[1] = unsafe.Pointer(&stat_sz)
|
||||||
|
parms[2] = unsafe.Pointer(st)
|
||||||
|
parms[3] = unsafe.Pointer(&rv)
|
||||||
|
parms[4] = unsafe.Pointer(&rc)
|
||||||
|
parms[5] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4FST)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
|
||||||
|
func BpxFileStat(name string, st *Bpxystat_t) (rv int32, rc int32, rn int32) {
|
||||||
|
if len(name) < 1024 {
|
||||||
|
var namebuf [1024]byte
|
||||||
|
sz := int32(copy(namebuf[:], name))
|
||||||
|
A2e(namebuf[:sz])
|
||||||
|
st.St_id = [4]uint8{0xe2, 0xe3, 0xc1, 0xe3}
|
||||||
|
st.St_version = 2
|
||||||
|
stat_sz := uint32(unsafe.Sizeof(*st))
|
||||||
|
var parms [7]unsafe.Pointer
|
||||||
|
parms[0] = unsafe.Pointer(&sz)
|
||||||
|
parms[1] = unsafe.Pointer(&namebuf[0])
|
||||||
|
parms[2] = unsafe.Pointer(&stat_sz)
|
||||||
|
parms[3] = unsafe.Pointer(st)
|
||||||
|
parms[4] = unsafe.Pointer(&rv)
|
||||||
|
parms[5] = unsafe.Pointer(&rc)
|
||||||
|
parms[6] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4STA)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
return -1, -1, -1
|
||||||
|
}
|
||||||
|
|
||||||
|
func BpxFileLStat(name string, st *Bpxystat_t) (rv int32, rc int32, rn int32) {
|
||||||
|
if len(name) < 1024 {
|
||||||
|
var namebuf [1024]byte
|
||||||
|
sz := int32(copy(namebuf[:], name))
|
||||||
|
A2e(namebuf[:sz])
|
||||||
|
st.St_id = [4]uint8{0xe2, 0xe3, 0xc1, 0xe3}
|
||||||
|
st.St_version = 2
|
||||||
|
stat_sz := uint32(unsafe.Sizeof(*st))
|
||||||
|
var parms [7]unsafe.Pointer
|
||||||
|
parms[0] = unsafe.Pointer(&sz)
|
||||||
|
parms[1] = unsafe.Pointer(&namebuf[0])
|
||||||
|
parms[2] = unsafe.Pointer(&stat_sz)
|
||||||
|
parms[3] = unsafe.Pointer(st)
|
||||||
|
parms[4] = unsafe.Pointer(&rv)
|
||||||
|
parms[5] = unsafe.Pointer(&rc)
|
||||||
|
parms[6] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4LST)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
return -1, -1, -1
|
||||||
|
}
|
||||||
|
|
||||||
|
func BpxChattr(path string, attr *Bpxyatt_t) (rv int32, rc int32, rn int32) {
|
||||||
|
if len(path) >= 1024 {
|
||||||
|
return -1, -1, -1
|
||||||
|
}
|
||||||
|
var namebuf [1024]byte
|
||||||
|
sz := int32(copy(namebuf[:], path))
|
||||||
|
A2e(namebuf[:sz])
|
||||||
|
attr_sz := uint32(unsafe.Sizeof(*attr))
|
||||||
|
var parms [7]unsafe.Pointer
|
||||||
|
parms[0] = unsafe.Pointer(&sz)
|
||||||
|
parms[1] = unsafe.Pointer(&namebuf[0])
|
||||||
|
parms[2] = unsafe.Pointer(&attr_sz)
|
||||||
|
parms[3] = unsafe.Pointer(attr)
|
||||||
|
parms[4] = unsafe.Pointer(&rv)
|
||||||
|
parms[5] = unsafe.Pointer(&rc)
|
||||||
|
parms[6] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4CHR)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
|
||||||
|
func BpxLchattr(path string, attr *Bpxyatt_t) (rv int32, rc int32, rn int32) {
|
||||||
|
if len(path) >= 1024 {
|
||||||
|
return -1, -1, -1
|
||||||
|
}
|
||||||
|
var namebuf [1024]byte
|
||||||
|
sz := int32(copy(namebuf[:], path))
|
||||||
|
A2e(namebuf[:sz])
|
||||||
|
attr_sz := uint32(unsafe.Sizeof(*attr))
|
||||||
|
var parms [7]unsafe.Pointer
|
||||||
|
parms[0] = unsafe.Pointer(&sz)
|
||||||
|
parms[1] = unsafe.Pointer(&namebuf[0])
|
||||||
|
parms[2] = unsafe.Pointer(&attr_sz)
|
||||||
|
parms[3] = unsafe.Pointer(attr)
|
||||||
|
parms[4] = unsafe.Pointer(&rv)
|
||||||
|
parms[5] = unsafe.Pointer(&rc)
|
||||||
|
parms[6] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4LCR)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
|
||||||
|
func BpxFchattr(fd int32, attr *Bpxyatt_t) (rv int32, rc int32, rn int32) {
|
||||||
|
attr_sz := uint32(unsafe.Sizeof(*attr))
|
||||||
|
var parms [6]unsafe.Pointer
|
||||||
|
parms[0] = unsafe.Pointer(&fd)
|
||||||
|
parms[1] = unsafe.Pointer(&attr_sz)
|
||||||
|
parms[2] = unsafe.Pointer(attr)
|
||||||
|
parms[3] = unsafe.Pointer(&rv)
|
||||||
|
parms[4] = unsafe.Pointer(&rc)
|
||||||
|
parms[5] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4FCR)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
|
||||||
|
func BpxCondTimedWait(sec uint32, nsec uint32, events uint32, secrem *uint32, nsecrem *uint32) (rv int32, rc int32, rn int32) {
|
||||||
|
var parms [8]unsafe.Pointer
|
||||||
|
parms[0] = unsafe.Pointer(&sec)
|
||||||
|
parms[1] = unsafe.Pointer(&nsec)
|
||||||
|
parms[2] = unsafe.Pointer(&events)
|
||||||
|
parms[3] = unsafe.Pointer(secrem)
|
||||||
|
parms[4] = unsafe.Pointer(nsecrem)
|
||||||
|
parms[5] = unsafe.Pointer(&rv)
|
||||||
|
parms[6] = unsafe.Pointer(&rc)
|
||||||
|
parms[7] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4CTW)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
func BpxGetthent(in *Pgtha, outlen *uint32, out unsafe.Pointer) (rv int32, rc int32, rn int32) {
|
||||||
|
var parms [7]unsafe.Pointer
|
||||||
|
inlen := uint32(26) // nothing else will work. Go says Pgtha is 28-byte because of alignment, but Pgtha is "packed" and must be 26-byte
|
||||||
|
parms[0] = unsafe.Pointer(&inlen)
|
||||||
|
parms[1] = unsafe.Pointer(&in)
|
||||||
|
parms[2] = unsafe.Pointer(outlen)
|
||||||
|
parms[3] = unsafe.Pointer(&out)
|
||||||
|
parms[4] = unsafe.Pointer(&rv)
|
||||||
|
parms[5] = unsafe.Pointer(&rc)
|
||||||
|
parms[6] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4GTH)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
func ZosJobname() (jobname string, err error) {
|
||||||
|
var pgtha Pgtha
|
||||||
|
pgtha.Pid = uint32(Getpid())
|
||||||
|
pgtha.Accesspid = PGTHA_CURRENT
|
||||||
|
pgtha.Flag1 = PGTHA_PROCESS
|
||||||
|
var out [256]byte
|
||||||
|
var outlen uint32
|
||||||
|
outlen = 256
|
||||||
|
rv, rc, rn := BpxGetthent(&pgtha, &outlen, unsafe.Pointer(&out[0]))
|
||||||
|
if rv == 0 {
|
||||||
|
gthc := []byte{0x87, 0xa3, 0x88, 0x83} // 'gthc' in ebcdic
|
||||||
|
ix := bytes.Index(out[:], gthc)
|
||||||
|
if ix == -1 {
|
||||||
|
err = fmt.Errorf("BPX4GTH: gthc return data not found")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
jn := out[ix+80 : ix+88] // we didn't declare Pgthc, but jobname is 8-byte at offset 80
|
||||||
|
E2a(jn)
|
||||||
|
jobname = string(bytes.TrimRight(jn, " "))
|
||||||
|
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("BPX4GTH: rc=%d errno=%d reason=code=0x%x", rv, rc, rn)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
func Bpx4ptq(code int32, data string) (rv int32, rc int32, rn int32) {
|
||||||
|
var userdata [8]byte
|
||||||
|
var parms [5]unsafe.Pointer
|
||||||
|
copy(userdata[:], data+" ")
|
||||||
|
A2e(userdata[:])
|
||||||
|
parms[0] = unsafe.Pointer(&code)
|
||||||
|
parms[1] = unsafe.Pointer(&userdata[0])
|
||||||
|
parms[2] = unsafe.Pointer(&rv)
|
||||||
|
parms[3] = unsafe.Pointer(&rc)
|
||||||
|
parms[4] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4PTQ)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
PT_TRACE_ME = 0 // Debug this process
|
||||||
|
PT_READ_I = 1 // Read a full word
|
||||||
|
PT_READ_D = 2 // Read a full word
|
||||||
|
PT_READ_U = 3 // Read control info
|
||||||
|
PT_WRITE_I = 4 //Write a full word
|
||||||
|
PT_WRITE_D = 5 //Write a full word
|
||||||
|
PT_CONTINUE = 7 //Continue the process
|
||||||
|
PT_KILL = 8 //Terminate the process
|
||||||
|
PT_READ_GPR = 11 // Read GPR, CR, PSW
|
||||||
|
PT_READ_FPR = 12 // Read FPR
|
||||||
|
PT_READ_VR = 13 // Read VR
|
||||||
|
PT_WRITE_GPR = 14 // Write GPR, CR, PSW
|
||||||
|
PT_WRITE_FPR = 15 // Write FPR
|
||||||
|
PT_WRITE_VR = 16 // Write VR
|
||||||
|
PT_READ_BLOCK = 17 // Read storage
|
||||||
|
PT_WRITE_BLOCK = 19 // Write storage
|
||||||
|
PT_READ_GPRH = 20 // Read GPRH
|
||||||
|
PT_WRITE_GPRH = 21 // Write GPRH
|
||||||
|
PT_REGHSET = 22 // Read all GPRHs
|
||||||
|
PT_ATTACH = 30 // Attach to a process
|
||||||
|
PT_DETACH = 31 // Detach from a process
|
||||||
|
PT_REGSET = 32 // Read all GPRs
|
||||||
|
PT_REATTACH = 33 // Reattach to a process
|
||||||
|
PT_LDINFO = 34 // Read loader info
|
||||||
|
PT_MULTI = 35 // Multi process mode
|
||||||
|
PT_LD64INFO = 36 // RMODE64 Info Area
|
||||||
|
PT_BLOCKREQ = 40 // Block request
|
||||||
|
PT_THREAD_INFO = 60 // Read thread info
|
||||||
|
PT_THREAD_MODIFY = 61
|
||||||
|
PT_THREAD_READ_FOCUS = 62
|
||||||
|
PT_THREAD_WRITE_FOCUS = 63
|
||||||
|
PT_THREAD_HOLD = 64
|
||||||
|
PT_THREAD_SIGNAL = 65
|
||||||
|
PT_EXPLAIN = 66
|
||||||
|
PT_EVENTS = 67
|
||||||
|
PT_THREAD_INFO_EXTENDED = 68
|
||||||
|
PT_REATTACH2 = 71
|
||||||
|
PT_CAPTURE = 72
|
||||||
|
PT_UNCAPTURE = 73
|
||||||
|
PT_GET_THREAD_TCB = 74
|
||||||
|
PT_GET_ALET = 75
|
||||||
|
PT_SWAPIN = 76
|
||||||
|
PT_EXTENDED_EVENT = 98
|
||||||
|
PT_RECOVER = 99 // Debug a program check
|
||||||
|
PT_GPR0 = 0 // General purpose register 0
|
||||||
|
PT_GPR1 = 1 // General purpose register 1
|
||||||
|
PT_GPR2 = 2 // General purpose register 2
|
||||||
|
PT_GPR3 = 3 // General purpose register 3
|
||||||
|
PT_GPR4 = 4 // General purpose register 4
|
||||||
|
PT_GPR5 = 5 // General purpose register 5
|
||||||
|
PT_GPR6 = 6 // General purpose register 6
|
||||||
|
PT_GPR7 = 7 // General purpose register 7
|
||||||
|
PT_GPR8 = 8 // General purpose register 8
|
||||||
|
PT_GPR9 = 9 // General purpose register 9
|
||||||
|
PT_GPR10 = 10 // General purpose register 10
|
||||||
|
PT_GPR11 = 11 // General purpose register 11
|
||||||
|
PT_GPR12 = 12 // General purpose register 12
|
||||||
|
PT_GPR13 = 13 // General purpose register 13
|
||||||
|
PT_GPR14 = 14 // General purpose register 14
|
||||||
|
PT_GPR15 = 15 // General purpose register 15
|
||||||
|
PT_FPR0 = 16 // Floating point register 0
|
||||||
|
PT_FPR1 = 17 // Floating point register 1
|
||||||
|
PT_FPR2 = 18 // Floating point register 2
|
||||||
|
PT_FPR3 = 19 // Floating point register 3
|
||||||
|
PT_FPR4 = 20 // Floating point register 4
|
||||||
|
PT_FPR5 = 21 // Floating point register 5
|
||||||
|
PT_FPR6 = 22 // Floating point register 6
|
||||||
|
PT_FPR7 = 23 // Floating point register 7
|
||||||
|
PT_FPR8 = 24 // Floating point register 8
|
||||||
|
PT_FPR9 = 25 // Floating point register 9
|
||||||
|
PT_FPR10 = 26 // Floating point register 10
|
||||||
|
PT_FPR11 = 27 // Floating point register 11
|
||||||
|
PT_FPR12 = 28 // Floating point register 12
|
||||||
|
PT_FPR13 = 29 // Floating point register 13
|
||||||
|
PT_FPR14 = 30 // Floating point register 14
|
||||||
|
PT_FPR15 = 31 // Floating point register 15
|
||||||
|
PT_FPC = 32 // Floating point control register
|
||||||
|
PT_PSW = 40 // PSW
|
||||||
|
PT_PSW0 = 40 // Left half of the PSW
|
||||||
|
PT_PSW1 = 41 // Right half of the PSW
|
||||||
|
PT_CR0 = 42 // Control register 0
|
||||||
|
PT_CR1 = 43 // Control register 1
|
||||||
|
PT_CR2 = 44 // Control register 2
|
||||||
|
PT_CR3 = 45 // Control register 3
|
||||||
|
PT_CR4 = 46 // Control register 4
|
||||||
|
PT_CR5 = 47 // Control register 5
|
||||||
|
PT_CR6 = 48 // Control register 6
|
||||||
|
PT_CR7 = 49 // Control register 7
|
||||||
|
PT_CR8 = 50 // Control register 8
|
||||||
|
PT_CR9 = 51 // Control register 9
|
||||||
|
PT_CR10 = 52 // Control register 10
|
||||||
|
PT_CR11 = 53 // Control register 11
|
||||||
|
PT_CR12 = 54 // Control register 12
|
||||||
|
PT_CR13 = 55 // Control register 13
|
||||||
|
PT_CR14 = 56 // Control register 14
|
||||||
|
PT_CR15 = 57 // Control register 15
|
||||||
|
PT_GPRH0 = 58 // GP High register 0
|
||||||
|
PT_GPRH1 = 59 // GP High register 1
|
||||||
|
PT_GPRH2 = 60 // GP High register 2
|
||||||
|
PT_GPRH3 = 61 // GP High register 3
|
||||||
|
PT_GPRH4 = 62 // GP High register 4
|
||||||
|
PT_GPRH5 = 63 // GP High register 5
|
||||||
|
PT_GPRH6 = 64 // GP High register 6
|
||||||
|
PT_GPRH7 = 65 // GP High register 7
|
||||||
|
PT_GPRH8 = 66 // GP High register 8
|
||||||
|
PT_GPRH9 = 67 // GP High register 9
|
||||||
|
PT_GPRH10 = 68 // GP High register 10
|
||||||
|
PT_GPRH11 = 69 // GP High register 11
|
||||||
|
PT_GPRH12 = 70 // GP High register 12
|
||||||
|
PT_GPRH13 = 71 // GP High register 13
|
||||||
|
PT_GPRH14 = 72 // GP High register 14
|
||||||
|
PT_GPRH15 = 73 // GP High register 15
|
||||||
|
PT_VR0 = 74 // Vector register 0
|
||||||
|
PT_VR1 = 75 // Vector register 1
|
||||||
|
PT_VR2 = 76 // Vector register 2
|
||||||
|
PT_VR3 = 77 // Vector register 3
|
||||||
|
PT_VR4 = 78 // Vector register 4
|
||||||
|
PT_VR5 = 79 // Vector register 5
|
||||||
|
PT_VR6 = 80 // Vector register 6
|
||||||
|
PT_VR7 = 81 // Vector register 7
|
||||||
|
PT_VR8 = 82 // Vector register 8
|
||||||
|
PT_VR9 = 83 // Vector register 9
|
||||||
|
PT_VR10 = 84 // Vector register 10
|
||||||
|
PT_VR11 = 85 // Vector register 11
|
||||||
|
PT_VR12 = 86 // Vector register 12
|
||||||
|
PT_VR13 = 87 // Vector register 13
|
||||||
|
PT_VR14 = 88 // Vector register 14
|
||||||
|
PT_VR15 = 89 // Vector register 15
|
||||||
|
PT_VR16 = 90 // Vector register 16
|
||||||
|
PT_VR17 = 91 // Vector register 17
|
||||||
|
PT_VR18 = 92 // Vector register 18
|
||||||
|
PT_VR19 = 93 // Vector register 19
|
||||||
|
PT_VR20 = 94 // Vector register 20
|
||||||
|
PT_VR21 = 95 // Vector register 21
|
||||||
|
PT_VR22 = 96 // Vector register 22
|
||||||
|
PT_VR23 = 97 // Vector register 23
|
||||||
|
PT_VR24 = 98 // Vector register 24
|
||||||
|
PT_VR25 = 99 // Vector register 25
|
||||||
|
PT_VR26 = 100 // Vector register 26
|
||||||
|
PT_VR27 = 101 // Vector register 27
|
||||||
|
PT_VR28 = 102 // Vector register 28
|
||||||
|
PT_VR29 = 103 // Vector register 29
|
||||||
|
PT_VR30 = 104 // Vector register 30
|
||||||
|
PT_VR31 = 105 // Vector register 31
|
||||||
|
PT_PSWG = 106 // PSWG
|
||||||
|
PT_PSWG0 = 106 // Bytes 0-3
|
||||||
|
PT_PSWG1 = 107 // Bytes 4-7
|
||||||
|
PT_PSWG2 = 108 // Bytes 8-11 (IA high word)
|
||||||
|
PT_PSWG3 = 109 // Bytes 12-15 (IA low word)
|
||||||
|
)
|
||||||
|
|
||||||
|
func Bpx4ptr(request int32, pid int32, addr unsafe.Pointer, data unsafe.Pointer, buffer unsafe.Pointer) (rv int32, rc int32, rn int32) {
|
||||||
|
var parms [8]unsafe.Pointer
|
||||||
|
parms[0] = unsafe.Pointer(&request)
|
||||||
|
parms[1] = unsafe.Pointer(&pid)
|
||||||
|
parms[2] = unsafe.Pointer(&addr)
|
||||||
|
parms[3] = unsafe.Pointer(&data)
|
||||||
|
parms[4] = unsafe.Pointer(&buffer)
|
||||||
|
parms[5] = unsafe.Pointer(&rv)
|
||||||
|
parms[6] = unsafe.Pointer(&rc)
|
||||||
|
parms[7] = unsafe.Pointer(&rn)
|
||||||
|
bpxcall(parms[:], BPX4PTR)
|
||||||
|
return rv, rc, rn
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyU8(val uint8, dest []uint8) int {
|
||||||
|
if len(dest) < 1 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
dest[0] = val
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyU8Arr(src, dest []uint8) int {
|
||||||
|
if len(dest) < len(src) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
for i, v := range src {
|
||||||
|
dest[i] = v
|
||||||
|
}
|
||||||
|
return len(src)
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyU16(val uint16, dest []uint16) int {
|
||||||
|
if len(dest) < 1 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
dest[0] = val
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyU32(val uint32, dest []uint32) int {
|
||||||
|
if len(dest) < 1 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
dest[0] = val
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyU32Arr(src, dest []uint32) int {
|
||||||
|
if len(dest) < len(src) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
for i, v := range src {
|
||||||
|
dest[i] = v
|
||||||
|
}
|
||||||
|
return len(src)
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyU64(val uint64, dest []uint64) int {
|
||||||
|
if len(dest) < 1 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
dest[0] = val
|
||||||
|
return 1
|
||||||
|
}
|
|
@ -0,0 +1,192 @@
|
||||||
|
// Copyright 2024 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 "go_asm.h"
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
// function to call USS assembly language services
|
||||||
|
//
|
||||||
|
// doc: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_3.1.0/com.ibm.zos.v3r1.bpxb100/bit64env.htm
|
||||||
|
//
|
||||||
|
// arg1 unsafe.Pointer array that ressembles an OS PLIST
|
||||||
|
//
|
||||||
|
// arg2 function offset as in
|
||||||
|
// doc: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_3.1.0/com.ibm.zos.v3r1.bpxb100/bpx2cr_List_of_offsets.htm
|
||||||
|
//
|
||||||
|
// func bpxcall(plist []unsafe.Pointer, bpx_offset int64)
|
||||||
|
|
||||||
|
TEXT ·bpxcall(SB), NOSPLIT|NOFRAME, $0
|
||||||
|
MOVD plist_base+0(FP), R1 // r1 points to plist
|
||||||
|
MOVD bpx_offset+24(FP), R2 // r2 offset to BPX vector table
|
||||||
|
MOVD R14, R7 // save r14
|
||||||
|
MOVD R15, R8 // save r15
|
||||||
|
MOVWZ 16(R0), R9
|
||||||
|
MOVWZ 544(R9), R9
|
||||||
|
MOVWZ 24(R9), R9 // call vector in r9
|
||||||
|
ADD R2, R9 // add offset to vector table
|
||||||
|
MOVWZ (R9), R9 // r9 points to entry point
|
||||||
|
BYTE $0x0D // BL R14,R9 --> basr r14,r9
|
||||||
|
BYTE $0xE9 // clobbers 0,1,14,15
|
||||||
|
MOVD R8, R15 // restore 15
|
||||||
|
JMP R7 // return via saved return address
|
||||||
|
|
||||||
|
// func A2e(arr [] byte)
|
||||||
|
// code page conversion from 819 to 1047
|
||||||
|
TEXT ·A2e(SB), NOSPLIT|NOFRAME, $0
|
||||||
|
MOVD arg_base+0(FP), R2 // pointer to arry of characters
|
||||||
|
MOVD arg_len+8(FP), R3 // count
|
||||||
|
XOR R0, R0
|
||||||
|
XOR R1, R1
|
||||||
|
BYTE $0xA7; BYTE $0x15; BYTE $0x00; BYTE $0x82 // BRAS 1,(2+(256/2))
|
||||||
|
|
||||||
|
// ASCII -> EBCDIC conversion table:
|
||||||
|
BYTE $0x00; BYTE $0x01; BYTE $0x02; BYTE $0x03
|
||||||
|
BYTE $0x37; BYTE $0x2d; BYTE $0x2e; BYTE $0x2f
|
||||||
|
BYTE $0x16; BYTE $0x05; BYTE $0x15; BYTE $0x0b
|
||||||
|
BYTE $0x0c; BYTE $0x0d; BYTE $0x0e; BYTE $0x0f
|
||||||
|
BYTE $0x10; BYTE $0x11; BYTE $0x12; BYTE $0x13
|
||||||
|
BYTE $0x3c; BYTE $0x3d; BYTE $0x32; BYTE $0x26
|
||||||
|
BYTE $0x18; BYTE $0x19; BYTE $0x3f; BYTE $0x27
|
||||||
|
BYTE $0x1c; BYTE $0x1d; BYTE $0x1e; BYTE $0x1f
|
||||||
|
BYTE $0x40; BYTE $0x5a; BYTE $0x7f; BYTE $0x7b
|
||||||
|
BYTE $0x5b; BYTE $0x6c; BYTE $0x50; BYTE $0x7d
|
||||||
|
BYTE $0x4d; BYTE $0x5d; BYTE $0x5c; BYTE $0x4e
|
||||||
|
BYTE $0x6b; BYTE $0x60; BYTE $0x4b; BYTE $0x61
|
||||||
|
BYTE $0xf0; BYTE $0xf1; BYTE $0xf2; BYTE $0xf3
|
||||||
|
BYTE $0xf4; BYTE $0xf5; BYTE $0xf6; BYTE $0xf7
|
||||||
|
BYTE $0xf8; BYTE $0xf9; BYTE $0x7a; BYTE $0x5e
|
||||||
|
BYTE $0x4c; BYTE $0x7e; BYTE $0x6e; BYTE $0x6f
|
||||||
|
BYTE $0x7c; BYTE $0xc1; BYTE $0xc2; BYTE $0xc3
|
||||||
|
BYTE $0xc4; BYTE $0xc5; BYTE $0xc6; BYTE $0xc7
|
||||||
|
BYTE $0xc8; BYTE $0xc9; BYTE $0xd1; BYTE $0xd2
|
||||||
|
BYTE $0xd3; BYTE $0xd4; BYTE $0xd5; BYTE $0xd6
|
||||||
|
BYTE $0xd7; BYTE $0xd8; BYTE $0xd9; BYTE $0xe2
|
||||||
|
BYTE $0xe3; BYTE $0xe4; BYTE $0xe5; BYTE $0xe6
|
||||||
|
BYTE $0xe7; BYTE $0xe8; BYTE $0xe9; BYTE $0xad
|
||||||
|
BYTE $0xe0; BYTE $0xbd; BYTE $0x5f; BYTE $0x6d
|
||||||
|
BYTE $0x79; BYTE $0x81; BYTE $0x82; BYTE $0x83
|
||||||
|
BYTE $0x84; BYTE $0x85; BYTE $0x86; BYTE $0x87
|
||||||
|
BYTE $0x88; BYTE $0x89; BYTE $0x91; BYTE $0x92
|
||||||
|
BYTE $0x93; BYTE $0x94; BYTE $0x95; BYTE $0x96
|
||||||
|
BYTE $0x97; BYTE $0x98; BYTE $0x99; BYTE $0xa2
|
||||||
|
BYTE $0xa3; BYTE $0xa4; BYTE $0xa5; BYTE $0xa6
|
||||||
|
BYTE $0xa7; BYTE $0xa8; BYTE $0xa9; BYTE $0xc0
|
||||||
|
BYTE $0x4f; BYTE $0xd0; BYTE $0xa1; BYTE $0x07
|
||||||
|
BYTE $0x20; BYTE $0x21; BYTE $0x22; BYTE $0x23
|
||||||
|
BYTE $0x24; BYTE $0x25; BYTE $0x06; BYTE $0x17
|
||||||
|
BYTE $0x28; BYTE $0x29; BYTE $0x2a; BYTE $0x2b
|
||||||
|
BYTE $0x2c; BYTE $0x09; BYTE $0x0a; BYTE $0x1b
|
||||||
|
BYTE $0x30; BYTE $0x31; BYTE $0x1a; BYTE $0x33
|
||||||
|
BYTE $0x34; BYTE $0x35; BYTE $0x36; BYTE $0x08
|
||||||
|
BYTE $0x38; BYTE $0x39; BYTE $0x3a; BYTE $0x3b
|
||||||
|
BYTE $0x04; BYTE $0x14; BYTE $0x3e; BYTE $0xff
|
||||||
|
BYTE $0x41; BYTE $0xaa; BYTE $0x4a; BYTE $0xb1
|
||||||
|
BYTE $0x9f; BYTE $0xb2; BYTE $0x6a; BYTE $0xb5
|
||||||
|
BYTE $0xbb; BYTE $0xb4; BYTE $0x9a; BYTE $0x8a
|
||||||
|
BYTE $0xb0; BYTE $0xca; BYTE $0xaf; BYTE $0xbc
|
||||||
|
BYTE $0x90; BYTE $0x8f; BYTE $0xea; BYTE $0xfa
|
||||||
|
BYTE $0xbe; BYTE $0xa0; BYTE $0xb6; BYTE $0xb3
|
||||||
|
BYTE $0x9d; BYTE $0xda; BYTE $0x9b; BYTE $0x8b
|
||||||
|
BYTE $0xb7; BYTE $0xb8; BYTE $0xb9; BYTE $0xab
|
||||||
|
BYTE $0x64; BYTE $0x65; BYTE $0x62; BYTE $0x66
|
||||||
|
BYTE $0x63; BYTE $0x67; BYTE $0x9e; BYTE $0x68
|
||||||
|
BYTE $0x74; BYTE $0x71; BYTE $0x72; BYTE $0x73
|
||||||
|
BYTE $0x78; BYTE $0x75; BYTE $0x76; BYTE $0x77
|
||||||
|
BYTE $0xac; BYTE $0x69; BYTE $0xed; BYTE $0xee
|
||||||
|
BYTE $0xeb; BYTE $0xef; BYTE $0xec; BYTE $0xbf
|
||||||
|
BYTE $0x80; BYTE $0xfd; BYTE $0xfe; BYTE $0xfb
|
||||||
|
BYTE $0xfc; BYTE $0xba; BYTE $0xae; BYTE $0x59
|
||||||
|
BYTE $0x44; BYTE $0x45; BYTE $0x42; BYTE $0x46
|
||||||
|
BYTE $0x43; BYTE $0x47; BYTE $0x9c; BYTE $0x48
|
||||||
|
BYTE $0x54; BYTE $0x51; BYTE $0x52; BYTE $0x53
|
||||||
|
BYTE $0x58; BYTE $0x55; BYTE $0x56; BYTE $0x57
|
||||||
|
BYTE $0x8c; BYTE $0x49; BYTE $0xcd; BYTE $0xce
|
||||||
|
BYTE $0xcb; BYTE $0xcf; BYTE $0xcc; BYTE $0xe1
|
||||||
|
BYTE $0x70; BYTE $0xdd; BYTE $0xde; BYTE $0xdb
|
||||||
|
BYTE $0xdc; BYTE $0x8d; BYTE $0x8e; BYTE $0xdf
|
||||||
|
|
||||||
|
retry:
|
||||||
|
WORD $0xB9931022 // TROO 2,2,b'0001'
|
||||||
|
BVS retry
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func e2a(arr [] byte)
|
||||||
|
// code page conversion from 1047 to 819
|
||||||
|
TEXT ·E2a(SB), NOSPLIT|NOFRAME, $0
|
||||||
|
MOVD arg_base+0(FP), R2 // pointer to arry of characters
|
||||||
|
MOVD arg_len+8(FP), R3 // count
|
||||||
|
XOR R0, R0
|
||||||
|
XOR R1, R1
|
||||||
|
BYTE $0xA7; BYTE $0x15; BYTE $0x00; BYTE $0x82 // BRAS 1,(2+(256/2))
|
||||||
|
|
||||||
|
// EBCDIC -> ASCII conversion table:
|
||||||
|
BYTE $0x00; BYTE $0x01; BYTE $0x02; BYTE $0x03
|
||||||
|
BYTE $0x9c; BYTE $0x09; BYTE $0x86; BYTE $0x7f
|
||||||
|
BYTE $0x97; BYTE $0x8d; BYTE $0x8e; BYTE $0x0b
|
||||||
|
BYTE $0x0c; BYTE $0x0d; BYTE $0x0e; BYTE $0x0f
|
||||||
|
BYTE $0x10; BYTE $0x11; BYTE $0x12; BYTE $0x13
|
||||||
|
BYTE $0x9d; BYTE $0x0a; BYTE $0x08; BYTE $0x87
|
||||||
|
BYTE $0x18; BYTE $0x19; BYTE $0x92; BYTE $0x8f
|
||||||
|
BYTE $0x1c; BYTE $0x1d; BYTE $0x1e; BYTE $0x1f
|
||||||
|
BYTE $0x80; BYTE $0x81; BYTE $0x82; BYTE $0x83
|
||||||
|
BYTE $0x84; BYTE $0x85; BYTE $0x17; BYTE $0x1b
|
||||||
|
BYTE $0x88; BYTE $0x89; BYTE $0x8a; BYTE $0x8b
|
||||||
|
BYTE $0x8c; BYTE $0x05; BYTE $0x06; BYTE $0x07
|
||||||
|
BYTE $0x90; BYTE $0x91; BYTE $0x16; BYTE $0x93
|
||||||
|
BYTE $0x94; BYTE $0x95; BYTE $0x96; BYTE $0x04
|
||||||
|
BYTE $0x98; BYTE $0x99; BYTE $0x9a; BYTE $0x9b
|
||||||
|
BYTE $0x14; BYTE $0x15; BYTE $0x9e; BYTE $0x1a
|
||||||
|
BYTE $0x20; BYTE $0xa0; BYTE $0xe2; BYTE $0xe4
|
||||||
|
BYTE $0xe0; BYTE $0xe1; BYTE $0xe3; BYTE $0xe5
|
||||||
|
BYTE $0xe7; BYTE $0xf1; BYTE $0xa2; BYTE $0x2e
|
||||||
|
BYTE $0x3c; BYTE $0x28; BYTE $0x2b; BYTE $0x7c
|
||||||
|
BYTE $0x26; BYTE $0xe9; BYTE $0xea; BYTE $0xeb
|
||||||
|
BYTE $0xe8; BYTE $0xed; BYTE $0xee; BYTE $0xef
|
||||||
|
BYTE $0xec; BYTE $0xdf; BYTE $0x21; BYTE $0x24
|
||||||
|
BYTE $0x2a; BYTE $0x29; BYTE $0x3b; BYTE $0x5e
|
||||||
|
BYTE $0x2d; BYTE $0x2f; BYTE $0xc2; BYTE $0xc4
|
||||||
|
BYTE $0xc0; BYTE $0xc1; BYTE $0xc3; BYTE $0xc5
|
||||||
|
BYTE $0xc7; BYTE $0xd1; BYTE $0xa6; BYTE $0x2c
|
||||||
|
BYTE $0x25; BYTE $0x5f; BYTE $0x3e; BYTE $0x3f
|
||||||
|
BYTE $0xf8; BYTE $0xc9; BYTE $0xca; BYTE $0xcb
|
||||||
|
BYTE $0xc8; BYTE $0xcd; BYTE $0xce; BYTE $0xcf
|
||||||
|
BYTE $0xcc; BYTE $0x60; BYTE $0x3a; BYTE $0x23
|
||||||
|
BYTE $0x40; BYTE $0x27; BYTE $0x3d; BYTE $0x22
|
||||||
|
BYTE $0xd8; BYTE $0x61; BYTE $0x62; BYTE $0x63
|
||||||
|
BYTE $0x64; BYTE $0x65; BYTE $0x66; BYTE $0x67
|
||||||
|
BYTE $0x68; BYTE $0x69; BYTE $0xab; BYTE $0xbb
|
||||||
|
BYTE $0xf0; BYTE $0xfd; BYTE $0xfe; BYTE $0xb1
|
||||||
|
BYTE $0xb0; BYTE $0x6a; BYTE $0x6b; BYTE $0x6c
|
||||||
|
BYTE $0x6d; BYTE $0x6e; BYTE $0x6f; BYTE $0x70
|
||||||
|
BYTE $0x71; BYTE $0x72; BYTE $0xaa; BYTE $0xba
|
||||||
|
BYTE $0xe6; BYTE $0xb8; BYTE $0xc6; BYTE $0xa4
|
||||||
|
BYTE $0xb5; BYTE $0x7e; BYTE $0x73; BYTE $0x74
|
||||||
|
BYTE $0x75; BYTE $0x76; BYTE $0x77; BYTE $0x78
|
||||||
|
BYTE $0x79; BYTE $0x7a; BYTE $0xa1; BYTE $0xbf
|
||||||
|
BYTE $0xd0; BYTE $0x5b; BYTE $0xde; BYTE $0xae
|
||||||
|
BYTE $0xac; BYTE $0xa3; BYTE $0xa5; BYTE $0xb7
|
||||||
|
BYTE $0xa9; BYTE $0xa7; BYTE $0xb6; BYTE $0xbc
|
||||||
|
BYTE $0xbd; BYTE $0xbe; BYTE $0xdd; BYTE $0xa8
|
||||||
|
BYTE $0xaf; BYTE $0x5d; BYTE $0xb4; BYTE $0xd7
|
||||||
|
BYTE $0x7b; BYTE $0x41; BYTE $0x42; BYTE $0x43
|
||||||
|
BYTE $0x44; BYTE $0x45; BYTE $0x46; BYTE $0x47
|
||||||
|
BYTE $0x48; BYTE $0x49; BYTE $0xad; BYTE $0xf4
|
||||||
|
BYTE $0xf6; BYTE $0xf2; BYTE $0xf3; BYTE $0xf5
|
||||||
|
BYTE $0x7d; BYTE $0x4a; BYTE $0x4b; BYTE $0x4c
|
||||||
|
BYTE $0x4d; BYTE $0x4e; BYTE $0x4f; BYTE $0x50
|
||||||
|
BYTE $0x51; BYTE $0x52; BYTE $0xb9; BYTE $0xfb
|
||||||
|
BYTE $0xfc; BYTE $0xf9; BYTE $0xfa; BYTE $0xff
|
||||||
|
BYTE $0x5c; BYTE $0xf7; BYTE $0x53; BYTE $0x54
|
||||||
|
BYTE $0x55; BYTE $0x56; BYTE $0x57; BYTE $0x58
|
||||||
|
BYTE $0x59; BYTE $0x5a; BYTE $0xb2; BYTE $0xd4
|
||||||
|
BYTE $0xd6; BYTE $0xd2; BYTE $0xd3; BYTE $0xd5
|
||||||
|
BYTE $0x30; BYTE $0x31; BYTE $0x32; BYTE $0x33
|
||||||
|
BYTE $0x34; BYTE $0x35; BYTE $0x36; BYTE $0x37
|
||||||
|
BYTE $0x38; BYTE $0x39; BYTE $0xb3; BYTE $0xdb
|
||||||
|
BYTE $0xdc; BYTE $0xd9; BYTE $0xda; BYTE $0x9f
|
||||||
|
|
||||||
|
retry:
|
||||||
|
WORD $0xB9931022 // TROO 2,2,b'0001'
|
||||||
|
BVS retry
|
||||||
|
RET
|
|
@ -1,220 +0,0 @@
|
||||||
// Copyright 2020 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build zos && s390x
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
// This file simulates epoll on z/OS using poll.
|
|
||||||
|
|
||||||
// Analogous to epoll_event on Linux.
|
|
||||||
// TODO(neeilan): Pad is because the Linux kernel expects a 96-bit struct. We never pass this to the kernel; remove?
|
|
||||||
type EpollEvent struct {
|
|
||||||
Events uint32
|
|
||||||
Fd int32
|
|
||||||
Pad int32
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
EPOLLERR = 0x8
|
|
||||||
EPOLLHUP = 0x10
|
|
||||||
EPOLLIN = 0x1
|
|
||||||
EPOLLMSG = 0x400
|
|
||||||
EPOLLOUT = 0x4
|
|
||||||
EPOLLPRI = 0x2
|
|
||||||
EPOLLRDBAND = 0x80
|
|
||||||
EPOLLRDNORM = 0x40
|
|
||||||
EPOLLWRBAND = 0x200
|
|
||||||
EPOLLWRNORM = 0x100
|
|
||||||
EPOLL_CTL_ADD = 0x1
|
|
||||||
EPOLL_CTL_DEL = 0x2
|
|
||||||
EPOLL_CTL_MOD = 0x3
|
|
||||||
// The following constants are part of the epoll API, but represent
|
|
||||||
// currently unsupported functionality on z/OS.
|
|
||||||
// EPOLL_CLOEXEC = 0x80000
|
|
||||||
// EPOLLET = 0x80000000
|
|
||||||
// EPOLLONESHOT = 0x40000000
|
|
||||||
// EPOLLRDHUP = 0x2000 // Typically used with edge-triggered notis
|
|
||||||
// EPOLLEXCLUSIVE = 0x10000000 // Exclusive wake-up mode
|
|
||||||
// EPOLLWAKEUP = 0x20000000 // Relies on Linux's BLOCK_SUSPEND capability
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODO(neeilan): We can eliminate these epToPoll / pToEpoll calls by using identical mask values for POLL/EPOLL
|
|
||||||
// constants where possible The lower 16 bits of epoll events (uint32) can fit any system poll event (int16).
|
|
||||||
|
|
||||||
// epToPollEvt converts epoll event field to poll equivalent.
|
|
||||||
// In epoll, Events is a 32-bit field, while poll uses 16 bits.
|
|
||||||
func epToPollEvt(events uint32) int16 {
|
|
||||||
var ep2p = map[uint32]int16{
|
|
||||||
EPOLLIN: POLLIN,
|
|
||||||
EPOLLOUT: POLLOUT,
|
|
||||||
EPOLLHUP: POLLHUP,
|
|
||||||
EPOLLPRI: POLLPRI,
|
|
||||||
EPOLLERR: POLLERR,
|
|
||||||
}
|
|
||||||
|
|
||||||
var pollEvts int16 = 0
|
|
||||||
for epEvt, pEvt := range ep2p {
|
|
||||||
if (events & epEvt) != 0 {
|
|
||||||
pollEvts |= pEvt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return pollEvts
|
|
||||||
}
|
|
||||||
|
|
||||||
// pToEpollEvt converts 16 bit poll event bitfields to 32-bit epoll event fields.
|
|
||||||
func pToEpollEvt(revents int16) uint32 {
|
|
||||||
var p2ep = map[int16]uint32{
|
|
||||||
POLLIN: EPOLLIN,
|
|
||||||
POLLOUT: EPOLLOUT,
|
|
||||||
POLLHUP: EPOLLHUP,
|
|
||||||
POLLPRI: EPOLLPRI,
|
|
||||||
POLLERR: EPOLLERR,
|
|
||||||
}
|
|
||||||
|
|
||||||
var epollEvts uint32 = 0
|
|
||||||
for pEvt, epEvt := range p2ep {
|
|
||||||
if (revents & pEvt) != 0 {
|
|
||||||
epollEvts |= epEvt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return epollEvts
|
|
||||||
}
|
|
||||||
|
|
||||||
// Per-process epoll implementation.
|
|
||||||
type epollImpl struct {
|
|
||||||
mu sync.Mutex
|
|
||||||
epfd2ep map[int]*eventPoll
|
|
||||||
nextEpfd int
|
|
||||||
}
|
|
||||||
|
|
||||||
// eventPoll holds a set of file descriptors being watched by the process. A process can have multiple epoll instances.
|
|
||||||
// On Linux, this is an in-kernel data structure accessed through a fd.
|
|
||||||
type eventPoll struct {
|
|
||||||
mu sync.Mutex
|
|
||||||
fds map[int]*EpollEvent
|
|
||||||
}
|
|
||||||
|
|
||||||
// epoll impl for this process.
|
|
||||||
var impl epollImpl = epollImpl{
|
|
||||||
epfd2ep: make(map[int]*eventPoll),
|
|
||||||
nextEpfd: 0,
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *epollImpl) epollcreate(size int) (epfd int, err error) {
|
|
||||||
e.mu.Lock()
|
|
||||||
defer e.mu.Unlock()
|
|
||||||
epfd = e.nextEpfd
|
|
||||||
e.nextEpfd++
|
|
||||||
|
|
||||||
e.epfd2ep[epfd] = &eventPoll{
|
|
||||||
fds: make(map[int]*EpollEvent),
|
|
||||||
}
|
|
||||||
return epfd, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *epollImpl) epollcreate1(flag int) (fd int, err error) {
|
|
||||||
return e.epollcreate(4)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *epollImpl) epollctl(epfd int, op int, fd int, event *EpollEvent) (err error) {
|
|
||||||
e.mu.Lock()
|
|
||||||
defer e.mu.Unlock()
|
|
||||||
|
|
||||||
ep, ok := e.epfd2ep[epfd]
|
|
||||||
if !ok {
|
|
||||||
|
|
||||||
return EBADF
|
|
||||||
}
|
|
||||||
|
|
||||||
switch op {
|
|
||||||
case EPOLL_CTL_ADD:
|
|
||||||
// TODO(neeilan): When we make epfds and fds disjoint, detect epoll
|
|
||||||
// loops here (instances watching each other) and return ELOOP.
|
|
||||||
if _, ok := ep.fds[fd]; ok {
|
|
||||||
return EEXIST
|
|
||||||
}
|
|
||||||
ep.fds[fd] = event
|
|
||||||
case EPOLL_CTL_MOD:
|
|
||||||
if _, ok := ep.fds[fd]; !ok {
|
|
||||||
return ENOENT
|
|
||||||
}
|
|
||||||
ep.fds[fd] = event
|
|
||||||
case EPOLL_CTL_DEL:
|
|
||||||
if _, ok := ep.fds[fd]; !ok {
|
|
||||||
return ENOENT
|
|
||||||
}
|
|
||||||
delete(ep.fds, fd)
|
|
||||||
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Must be called while holding ep.mu
|
|
||||||
func (ep *eventPoll) getFds() []int {
|
|
||||||
fds := make([]int, len(ep.fds))
|
|
||||||
for fd := range ep.fds {
|
|
||||||
fds = append(fds, fd)
|
|
||||||
}
|
|
||||||
return fds
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *epollImpl) epollwait(epfd int, events []EpollEvent, msec int) (n int, err error) {
|
|
||||||
e.mu.Lock() // in [rare] case of concurrent epollcreate + epollwait
|
|
||||||
ep, ok := e.epfd2ep[epfd]
|
|
||||||
|
|
||||||
if !ok {
|
|
||||||
e.mu.Unlock()
|
|
||||||
return 0, EBADF
|
|
||||||
}
|
|
||||||
|
|
||||||
pollfds := make([]PollFd, 4)
|
|
||||||
for fd, epollevt := range ep.fds {
|
|
||||||
pollfds = append(pollfds, PollFd{Fd: int32(fd), Events: epToPollEvt(epollevt.Events)})
|
|
||||||
}
|
|
||||||
e.mu.Unlock()
|
|
||||||
|
|
||||||
n, err = Poll(pollfds, msec)
|
|
||||||
if err != nil {
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
i := 0
|
|
||||||
for _, pFd := range pollfds {
|
|
||||||
if pFd.Revents != 0 {
|
|
||||||
events[i] = EpollEvent{Fd: pFd.Fd, Events: pToEpollEvt(pFd.Revents)}
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
|
|
||||||
if i == n {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return n, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func EpollCreate(size int) (fd int, err error) {
|
|
||||||
return impl.epollcreate(size)
|
|
||||||
}
|
|
||||||
|
|
||||||
func EpollCreate1(flag int) (fd int, err error) {
|
|
||||||
return impl.epollcreate1(flag)
|
|
||||||
}
|
|
||||||
|
|
||||||
func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {
|
|
||||||
return impl.epollctl(epfd, op, fd, event)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Because EpollWait mutates events, the caller is expected to coordinate
|
|
||||||
// concurrent access if calling with the same epfd from multiple goroutines.
|
|
||||||
func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
|
|
||||||
return impl.epollwait(epfd, events, msec)
|
|
||||||
}
|
|
|
@ -1,163 +0,0 @@
|
||||||
// Copyright 2020 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build zos && s390x
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// This file simulates fstatfs on z/OS using fstatvfs and w_getmntent.
|
|
||||||
|
|
||||||
func Fstatfs(fd int, stat *Statfs_t) (err error) {
|
|
||||||
var stat_v Statvfs_t
|
|
||||||
err = Fstatvfs(fd, &stat_v)
|
|
||||||
if err == nil {
|
|
||||||
// populate stat
|
|
||||||
stat.Type = 0
|
|
||||||
stat.Bsize = stat_v.Bsize
|
|
||||||
stat.Blocks = stat_v.Blocks
|
|
||||||
stat.Bfree = stat_v.Bfree
|
|
||||||
stat.Bavail = stat_v.Bavail
|
|
||||||
stat.Files = stat_v.Files
|
|
||||||
stat.Ffree = stat_v.Ffree
|
|
||||||
stat.Fsid = stat_v.Fsid
|
|
||||||
stat.Namelen = stat_v.Namemax
|
|
||||||
stat.Frsize = stat_v.Frsize
|
|
||||||
stat.Flags = stat_v.Flag
|
|
||||||
for passn := 0; passn < 5; passn++ {
|
|
||||||
switch passn {
|
|
||||||
case 0:
|
|
||||||
err = tryGetmntent64(stat)
|
|
||||||
break
|
|
||||||
case 1:
|
|
||||||
err = tryGetmntent128(stat)
|
|
||||||
break
|
|
||||||
case 2:
|
|
||||||
err = tryGetmntent256(stat)
|
|
||||||
break
|
|
||||||
case 3:
|
|
||||||
err = tryGetmntent512(stat)
|
|
||||||
break
|
|
||||||
case 4:
|
|
||||||
err = tryGetmntent1024(stat)
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
//proceed to return if: err is nil (found), err is nonnil but not ERANGE (another error occurred)
|
|
||||||
if err == nil || err != nil && err != ERANGE {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func tryGetmntent64(stat *Statfs_t) (err error) {
|
|
||||||
var mnt_ent_buffer struct {
|
|
||||||
header W_Mnth
|
|
||||||
filesys_info [64]W_Mntent
|
|
||||||
}
|
|
||||||
var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer))
|
|
||||||
fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = ERANGE //return ERANGE if no match is found in this batch
|
|
||||||
for i := 0; i < fs_count; i++ {
|
|
||||||
if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) {
|
|
||||||
stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0])
|
|
||||||
err = nil
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func tryGetmntent128(stat *Statfs_t) (err error) {
|
|
||||||
var mnt_ent_buffer struct {
|
|
||||||
header W_Mnth
|
|
||||||
filesys_info [128]W_Mntent
|
|
||||||
}
|
|
||||||
var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer))
|
|
||||||
fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = ERANGE //return ERANGE if no match is found in this batch
|
|
||||||
for i := 0; i < fs_count; i++ {
|
|
||||||
if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) {
|
|
||||||
stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0])
|
|
||||||
err = nil
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func tryGetmntent256(stat *Statfs_t) (err error) {
|
|
||||||
var mnt_ent_buffer struct {
|
|
||||||
header W_Mnth
|
|
||||||
filesys_info [256]W_Mntent
|
|
||||||
}
|
|
||||||
var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer))
|
|
||||||
fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = ERANGE //return ERANGE if no match is found in this batch
|
|
||||||
for i := 0; i < fs_count; i++ {
|
|
||||||
if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) {
|
|
||||||
stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0])
|
|
||||||
err = nil
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func tryGetmntent512(stat *Statfs_t) (err error) {
|
|
||||||
var mnt_ent_buffer struct {
|
|
||||||
header W_Mnth
|
|
||||||
filesys_info [512]W_Mntent
|
|
||||||
}
|
|
||||||
var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer))
|
|
||||||
fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = ERANGE //return ERANGE if no match is found in this batch
|
|
||||||
for i := 0; i < fs_count; i++ {
|
|
||||||
if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) {
|
|
||||||
stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0])
|
|
||||||
err = nil
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func tryGetmntent1024(stat *Statfs_t) (err error) {
|
|
||||||
var mnt_ent_buffer struct {
|
|
||||||
header W_Mnth
|
|
||||||
filesys_info [1024]W_Mntent
|
|
||||||
}
|
|
||||||
var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer))
|
|
||||||
fs_count, err := W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = ERANGE //return ERANGE if no match is found in this batch
|
|
||||||
for i := 0; i < fs_count; i++ {
|
|
||||||
if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) {
|
|
||||||
stat.Type = uint32(mnt_ent_buffer.filesys_info[i].Fstname[0])
|
|
||||||
err = nil
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
|
@ -263,6 +263,7 @@ struct ltchars {
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/seccomp.h>
|
#include <linux/seccomp.h>
|
||||||
#include <linux/serial.h>
|
#include <linux/serial.h>
|
||||||
|
#include <linux/sock_diag.h>
|
||||||
#include <linux/sockios.h>
|
#include <linux/sockios.h>
|
||||||
#include <linux/taskstats.h>
|
#include <linux/taskstats.h>
|
||||||
#include <linux/tipc.h>
|
#include <linux/tipc.h>
|
||||||
|
@ -549,6 +550,7 @@ ccflags="$@"
|
||||||
$2 !~ "NLA_TYPE_MASK" &&
|
$2 !~ "NLA_TYPE_MASK" &&
|
||||||
$2 !~ /^RTC_VL_(ACCURACY|BACKUP|DATA)/ &&
|
$2 !~ /^RTC_VL_(ACCURACY|BACKUP|DATA)/ &&
|
||||||
$2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ ||
|
$2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ ||
|
||||||
|
$2 ~ /^SOCK_|SK_DIAG_|SKNLGRP_$/ ||
|
||||||
$2 ~ /^FIORDCHK$/ ||
|
$2 ~ /^FIORDCHK$/ ||
|
||||||
$2 ~ /^SIOC/ ||
|
$2 ~ /^SIOC/ ||
|
||||||
$2 ~ /^TIOC/ ||
|
$2 ~ /^TIOC/ ||
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
|
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos
|
||||||
|
|
||||||
// For Unix, get the pagesize from the runtime.
|
// For Unix, get the pagesize from the runtime.
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build darwin
|
//go:build darwin || zos
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
// Copyright 2024 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Socket control messages
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
import "unsafe"
|
||||||
|
|
||||||
|
// UnixCredentials encodes credentials into a socket control message
|
||||||
|
// for sending to another process. This can be used for
|
||||||
|
// authentication.
|
||||||
|
func UnixCredentials(ucred *Ucred) []byte {
|
||||||
|
b := make([]byte, CmsgSpace(SizeofUcred))
|
||||||
|
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
|
||||||
|
h.Level = SOL_SOCKET
|
||||||
|
h.Type = SCM_CREDENTIALS
|
||||||
|
h.SetLen(CmsgLen(SizeofUcred))
|
||||||
|
*(*Ucred)(h.data(0)) = *ucred
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseUnixCredentials decodes a socket control message that contains
|
||||||
|
// credentials in a Ucred structure. To receive such a message, the
|
||||||
|
// SO_PASSCRED option must be enabled on the socket.
|
||||||
|
func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) {
|
||||||
|
if m.Header.Level != SOL_SOCKET {
|
||||||
|
return nil, EINVAL
|
||||||
|
}
|
||||||
|
if m.Header.Type != SCM_CREDENTIALS {
|
||||||
|
return nil, EINVAL
|
||||||
|
}
|
||||||
|
ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
|
||||||
|
return &ucred, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PktInfo4 encodes Inet4Pktinfo into a socket control message of type IP_PKTINFO.
|
||||||
|
func PktInfo4(info *Inet4Pktinfo) []byte {
|
||||||
|
b := make([]byte, CmsgSpace(SizeofInet4Pktinfo))
|
||||||
|
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
|
||||||
|
h.Level = SOL_IP
|
||||||
|
h.Type = IP_PKTINFO
|
||||||
|
h.SetLen(CmsgLen(SizeofInet4Pktinfo))
|
||||||
|
*(*Inet4Pktinfo)(h.data(0)) = *info
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// PktInfo6 encodes Inet6Pktinfo into a socket control message of type IPV6_PKTINFO.
|
||||||
|
func PktInfo6(info *Inet6Pktinfo) []byte {
|
||||||
|
b := make([]byte, CmsgSpace(SizeofInet6Pktinfo))
|
||||||
|
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
|
||||||
|
h.Level = SOL_IPV6
|
||||||
|
h.Type = IPV6_PKTINFO
|
||||||
|
h.SetLen(CmsgLen(SizeofInet6Pktinfo))
|
||||||
|
*(*Inet6Pktinfo)(h.data(0)) = *info
|
||||||
|
return b
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
// Copyright 2024 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build zos && s390x && gc
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
// provide the address of function variable to be fixed up.
|
||||||
|
|
||||||
|
TEXT ·getPipe2Addr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Pipe2(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_FlockAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Flock(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_GetxattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Getxattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_NanosleepAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Nanosleep(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_SetxattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Setxattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_Wait4Addr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Wait4(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_MountAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Mount(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_UnmountAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Unmount(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_UtimesNanoAtAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·UtimesNanoAt(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_UtimesNanoAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·UtimesNano(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_MkfifoatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Mkfifoat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_ChtagAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Chtag(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
TEXT ·get_ReadlinkatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Readlinkat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build (darwin && !ios) || linux
|
//go:build (darwin && !ios) || linux || zos
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
//go:build darwin && !ios
|
//go:build (darwin && !ios) || zos
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
|
|
|
@ -491,6 +491,7 @@ const (
|
||||||
BPF_F_REPLACE = 0x4
|
BPF_F_REPLACE = 0x4
|
||||||
BPF_F_SLEEPABLE = 0x10
|
BPF_F_SLEEPABLE = 0x10
|
||||||
BPF_F_STRICT_ALIGNMENT = 0x1
|
BPF_F_STRICT_ALIGNMENT = 0x1
|
||||||
|
BPF_F_TEST_REG_INVARIANTS = 0x80
|
||||||
BPF_F_TEST_RND_HI32 = 0x4
|
BPF_F_TEST_RND_HI32 = 0x4
|
||||||
BPF_F_TEST_RUN_ON_CPU = 0x1
|
BPF_F_TEST_RUN_ON_CPU = 0x1
|
||||||
BPF_F_TEST_STATE_FREQ = 0x8
|
BPF_F_TEST_STATE_FREQ = 0x8
|
||||||
|
@ -501,6 +502,7 @@ const (
|
||||||
BPF_IMM = 0x0
|
BPF_IMM = 0x0
|
||||||
BPF_IND = 0x40
|
BPF_IND = 0x40
|
||||||
BPF_JA = 0x0
|
BPF_JA = 0x0
|
||||||
|
BPF_JCOND = 0xe0
|
||||||
BPF_JEQ = 0x10
|
BPF_JEQ = 0x10
|
||||||
BPF_JGE = 0x30
|
BPF_JGE = 0x30
|
||||||
BPF_JGT = 0x20
|
BPF_JGT = 0x20
|
||||||
|
@ -656,6 +658,9 @@ const (
|
||||||
CAN_NPROTO = 0x8
|
CAN_NPROTO = 0x8
|
||||||
CAN_RAW = 0x1
|
CAN_RAW = 0x1
|
||||||
CAN_RAW_FILTER_MAX = 0x200
|
CAN_RAW_FILTER_MAX = 0x200
|
||||||
|
CAN_RAW_XL_VCID_RX_FILTER = 0x4
|
||||||
|
CAN_RAW_XL_VCID_TX_PASS = 0x2
|
||||||
|
CAN_RAW_XL_VCID_TX_SET = 0x1
|
||||||
CAN_RTR_FLAG = 0x40000000
|
CAN_RTR_FLAG = 0x40000000
|
||||||
CAN_SFF_ID_BITS = 0xb
|
CAN_SFF_ID_BITS = 0xb
|
||||||
CAN_SFF_MASK = 0x7ff
|
CAN_SFF_MASK = 0x7ff
|
||||||
|
@ -1338,6 +1343,7 @@ const (
|
||||||
F_OFD_SETLK = 0x25
|
F_OFD_SETLK = 0x25
|
||||||
F_OFD_SETLKW = 0x26
|
F_OFD_SETLKW = 0x26
|
||||||
F_OK = 0x0
|
F_OK = 0x0
|
||||||
|
F_SEAL_EXEC = 0x20
|
||||||
F_SEAL_FUTURE_WRITE = 0x10
|
F_SEAL_FUTURE_WRITE = 0x10
|
||||||
F_SEAL_GROW = 0x4
|
F_SEAL_GROW = 0x4
|
||||||
F_SEAL_SEAL = 0x1
|
F_SEAL_SEAL = 0x1
|
||||||
|
@ -1626,6 +1632,7 @@ const (
|
||||||
IP_FREEBIND = 0xf
|
IP_FREEBIND = 0xf
|
||||||
IP_HDRINCL = 0x3
|
IP_HDRINCL = 0x3
|
||||||
IP_IPSEC_POLICY = 0x10
|
IP_IPSEC_POLICY = 0x10
|
||||||
|
IP_LOCAL_PORT_RANGE = 0x33
|
||||||
IP_MAXPACKET = 0xffff
|
IP_MAXPACKET = 0xffff
|
||||||
IP_MAX_MEMBERSHIPS = 0x14
|
IP_MAX_MEMBERSHIPS = 0x14
|
||||||
IP_MF = 0x2000
|
IP_MF = 0x2000
|
||||||
|
@ -1652,6 +1659,7 @@ const (
|
||||||
IP_PMTUDISC_OMIT = 0x5
|
IP_PMTUDISC_OMIT = 0x5
|
||||||
IP_PMTUDISC_PROBE = 0x3
|
IP_PMTUDISC_PROBE = 0x3
|
||||||
IP_PMTUDISC_WANT = 0x1
|
IP_PMTUDISC_WANT = 0x1
|
||||||
|
IP_PROTOCOL = 0x34
|
||||||
IP_RECVERR = 0xb
|
IP_RECVERR = 0xb
|
||||||
IP_RECVERR_RFC4884 = 0x1a
|
IP_RECVERR_RFC4884 = 0x1a
|
||||||
IP_RECVFRAGSIZE = 0x19
|
IP_RECVFRAGSIZE = 0x19
|
||||||
|
@ -1697,6 +1705,7 @@ const (
|
||||||
KEXEC_ARCH_S390 = 0x160000
|
KEXEC_ARCH_S390 = 0x160000
|
||||||
KEXEC_ARCH_SH = 0x2a0000
|
KEXEC_ARCH_SH = 0x2a0000
|
||||||
KEXEC_ARCH_X86_64 = 0x3e0000
|
KEXEC_ARCH_X86_64 = 0x3e0000
|
||||||
|
KEXEC_FILE_DEBUG = 0x8
|
||||||
KEXEC_FILE_NO_INITRAMFS = 0x4
|
KEXEC_FILE_NO_INITRAMFS = 0x4
|
||||||
KEXEC_FILE_ON_CRASH = 0x2
|
KEXEC_FILE_ON_CRASH = 0x2
|
||||||
KEXEC_FILE_UNLOAD = 0x1
|
KEXEC_FILE_UNLOAD = 0x1
|
||||||
|
@ -1898,6 +1907,7 @@ const (
|
||||||
MNT_DETACH = 0x2
|
MNT_DETACH = 0x2
|
||||||
MNT_EXPIRE = 0x4
|
MNT_EXPIRE = 0x4
|
||||||
MNT_FORCE = 0x1
|
MNT_FORCE = 0x1
|
||||||
|
MNT_ID_REQ_SIZE_VER0 = 0x18
|
||||||
MODULE_INIT_COMPRESSED_FILE = 0x4
|
MODULE_INIT_COMPRESSED_FILE = 0x4
|
||||||
MODULE_INIT_IGNORE_MODVERSIONS = 0x1
|
MODULE_INIT_IGNORE_MODVERSIONS = 0x1
|
||||||
MODULE_INIT_IGNORE_VERMAGIC = 0x2
|
MODULE_INIT_IGNORE_VERMAGIC = 0x2
|
||||||
|
@ -2166,7 +2176,7 @@ const (
|
||||||
NFT_SECMARK_CTX_MAXLEN = 0x100
|
NFT_SECMARK_CTX_MAXLEN = 0x100
|
||||||
NFT_SET_MAXNAMELEN = 0x100
|
NFT_SET_MAXNAMELEN = 0x100
|
||||||
NFT_SOCKET_MAX = 0x3
|
NFT_SOCKET_MAX = 0x3
|
||||||
NFT_TABLE_F_MASK = 0x3
|
NFT_TABLE_F_MASK = 0x7
|
||||||
NFT_TABLE_MAXNAMELEN = 0x100
|
NFT_TABLE_MAXNAMELEN = 0x100
|
||||||
NFT_TRACETYPE_MAX = 0x3
|
NFT_TRACETYPE_MAX = 0x3
|
||||||
NFT_TUNNEL_F_MASK = 0x7
|
NFT_TUNNEL_F_MASK = 0x7
|
||||||
|
@ -2302,6 +2312,7 @@ const (
|
||||||
PERF_AUX_FLAG_PARTIAL = 0x4
|
PERF_AUX_FLAG_PARTIAL = 0x4
|
||||||
PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK = 0xff00
|
PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK = 0xff00
|
||||||
PERF_AUX_FLAG_TRUNCATED = 0x1
|
PERF_AUX_FLAG_TRUNCATED = 0x1
|
||||||
|
PERF_BRANCH_ENTRY_INFO_BITS_MAX = 0x21
|
||||||
PERF_BR_ARM64_DEBUG_DATA = 0x7
|
PERF_BR_ARM64_DEBUG_DATA = 0x7
|
||||||
PERF_BR_ARM64_DEBUG_EXIT = 0x5
|
PERF_BR_ARM64_DEBUG_EXIT = 0x5
|
||||||
PERF_BR_ARM64_DEBUG_HALT = 0x4
|
PERF_BR_ARM64_DEBUG_HALT = 0x4
|
||||||
|
@ -2399,6 +2410,7 @@ const (
|
||||||
PERF_RECORD_MISC_USER = 0x2
|
PERF_RECORD_MISC_USER = 0x2
|
||||||
PERF_SAMPLE_BRANCH_PLM_ALL = 0x7
|
PERF_SAMPLE_BRANCH_PLM_ALL = 0x7
|
||||||
PERF_SAMPLE_WEIGHT_TYPE = 0x1004000
|
PERF_SAMPLE_WEIGHT_TYPE = 0x1004000
|
||||||
|
PID_FS_MAGIC = 0x50494446
|
||||||
PIPEFS_MAGIC = 0x50495045
|
PIPEFS_MAGIC = 0x50495045
|
||||||
PPPIOCGNPMODE = 0xc008744c
|
PPPIOCGNPMODE = 0xc008744c
|
||||||
PPPIOCNEWUNIT = 0xc004743e
|
PPPIOCNEWUNIT = 0xc004743e
|
||||||
|
@ -2892,8 +2904,9 @@ const (
|
||||||
RWF_APPEND = 0x10
|
RWF_APPEND = 0x10
|
||||||
RWF_DSYNC = 0x2
|
RWF_DSYNC = 0x2
|
||||||
RWF_HIPRI = 0x1
|
RWF_HIPRI = 0x1
|
||||||
|
RWF_NOAPPEND = 0x20
|
||||||
RWF_NOWAIT = 0x8
|
RWF_NOWAIT = 0x8
|
||||||
RWF_SUPPORTED = 0x1f
|
RWF_SUPPORTED = 0x3f
|
||||||
RWF_SYNC = 0x4
|
RWF_SYNC = 0x4
|
||||||
RWF_WRITE_LIFE_NOT_SET = 0x0
|
RWF_WRITE_LIFE_NOT_SET = 0x0
|
||||||
SCHED_BATCH = 0x3
|
SCHED_BATCH = 0x3
|
||||||
|
@ -2914,7 +2927,9 @@ const (
|
||||||
SCHED_RESET_ON_FORK = 0x40000000
|
SCHED_RESET_ON_FORK = 0x40000000
|
||||||
SCHED_RR = 0x2
|
SCHED_RR = 0x2
|
||||||
SCM_CREDENTIALS = 0x2
|
SCM_CREDENTIALS = 0x2
|
||||||
|
SCM_PIDFD = 0x4
|
||||||
SCM_RIGHTS = 0x1
|
SCM_RIGHTS = 0x1
|
||||||
|
SCM_SECURITY = 0x3
|
||||||
SCM_TIMESTAMP = 0x1d
|
SCM_TIMESTAMP = 0x1d
|
||||||
SC_LOG_FLUSH = 0x100000
|
SC_LOG_FLUSH = 0x100000
|
||||||
SECCOMP_ADDFD_FLAG_SEND = 0x2
|
SECCOMP_ADDFD_FLAG_SEND = 0x2
|
||||||
|
@ -3047,6 +3062,8 @@ const (
|
||||||
SIOCSMIIREG = 0x8949
|
SIOCSMIIREG = 0x8949
|
||||||
SIOCSRARP = 0x8962
|
SIOCSRARP = 0x8962
|
||||||
SIOCWANDEV = 0x894a
|
SIOCWANDEV = 0x894a
|
||||||
|
SK_DIAG_BPF_STORAGE_MAX = 0x3
|
||||||
|
SK_DIAG_BPF_STORAGE_REQ_MAX = 0x1
|
||||||
SMACK_MAGIC = 0x43415d53
|
SMACK_MAGIC = 0x43415d53
|
||||||
SMART_AUTOSAVE = 0xd2
|
SMART_AUTOSAVE = 0xd2
|
||||||
SMART_AUTO_OFFLINE = 0xdb
|
SMART_AUTO_OFFLINE = 0xdb
|
||||||
|
@ -3067,6 +3084,8 @@ const (
|
||||||
SOCKFS_MAGIC = 0x534f434b
|
SOCKFS_MAGIC = 0x534f434b
|
||||||
SOCK_BUF_LOCK_MASK = 0x3
|
SOCK_BUF_LOCK_MASK = 0x3
|
||||||
SOCK_DCCP = 0x6
|
SOCK_DCCP = 0x6
|
||||||
|
SOCK_DESTROY = 0x15
|
||||||
|
SOCK_DIAG_BY_FAMILY = 0x14
|
||||||
SOCK_IOC_TYPE = 0x89
|
SOCK_IOC_TYPE = 0x89
|
||||||
SOCK_PACKET = 0xa
|
SOCK_PACKET = 0xa
|
||||||
SOCK_RAW = 0x3
|
SOCK_RAW = 0x3
|
||||||
|
@ -3168,6 +3187,7 @@ const (
|
||||||
STATX_GID = 0x10
|
STATX_GID = 0x10
|
||||||
STATX_INO = 0x100
|
STATX_INO = 0x100
|
||||||
STATX_MNT_ID = 0x1000
|
STATX_MNT_ID = 0x1000
|
||||||
|
STATX_MNT_ID_UNIQUE = 0x4000
|
||||||
STATX_MODE = 0x2
|
STATX_MODE = 0x2
|
||||||
STATX_MTIME = 0x40
|
STATX_MTIME = 0x40
|
||||||
STATX_NLINK = 0x4
|
STATX_NLINK = 0x4
|
||||||
|
@ -3255,6 +3275,7 @@ const (
|
||||||
TCP_MAX_WINSHIFT = 0xe
|
TCP_MAX_WINSHIFT = 0xe
|
||||||
TCP_MD5SIG = 0xe
|
TCP_MD5SIG = 0xe
|
||||||
TCP_MD5SIG_EXT = 0x20
|
TCP_MD5SIG_EXT = 0x20
|
||||||
|
TCP_MD5SIG_FLAG_IFINDEX = 0x2
|
||||||
TCP_MD5SIG_FLAG_PREFIX = 0x1
|
TCP_MD5SIG_FLAG_PREFIX = 0x1
|
||||||
TCP_MD5SIG_MAXKEYLEN = 0x50
|
TCP_MD5SIG_MAXKEYLEN = 0x50
|
||||||
TCP_MSS = 0x200
|
TCP_MSS = 0x200
|
||||||
|
@ -3562,12 +3583,16 @@ const (
|
||||||
XDP_RX_RING = 0x2
|
XDP_RX_RING = 0x2
|
||||||
XDP_SHARED_UMEM = 0x1
|
XDP_SHARED_UMEM = 0x1
|
||||||
XDP_STATISTICS = 0x7
|
XDP_STATISTICS = 0x7
|
||||||
|
XDP_TXMD_FLAGS_CHECKSUM = 0x2
|
||||||
|
XDP_TXMD_FLAGS_TIMESTAMP = 0x1
|
||||||
|
XDP_TX_METADATA = 0x2
|
||||||
XDP_TX_RING = 0x3
|
XDP_TX_RING = 0x3
|
||||||
XDP_UMEM_COMPLETION_RING = 0x6
|
XDP_UMEM_COMPLETION_RING = 0x6
|
||||||
XDP_UMEM_FILL_RING = 0x5
|
XDP_UMEM_FILL_RING = 0x5
|
||||||
XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000
|
XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000
|
||||||
XDP_UMEM_PGOFF_FILL_RING = 0x100000000
|
XDP_UMEM_PGOFF_FILL_RING = 0x100000000
|
||||||
XDP_UMEM_REG = 0x4
|
XDP_UMEM_REG = 0x4
|
||||||
|
XDP_UMEM_TX_SW_CSUM = 0x2
|
||||||
XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1
|
XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1
|
||||||
XDP_USE_NEED_WAKEUP = 0x8
|
XDP_USE_NEED_WAKEUP = 0x8
|
||||||
XDP_USE_SG = 0x10
|
XDP_USE_SG = 0x10
|
||||||
|
|
|
@ -118,6 +118,7 @@ const (
|
||||||
IXOFF = 0x1000
|
IXOFF = 0x1000
|
||||||
IXON = 0x400
|
IXON = 0x400
|
||||||
MAP_32BIT = 0x40
|
MAP_32BIT = 0x40
|
||||||
|
MAP_ABOVE4G = 0x80
|
||||||
MAP_ANON = 0x20
|
MAP_ANON = 0x20
|
||||||
MAP_ANONYMOUS = 0x20
|
MAP_ANONYMOUS = 0x20
|
||||||
MAP_DENYWRITE = 0x800
|
MAP_DENYWRITE = 0x800
|
||||||
|
|
|
@ -118,6 +118,7 @@ const (
|
||||||
IXOFF = 0x1000
|
IXOFF = 0x1000
|
||||||
IXON = 0x400
|
IXON = 0x400
|
||||||
MAP_32BIT = 0x40
|
MAP_32BIT = 0x40
|
||||||
|
MAP_ABOVE4G = 0x80
|
||||||
MAP_ANON = 0x20
|
MAP_ANON = 0x20
|
||||||
MAP_ANONYMOUS = 0x20
|
MAP_ANONYMOUS = 0x20
|
||||||
MAP_DENYWRITE = 0x800
|
MAP_DENYWRITE = 0x800
|
||||||
|
|
|
@ -87,6 +87,7 @@ const (
|
||||||
FICLONE = 0x40049409
|
FICLONE = 0x40049409
|
||||||
FICLONERANGE = 0x4020940d
|
FICLONERANGE = 0x4020940d
|
||||||
FLUSHO = 0x1000
|
FLUSHO = 0x1000
|
||||||
|
FPMR_MAGIC = 0x46504d52
|
||||||
FPSIMD_MAGIC = 0x46508001
|
FPSIMD_MAGIC = 0x46508001
|
||||||
FS_IOC_ENABLE_VERITY = 0x40806685
|
FS_IOC_ENABLE_VERITY = 0x40806685
|
||||||
FS_IOC_GETFLAGS = 0x80086601
|
FS_IOC_GETFLAGS = 0x80086601
|
||||||
|
|
|
@ -11,16 +11,41 @@ package unix
|
||||||
|
|
||||||
const (
|
const (
|
||||||
BRKINT = 0x0001
|
BRKINT = 0x0001
|
||||||
|
CLOCAL = 0x1
|
||||||
CLOCK_MONOTONIC = 0x1
|
CLOCK_MONOTONIC = 0x1
|
||||||
CLOCK_PROCESS_CPUTIME_ID = 0x2
|
CLOCK_PROCESS_CPUTIME_ID = 0x2
|
||||||
CLOCK_REALTIME = 0x0
|
CLOCK_REALTIME = 0x0
|
||||||
CLOCK_THREAD_CPUTIME_ID = 0x3
|
CLOCK_THREAD_CPUTIME_ID = 0x3
|
||||||
|
CLONE_NEWIPC = 0x08000000
|
||||||
|
CLONE_NEWNET = 0x40000000
|
||||||
|
CLONE_NEWNS = 0x00020000
|
||||||
|
CLONE_NEWPID = 0x20000000
|
||||||
|
CLONE_NEWUTS = 0x04000000
|
||||||
|
CLONE_PARENT = 0x00008000
|
||||||
CS8 = 0x0030
|
CS8 = 0x0030
|
||||||
CSIZE = 0x0030
|
CSIZE = 0x0030
|
||||||
ECHO = 0x00000008
|
ECHO = 0x00000008
|
||||||
ECHONL = 0x00000001
|
ECHONL = 0x00000001
|
||||||
|
EFD_SEMAPHORE = 0x00002000
|
||||||
|
EFD_CLOEXEC = 0x00001000
|
||||||
|
EFD_NONBLOCK = 0x00000004
|
||||||
|
EPOLL_CLOEXEC = 0x00001000
|
||||||
|
EPOLL_CTL_ADD = 0
|
||||||
|
EPOLL_CTL_MOD = 1
|
||||||
|
EPOLL_CTL_DEL = 2
|
||||||
|
EPOLLRDNORM = 0x0001
|
||||||
|
EPOLLRDBAND = 0x0002
|
||||||
|
EPOLLIN = 0x0003
|
||||||
|
EPOLLOUT = 0x0004
|
||||||
|
EPOLLWRBAND = 0x0008
|
||||||
|
EPOLLPRI = 0x0010
|
||||||
|
EPOLLERR = 0x0020
|
||||||
|
EPOLLHUP = 0x0040
|
||||||
|
EPOLLEXCLUSIVE = 0x20000000
|
||||||
|
EPOLLONESHOT = 0x40000000
|
||||||
FD_CLOEXEC = 0x01
|
FD_CLOEXEC = 0x01
|
||||||
FD_CLOFORK = 0x02
|
FD_CLOFORK = 0x02
|
||||||
|
FD_SETSIZE = 0x800
|
||||||
FNDELAY = 0x04
|
FNDELAY = 0x04
|
||||||
F_CLOSFD = 9
|
F_CLOSFD = 9
|
||||||
F_CONTROL_CVT = 13
|
F_CONTROL_CVT = 13
|
||||||
|
@ -45,6 +70,39 @@ const (
|
||||||
FSTYPE_NFS = 0xd5 //"N"
|
FSTYPE_NFS = 0xd5 //"N"
|
||||||
FSTYPE_TFS = 0xe3 //"T"
|
FSTYPE_TFS = 0xe3 //"T"
|
||||||
FSTYPE_AUTOMOUNT = 0xc1 //"A"
|
FSTYPE_AUTOMOUNT = 0xc1 //"A"
|
||||||
|
GRND_NONBLOCK = 1
|
||||||
|
GRND_RANDOM = 2
|
||||||
|
HUPCL = 0x0100 // Hang up on last close
|
||||||
|
IN_CLOEXEC = 0x00001000
|
||||||
|
IN_NONBLOCK = 0x00000004
|
||||||
|
IN_ACCESS = 0x00000001
|
||||||
|
IN_MODIFY = 0x00000002
|
||||||
|
IN_ATTRIB = 0x00000004
|
||||||
|
IN_CLOSE_WRITE = 0x00000008
|
||||||
|
IN_CLOSE_NOWRITE = 0x00000010
|
||||||
|
IN_OPEN = 0x00000020
|
||||||
|
IN_MOVED_FROM = 0x00000040
|
||||||
|
IN_MOVED_TO = 0x00000080
|
||||||
|
IN_CREATE = 0x00000100
|
||||||
|
IN_DELETE = 0x00000200
|
||||||
|
IN_DELETE_SELF = 0x00000400
|
||||||
|
IN_MOVE_SELF = 0x00000800
|
||||||
|
IN_UNMOUNT = 0x00002000
|
||||||
|
IN_Q_OVERFLOW = 0x00004000
|
||||||
|
IN_IGNORED = 0x00008000
|
||||||
|
IN_CLOSE = (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
|
||||||
|
IN_MOVE = (IN_MOVED_FROM | IN_MOVED_TO)
|
||||||
|
IN_ALL_EVENTS = (IN_ACCESS | IN_MODIFY | IN_ATTRIB |
|
||||||
|
IN_CLOSE | IN_OPEN | IN_MOVE |
|
||||||
|
IN_CREATE | IN_DELETE | IN_DELETE_SELF |
|
||||||
|
IN_MOVE_SELF)
|
||||||
|
IN_ONLYDIR = 0x01000000
|
||||||
|
IN_DONT_FOLLOW = 0x02000000
|
||||||
|
IN_EXCL_UNLINK = 0x04000000
|
||||||
|
IN_MASK_CREATE = 0x10000000
|
||||||
|
IN_MASK_ADD = 0x20000000
|
||||||
|
IN_ISDIR = 0x40000000
|
||||||
|
IN_ONESHOT = 0x80000000
|
||||||
IP6F_MORE_FRAG = 0x0001
|
IP6F_MORE_FRAG = 0x0001
|
||||||
IP6F_OFF_MASK = 0xfff8
|
IP6F_OFF_MASK = 0xfff8
|
||||||
IP6F_RESERVED_MASK = 0x0006
|
IP6F_RESERVED_MASK = 0x0006
|
||||||
|
@ -152,10 +210,18 @@ const (
|
||||||
IP_PKTINFO = 101
|
IP_PKTINFO = 101
|
||||||
IP_RECVPKTINFO = 102
|
IP_RECVPKTINFO = 102
|
||||||
IP_TOS = 2
|
IP_TOS = 2
|
||||||
IP_TTL = 3
|
IP_TTL = 14
|
||||||
IP_UNBLOCK_SOURCE = 11
|
IP_UNBLOCK_SOURCE = 11
|
||||||
|
ICMP6_FILTER = 1
|
||||||
|
MCAST_INCLUDE = 0
|
||||||
|
MCAST_EXCLUDE = 1
|
||||||
|
MCAST_JOIN_GROUP = 40
|
||||||
|
MCAST_LEAVE_GROUP = 41
|
||||||
|
MCAST_JOIN_SOURCE_GROUP = 42
|
||||||
|
MCAST_LEAVE_SOURCE_GROUP = 43
|
||||||
|
MCAST_BLOCK_SOURCE = 44
|
||||||
|
MCAST_UNBLOCK_SOURCE = 46
|
||||||
ICANON = 0x0010
|
ICANON = 0x0010
|
||||||
ICMP6_FILTER = 0x26
|
|
||||||
ICRNL = 0x0002
|
ICRNL = 0x0002
|
||||||
IEXTEN = 0x0020
|
IEXTEN = 0x0020
|
||||||
IGNBRK = 0x0004
|
IGNBRK = 0x0004
|
||||||
|
@ -165,10 +231,10 @@ const (
|
||||||
ISTRIP = 0x0080
|
ISTRIP = 0x0080
|
||||||
IXON = 0x0200
|
IXON = 0x0200
|
||||||
IXOFF = 0x0100
|
IXOFF = 0x0100
|
||||||
LOCK_SH = 0x1 // Not exist on zOS
|
LOCK_SH = 0x1
|
||||||
LOCK_EX = 0x2 // Not exist on zOS
|
LOCK_EX = 0x2
|
||||||
LOCK_NB = 0x4 // Not exist on zOS
|
LOCK_NB = 0x4
|
||||||
LOCK_UN = 0x8 // Not exist on zOS
|
LOCK_UN = 0x8
|
||||||
POLLIN = 0x0003
|
POLLIN = 0x0003
|
||||||
POLLOUT = 0x0004
|
POLLOUT = 0x0004
|
||||||
POLLPRI = 0x0010
|
POLLPRI = 0x0010
|
||||||
|
@ -182,15 +248,29 @@ const (
|
||||||
MAP_PRIVATE = 0x1 // changes are private
|
MAP_PRIVATE = 0x1 // changes are private
|
||||||
MAP_SHARED = 0x2 // changes are shared
|
MAP_SHARED = 0x2 // changes are shared
|
||||||
MAP_FIXED = 0x4 // place exactly
|
MAP_FIXED = 0x4 // place exactly
|
||||||
MCAST_JOIN_GROUP = 40
|
__MAP_MEGA = 0x8
|
||||||
MCAST_LEAVE_GROUP = 41
|
__MAP_64 = 0x10
|
||||||
MCAST_JOIN_SOURCE_GROUP = 42
|
MAP_ANON = 0x20
|
||||||
MCAST_LEAVE_SOURCE_GROUP = 43
|
MAP_ANONYMOUS = 0x20
|
||||||
MCAST_BLOCK_SOURCE = 44
|
|
||||||
MCAST_UNBLOCK_SOURCE = 45
|
|
||||||
MS_SYNC = 0x1 // msync - synchronous writes
|
MS_SYNC = 0x1 // msync - synchronous writes
|
||||||
MS_ASYNC = 0x2 // asynchronous writes
|
MS_ASYNC = 0x2 // asynchronous writes
|
||||||
MS_INVALIDATE = 0x4 // invalidate mappings
|
MS_INVALIDATE = 0x4 // invalidate mappings
|
||||||
|
MS_BIND = 0x00001000
|
||||||
|
MS_MOVE = 0x00002000
|
||||||
|
MS_NOSUID = 0x00000002
|
||||||
|
MS_PRIVATE = 0x00040000
|
||||||
|
MS_REC = 0x00004000
|
||||||
|
MS_REMOUNT = 0x00008000
|
||||||
|
MS_RDONLY = 0x00000001
|
||||||
|
MS_UNBINDABLE = 0x00020000
|
||||||
|
MNT_DETACH = 0x00000004
|
||||||
|
ZOSDSFS_SUPER_MAGIC = 0x44534653 // zOS DSFS
|
||||||
|
NFS_SUPER_MAGIC = 0x6969 // NFS
|
||||||
|
NSFS_MAGIC = 0x6e736673 // PROCNS
|
||||||
|
PROC_SUPER_MAGIC = 0x9fa0 // proc FS
|
||||||
|
ZOSTFS_SUPER_MAGIC = 0x544653 // zOS TFS
|
||||||
|
ZOSUFS_SUPER_MAGIC = 0x554653 // zOS UFS
|
||||||
|
ZOSZFS_SUPER_MAGIC = 0x5A4653 // zOS ZFS
|
||||||
MTM_RDONLY = 0x80000000
|
MTM_RDONLY = 0x80000000
|
||||||
MTM_RDWR = 0x40000000
|
MTM_RDWR = 0x40000000
|
||||||
MTM_UMOUNT = 0x10000000
|
MTM_UMOUNT = 0x10000000
|
||||||
|
@ -205,13 +285,20 @@ const (
|
||||||
MTM_REMOUNT = 0x00000100
|
MTM_REMOUNT = 0x00000100
|
||||||
MTM_NOSECURITY = 0x00000080
|
MTM_NOSECURITY = 0x00000080
|
||||||
NFDBITS = 0x20
|
NFDBITS = 0x20
|
||||||
|
ONLRET = 0x0020 // NL performs CR function
|
||||||
O_ACCMODE = 0x03
|
O_ACCMODE = 0x03
|
||||||
O_APPEND = 0x08
|
O_APPEND = 0x08
|
||||||
O_ASYNCSIG = 0x0200
|
O_ASYNCSIG = 0x0200
|
||||||
O_CREAT = 0x80
|
O_CREAT = 0x80
|
||||||
|
O_DIRECT = 0x00002000
|
||||||
|
O_NOFOLLOW = 0x00004000
|
||||||
|
O_DIRECTORY = 0x00008000
|
||||||
|
O_PATH = 0x00080000
|
||||||
|
O_CLOEXEC = 0x00001000
|
||||||
O_EXCL = 0x40
|
O_EXCL = 0x40
|
||||||
O_GETFL = 0x0F
|
O_GETFL = 0x0F
|
||||||
O_LARGEFILE = 0x0400
|
O_LARGEFILE = 0x0400
|
||||||
|
O_NDELAY = 0x4
|
||||||
O_NONBLOCK = 0x04
|
O_NONBLOCK = 0x04
|
||||||
O_RDONLY = 0x02
|
O_RDONLY = 0x02
|
||||||
O_RDWR = 0x03
|
O_RDWR = 0x03
|
||||||
|
@ -248,6 +335,7 @@ const (
|
||||||
AF_IUCV = 17
|
AF_IUCV = 17
|
||||||
AF_LAT = 14
|
AF_LAT = 14
|
||||||
AF_LINK = 18
|
AF_LINK = 18
|
||||||
|
AF_LOCAL = AF_UNIX // AF_LOCAL is an alias for AF_UNIX
|
||||||
AF_MAX = 30
|
AF_MAX = 30
|
||||||
AF_NBS = 7
|
AF_NBS = 7
|
||||||
AF_NDD = 23
|
AF_NDD = 23
|
||||||
|
@ -285,15 +373,33 @@ const (
|
||||||
RLIMIT_AS = 5
|
RLIMIT_AS = 5
|
||||||
RLIMIT_NOFILE = 6
|
RLIMIT_NOFILE = 6
|
||||||
RLIMIT_MEMLIMIT = 7
|
RLIMIT_MEMLIMIT = 7
|
||||||
|
RLIMIT_MEMLOCK = 0x8
|
||||||
RLIM_INFINITY = 2147483647
|
RLIM_INFINITY = 2147483647
|
||||||
|
SCHED_FIFO = 0x2
|
||||||
|
SCM_CREDENTIALS = 0x2
|
||||||
SCM_RIGHTS = 0x01
|
SCM_RIGHTS = 0x01
|
||||||
SF_CLOSE = 0x00000002
|
SF_CLOSE = 0x00000002
|
||||||
SF_REUSE = 0x00000001
|
SF_REUSE = 0x00000001
|
||||||
|
SHM_RND = 0x2
|
||||||
|
SHM_RDONLY = 0x1
|
||||||
|
SHMLBA = 0x1000
|
||||||
|
IPC_STAT = 0x3
|
||||||
|
IPC_SET = 0x2
|
||||||
|
IPC_RMID = 0x1
|
||||||
|
IPC_PRIVATE = 0x0
|
||||||
|
IPC_CREAT = 0x1000000
|
||||||
|
__IPC_MEGA = 0x4000000
|
||||||
|
__IPC_SHAREAS = 0x20000000
|
||||||
|
__IPC_BELOWBAR = 0x10000000
|
||||||
|
IPC_EXCL = 0x2000000
|
||||||
|
__IPC_GIGA = 0x8000000
|
||||||
SHUT_RD = 0
|
SHUT_RD = 0
|
||||||
SHUT_RDWR = 2
|
SHUT_RDWR = 2
|
||||||
SHUT_WR = 1
|
SHUT_WR = 1
|
||||||
|
SOCK_CLOEXEC = 0x00001000
|
||||||
SOCK_CONN_DGRAM = 6
|
SOCK_CONN_DGRAM = 6
|
||||||
SOCK_DGRAM = 2
|
SOCK_DGRAM = 2
|
||||||
|
SOCK_NONBLOCK = 0x800
|
||||||
SOCK_RAW = 3
|
SOCK_RAW = 3
|
||||||
SOCK_RDM = 4
|
SOCK_RDM = 4
|
||||||
SOCK_SEQPACKET = 5
|
SOCK_SEQPACKET = 5
|
||||||
|
@ -378,8 +484,6 @@ const (
|
||||||
S_IFMST = 0x00FF0000
|
S_IFMST = 0x00FF0000
|
||||||
TCP_KEEPALIVE = 0x8
|
TCP_KEEPALIVE = 0x8
|
||||||
TCP_NODELAY = 0x1
|
TCP_NODELAY = 0x1
|
||||||
TCP_INFO = 0xb
|
|
||||||
TCP_USER_TIMEOUT = 0x1
|
|
||||||
TIOCGWINSZ = 0x4008a368
|
TIOCGWINSZ = 0x4008a368
|
||||||
TIOCSWINSZ = 0x8008a367
|
TIOCSWINSZ = 0x8008a367
|
||||||
TIOCSBRK = 0x2000a77b
|
TIOCSBRK = 0x2000a77b
|
||||||
|
@ -427,7 +531,10 @@ const (
|
||||||
VSUSP = 9
|
VSUSP = 9
|
||||||
VTIME = 10
|
VTIME = 10
|
||||||
WCONTINUED = 0x4
|
WCONTINUED = 0x4
|
||||||
|
WEXITED = 0x8
|
||||||
WNOHANG = 0x1
|
WNOHANG = 0x1
|
||||||
|
WNOWAIT = 0x20
|
||||||
|
WSTOPPED = 0x10
|
||||||
WUNTRACED = 0x2
|
WUNTRACED = 0x2
|
||||||
_BPX_SWAP = 1
|
_BPX_SWAP = 1
|
||||||
_BPX_NONSWAP = 2
|
_BPX_NONSWAP = 2
|
||||||
|
@ -452,8 +559,28 @@ const (
|
||||||
MADV_FREE = 15 // for Linux compatibility -- no zos semantics
|
MADV_FREE = 15 // for Linux compatibility -- no zos semantics
|
||||||
MADV_WIPEONFORK = 16 // for Linux compatibility -- no zos semantics
|
MADV_WIPEONFORK = 16 // for Linux compatibility -- no zos semantics
|
||||||
MADV_KEEPONFORK = 17 // for Linux compatibility -- no zos semantics
|
MADV_KEEPONFORK = 17 // for Linux compatibility -- no zos semantics
|
||||||
AT_SYMLINK_NOFOLLOW = 1 // for Unix compatibility -- no zos semantics
|
AT_SYMLINK_FOLLOW = 0x400
|
||||||
AT_FDCWD = 2 // for Unix compatibility -- no zos semantics
|
AT_SYMLINK_NOFOLLOW = 0x100
|
||||||
|
XATTR_CREATE = 0x1
|
||||||
|
XATTR_REPLACE = 0x2
|
||||||
|
P_PID = 0
|
||||||
|
P_PGID = 1
|
||||||
|
P_ALL = 2
|
||||||
|
PR_SET_NAME = 15
|
||||||
|
PR_GET_NAME = 16
|
||||||
|
PR_SET_NO_NEW_PRIVS = 38
|
||||||
|
PR_GET_NO_NEW_PRIVS = 39
|
||||||
|
PR_SET_DUMPABLE = 4
|
||||||
|
PR_GET_DUMPABLE = 3
|
||||||
|
PR_SET_PDEATHSIG = 1
|
||||||
|
PR_GET_PDEATHSIG = 2
|
||||||
|
PR_SET_CHILD_SUBREAPER = 36
|
||||||
|
PR_GET_CHILD_SUBREAPER = 37
|
||||||
|
AT_FDCWD = -100
|
||||||
|
AT_EACCESS = 0x200
|
||||||
|
AT_EMPTY_PATH = 0x1000
|
||||||
|
AT_REMOVEDIR = 0x200
|
||||||
|
RENAME_NOREPLACE = 1 << 0
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -476,6 +603,7 @@ const (
|
||||||
EMLINK = Errno(125)
|
EMLINK = Errno(125)
|
||||||
ENAMETOOLONG = Errno(126)
|
ENAMETOOLONG = Errno(126)
|
||||||
ENFILE = Errno(127)
|
ENFILE = Errno(127)
|
||||||
|
ENOATTR = Errno(265)
|
||||||
ENODEV = Errno(128)
|
ENODEV = Errno(128)
|
||||||
ENOENT = Errno(129)
|
ENOENT = Errno(129)
|
||||||
ENOEXEC = Errno(130)
|
ENOEXEC = Errno(130)
|
||||||
|
@ -700,7 +828,7 @@ var errorList = [...]struct {
|
||||||
{145, "EDC5145I", "The parameter list is too long, or the message to receive was too large for the buffer."},
|
{145, "EDC5145I", "The parameter list is too long, or the message to receive was too large for the buffer."},
|
||||||
{146, "EDC5146I", "Too many levels of symbolic links."},
|
{146, "EDC5146I", "Too many levels of symbolic links."},
|
||||||
{147, "EDC5147I", "Illegal byte sequence."},
|
{147, "EDC5147I", "Illegal byte sequence."},
|
||||||
{148, "", ""},
|
{148, "EDC5148I", "The named attribute or data not available."},
|
||||||
{149, "EDC5149I", "Value Overflow Error."},
|
{149, "EDC5149I", "Value Overflow Error."},
|
||||||
{150, "EDC5150I", "UNIX System Services is not active."},
|
{150, "EDC5150I", "UNIX System Services is not active."},
|
||||||
{151, "EDC5151I", "Dynamic allocation error."},
|
{151, "EDC5151I", "Dynamic allocation error."},
|
||||||
|
@ -743,6 +871,7 @@ var errorList = [...]struct {
|
||||||
{259, "EDC5259I", "A CUN_RS_NO_CONVERSION error was issued by Unicode Services."},
|
{259, "EDC5259I", "A CUN_RS_NO_CONVERSION error was issued by Unicode Services."},
|
||||||
{260, "EDC5260I", "A CUN_RS_TABLE_NOT_ALIGNED error was issued by Unicode Services."},
|
{260, "EDC5260I", "A CUN_RS_TABLE_NOT_ALIGNED error was issued by Unicode Services."},
|
||||||
{262, "EDC5262I", "An iconv() function encountered an unexpected error while using Unicode Services."},
|
{262, "EDC5262I", "An iconv() function encountered an unexpected error while using Unicode Services."},
|
||||||
|
{265, "EDC5265I", "The named attribute not available."},
|
||||||
{1000, "EDC8000I", "A bad socket-call constant was found in the IUCV header."},
|
{1000, "EDC8000I", "A bad socket-call constant was found in the IUCV header."},
|
||||||
{1001, "EDC8001I", "An error was found in the IUCV header."},
|
{1001, "EDC8001I", "An error was found in the IUCV header."},
|
||||||
{1002, "EDC8002I", "A socket descriptor is out of range."},
|
{1002, "EDC8002I", "A socket descriptor is out of range."},
|
||||||
|
|
|
@ -0,0 +1,364 @@
|
||||||
|
// go run mksyscall_zos_s390x.go -o_sysnum zsysnum_zos_s390x.go -o_syscall zsyscall_zos_s390x.go -i_syscall syscall_zos_s390x.go -o_asm zsymaddr_zos_s390x.s
|
||||||
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build zos && s390x
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
// provide the address of function variable to be fixed up.
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FlistxattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Flistxattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FremovexattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Fremovexattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FgetxattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Fgetxattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FsetxattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Fsetxattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_accept4Addr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·accept4(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_RemovexattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Removexattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_Dup3Addr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Dup3(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_DirfdAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Dirfd(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_EpollCreateAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·EpollCreate(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_EpollCreate1Addr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·EpollCreate1(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_EpollCtlAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·EpollCtl(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_EpollPwaitAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·EpollPwait(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_EpollWaitAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·EpollWait(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_EventfdAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Eventfd(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FaccessatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Faccessat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FchmodatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Fchmodat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FchownatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Fchownat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FdatasyncAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Fdatasync(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_fstatatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·fstatat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_LgetxattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Lgetxattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_LsetxattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Lsetxattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FstatfsAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Fstatfs(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FutimesAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Futimes(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_FutimesatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Futimesat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_GetrandomAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Getrandom(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_InotifyInitAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·InotifyInit(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_InotifyInit1Addr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·InotifyInit1(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_InotifyAddWatchAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·InotifyAddWatch(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_InotifyRmWatchAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·InotifyRmWatch(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_ListxattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Listxattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_LlistxattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Llistxattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_LremovexattrAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Lremovexattr(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_LutimesAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Lutimes(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_StatfsAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Statfs(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_SyncfsAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Syncfs(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_UnshareAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Unshare(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_LinkatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Linkat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_MkdiratAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Mkdirat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_MknodatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Mknodat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_PivotRootAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·PivotRoot(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_PrctlAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Prctl(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_PrlimitAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Prlimit(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_RenameatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Renameat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_Renameat2Addr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Renameat2(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_SethostnameAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Sethostname(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_SetnsAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Setns(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_SymlinkatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Symlinkat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_UnlinkatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·Unlinkat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_openatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·openat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_openat2Addr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·openat2(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
TEXT ·get_utimensatAddr(SB), NOSPLIT|NOFRAME, $0-8
|
||||||
|
MOVD $·utimensat(SB), R8
|
||||||
|
MOVD R8, ret+0(FP)
|
||||||
|
RET
|
File diff suppressed because it is too large
Load Diff
|
@ -452,4 +452,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
|
@ -374,4 +374,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
|
@ -416,4 +416,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
|
@ -319,4 +319,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
|
@ -313,4 +313,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
|
@ -436,4 +436,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 4454
|
SYS_FUTEX_WAKE = 4454
|
||||||
SYS_FUTEX_WAIT = 4455
|
SYS_FUTEX_WAIT = 4455
|
||||||
SYS_FUTEX_REQUEUE = 4456
|
SYS_FUTEX_REQUEUE = 4456
|
||||||
|
SYS_STATMOUNT = 4457
|
||||||
|
SYS_LISTMOUNT = 4458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 4459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 4460
|
||||||
|
SYS_LSM_LIST_MODULES = 4461
|
||||||
)
|
)
|
||||||
|
|
|
@ -366,4 +366,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 5454
|
SYS_FUTEX_WAKE = 5454
|
||||||
SYS_FUTEX_WAIT = 5455
|
SYS_FUTEX_WAIT = 5455
|
||||||
SYS_FUTEX_REQUEUE = 5456
|
SYS_FUTEX_REQUEUE = 5456
|
||||||
|
SYS_STATMOUNT = 5457
|
||||||
|
SYS_LISTMOUNT = 5458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 5459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 5460
|
||||||
|
SYS_LSM_LIST_MODULES = 5461
|
||||||
)
|
)
|
||||||
|
|
|
@ -366,4 +366,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 5454
|
SYS_FUTEX_WAKE = 5454
|
||||||
SYS_FUTEX_WAIT = 5455
|
SYS_FUTEX_WAIT = 5455
|
||||||
SYS_FUTEX_REQUEUE = 5456
|
SYS_FUTEX_REQUEUE = 5456
|
||||||
|
SYS_STATMOUNT = 5457
|
||||||
|
SYS_LISTMOUNT = 5458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 5459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 5460
|
||||||
|
SYS_LSM_LIST_MODULES = 5461
|
||||||
)
|
)
|
||||||
|
|
|
@ -436,4 +436,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 4454
|
SYS_FUTEX_WAKE = 4454
|
||||||
SYS_FUTEX_WAIT = 4455
|
SYS_FUTEX_WAIT = 4455
|
||||||
SYS_FUTEX_REQUEUE = 4456
|
SYS_FUTEX_REQUEUE = 4456
|
||||||
|
SYS_STATMOUNT = 4457
|
||||||
|
SYS_LISTMOUNT = 4458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 4459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 4460
|
||||||
|
SYS_LSM_LIST_MODULES = 4461
|
||||||
)
|
)
|
||||||
|
|
|
@ -443,4 +443,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
|
@ -415,4 +415,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
|
@ -415,4 +415,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
|
@ -320,4 +320,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
|
@ -381,4 +381,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
|
@ -394,4 +394,9 @@ const (
|
||||||
SYS_FUTEX_WAKE = 454
|
SYS_FUTEX_WAKE = 454
|
||||||
SYS_FUTEX_WAIT = 455
|
SYS_FUTEX_WAIT = 455
|
||||||
SYS_FUTEX_REQUEUE = 456
|
SYS_FUTEX_REQUEUE = 456
|
||||||
|
SYS_STATMOUNT = 457
|
||||||
|
SYS_LISTMOUNT = 458
|
||||||
|
SYS_LSM_GET_SELF_ATTR = 459
|
||||||
|
SYS_LSM_SET_SELF_ATTR = 460
|
||||||
|
SYS_LSM_LIST_MODULES = 461
|
||||||
)
|
)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1178,7 +1178,8 @@ const (
|
||||||
PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 0x10
|
PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 0x10
|
||||||
PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 0x11
|
PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 0x11
|
||||||
PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 0x12
|
PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 0x12
|
||||||
PERF_SAMPLE_BRANCH_MAX_SHIFT = 0x13
|
PERF_SAMPLE_BRANCH_COUNTERS = 0x80000
|
||||||
|
PERF_SAMPLE_BRANCH_MAX_SHIFT = 0x14
|
||||||
PERF_SAMPLE_BRANCH_USER = 0x1
|
PERF_SAMPLE_BRANCH_USER = 0x1
|
||||||
PERF_SAMPLE_BRANCH_KERNEL = 0x2
|
PERF_SAMPLE_BRANCH_KERNEL = 0x2
|
||||||
PERF_SAMPLE_BRANCH_HV = 0x4
|
PERF_SAMPLE_BRANCH_HV = 0x4
|
||||||
|
@ -1198,7 +1199,7 @@ const (
|
||||||
PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000
|
PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000
|
||||||
PERF_SAMPLE_BRANCH_HW_INDEX = 0x20000
|
PERF_SAMPLE_BRANCH_HW_INDEX = 0x20000
|
||||||
PERF_SAMPLE_BRANCH_PRIV_SAVE = 0x40000
|
PERF_SAMPLE_BRANCH_PRIV_SAVE = 0x40000
|
||||||
PERF_SAMPLE_BRANCH_MAX = 0x80000
|
PERF_SAMPLE_BRANCH_MAX = 0x100000
|
||||||
PERF_BR_UNKNOWN = 0x0
|
PERF_BR_UNKNOWN = 0x0
|
||||||
PERF_BR_COND = 0x1
|
PERF_BR_COND = 0x1
|
||||||
PERF_BR_UNCOND = 0x2
|
PERF_BR_UNCOND = 0x2
|
||||||
|
@ -2481,6 +2482,15 @@ type XDPMmapOffsets struct {
|
||||||
Cr XDPRingOffset
|
Cr XDPRingOffset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type XDPUmemReg struct {
|
||||||
|
Addr uint64
|
||||||
|
Len uint64
|
||||||
|
Chunk_size uint32
|
||||||
|
Headroom uint32
|
||||||
|
Flags uint32
|
||||||
|
Tx_metadata_len uint32
|
||||||
|
}
|
||||||
|
|
||||||
type XDPStatistics struct {
|
type XDPStatistics struct {
|
||||||
Rx_dropped uint64
|
Rx_dropped uint64
|
||||||
Rx_invalid_descs uint64
|
Rx_invalid_descs uint64
|
||||||
|
@ -2935,7 +2945,7 @@ const (
|
||||||
BPF_TCP_LISTEN = 0xa
|
BPF_TCP_LISTEN = 0xa
|
||||||
BPF_TCP_CLOSING = 0xb
|
BPF_TCP_CLOSING = 0xb
|
||||||
BPF_TCP_NEW_SYN_RECV = 0xc
|
BPF_TCP_NEW_SYN_RECV = 0xc
|
||||||
BPF_TCP_MAX_STATES = 0xd
|
BPF_TCP_MAX_STATES = 0xe
|
||||||
TCP_BPF_IW = 0x3e9
|
TCP_BPF_IW = 0x3e9
|
||||||
TCP_BPF_SNDCWND_CLAMP = 0x3ea
|
TCP_BPF_SNDCWND_CLAMP = 0x3ea
|
||||||
TCP_BPF_DELACK_MAX = 0x3eb
|
TCP_BPF_DELACK_MAX = 0x3eb
|
||||||
|
@ -3211,7 +3221,7 @@ const (
|
||||||
DEVLINK_CMD_LINECARD_NEW = 0x50
|
DEVLINK_CMD_LINECARD_NEW = 0x50
|
||||||
DEVLINK_CMD_LINECARD_DEL = 0x51
|
DEVLINK_CMD_LINECARD_DEL = 0x51
|
||||||
DEVLINK_CMD_SELFTESTS_GET = 0x52
|
DEVLINK_CMD_SELFTESTS_GET = 0x52
|
||||||
DEVLINK_CMD_MAX = 0x53
|
DEVLINK_CMD_MAX = 0x54
|
||||||
DEVLINK_PORT_TYPE_NOTSET = 0x0
|
DEVLINK_PORT_TYPE_NOTSET = 0x0
|
||||||
DEVLINK_PORT_TYPE_AUTO = 0x1
|
DEVLINK_PORT_TYPE_AUTO = 0x1
|
||||||
DEVLINK_PORT_TYPE_ETH = 0x2
|
DEVLINK_PORT_TYPE_ETH = 0x2
|
||||||
|
@ -4595,7 +4605,7 @@ const (
|
||||||
NL80211_ATTR_MAC_HINT = 0xc8
|
NL80211_ATTR_MAC_HINT = 0xc8
|
||||||
NL80211_ATTR_MAC_MASK = 0xd7
|
NL80211_ATTR_MAC_MASK = 0xd7
|
||||||
NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca
|
NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca
|
||||||
NL80211_ATTR_MAX = 0x146
|
NL80211_ATTR_MAX = 0x14a
|
||||||
NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4
|
NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4
|
||||||
NL80211_ATTR_MAX_CSA_COUNTERS = 0xce
|
NL80211_ATTR_MAX_CSA_COUNTERS = 0xce
|
||||||
NL80211_ATTR_MAX_MATCH_SETS = 0x85
|
NL80211_ATTR_MAX_MATCH_SETS = 0x85
|
||||||
|
@ -4861,7 +4871,7 @@ const (
|
||||||
NL80211_BSS_FREQUENCY_OFFSET = 0x14
|
NL80211_BSS_FREQUENCY_OFFSET = 0x14
|
||||||
NL80211_BSS_INFORMATION_ELEMENTS = 0x6
|
NL80211_BSS_INFORMATION_ELEMENTS = 0x6
|
||||||
NL80211_BSS_LAST_SEEN_BOOTTIME = 0xf
|
NL80211_BSS_LAST_SEEN_BOOTTIME = 0xf
|
||||||
NL80211_BSS_MAX = 0x16
|
NL80211_BSS_MAX = 0x18
|
||||||
NL80211_BSS_MLD_ADDR = 0x16
|
NL80211_BSS_MLD_ADDR = 0x16
|
||||||
NL80211_BSS_MLO_LINK_ID = 0x15
|
NL80211_BSS_MLO_LINK_ID = 0x15
|
||||||
NL80211_BSS_PAD = 0x10
|
NL80211_BSS_PAD = 0x10
|
||||||
|
@ -4965,7 +4975,7 @@ const (
|
||||||
NL80211_CMD_LEAVE_IBSS = 0x2c
|
NL80211_CMD_LEAVE_IBSS = 0x2c
|
||||||
NL80211_CMD_LEAVE_MESH = 0x45
|
NL80211_CMD_LEAVE_MESH = 0x45
|
||||||
NL80211_CMD_LEAVE_OCB = 0x6d
|
NL80211_CMD_LEAVE_OCB = 0x6d
|
||||||
NL80211_CMD_MAX = 0x9a
|
NL80211_CMD_MAX = 0x9b
|
||||||
NL80211_CMD_MICHAEL_MIC_FAILURE = 0x29
|
NL80211_CMD_MICHAEL_MIC_FAILURE = 0x29
|
||||||
NL80211_CMD_MODIFY_LINK_STA = 0x97
|
NL80211_CMD_MODIFY_LINK_STA = 0x97
|
||||||
NL80211_CMD_NAN_MATCH = 0x78
|
NL80211_CMD_NAN_MATCH = 0x78
|
||||||
|
@ -5199,7 +5209,7 @@ const (
|
||||||
NL80211_FREQUENCY_ATTR_GO_CONCURRENT = 0xf
|
NL80211_FREQUENCY_ATTR_GO_CONCURRENT = 0xf
|
||||||
NL80211_FREQUENCY_ATTR_INDOOR_ONLY = 0xe
|
NL80211_FREQUENCY_ATTR_INDOOR_ONLY = 0xe
|
||||||
NL80211_FREQUENCY_ATTR_IR_CONCURRENT = 0xf
|
NL80211_FREQUENCY_ATTR_IR_CONCURRENT = 0xf
|
||||||
NL80211_FREQUENCY_ATTR_MAX = 0x1c
|
NL80211_FREQUENCY_ATTR_MAX = 0x20
|
||||||
NL80211_FREQUENCY_ATTR_MAX_TX_POWER = 0x6
|
NL80211_FREQUENCY_ATTR_MAX_TX_POWER = 0x6
|
||||||
NL80211_FREQUENCY_ATTR_NO_10MHZ = 0x11
|
NL80211_FREQUENCY_ATTR_NO_10MHZ = 0x11
|
||||||
NL80211_FREQUENCY_ATTR_NO_160MHZ = 0xc
|
NL80211_FREQUENCY_ATTR_NO_160MHZ = 0xc
|
||||||
|
@ -5693,7 +5703,7 @@ const (
|
||||||
NL80211_STA_FLAG_ASSOCIATED = 0x7
|
NL80211_STA_FLAG_ASSOCIATED = 0x7
|
||||||
NL80211_STA_FLAG_AUTHENTICATED = 0x5
|
NL80211_STA_FLAG_AUTHENTICATED = 0x5
|
||||||
NL80211_STA_FLAG_AUTHORIZED = 0x1
|
NL80211_STA_FLAG_AUTHORIZED = 0x1
|
||||||
NL80211_STA_FLAG_MAX = 0x7
|
NL80211_STA_FLAG_MAX = 0x8
|
||||||
NL80211_STA_FLAG_MAX_OLD_API = 0x6
|
NL80211_STA_FLAG_MAX_OLD_API = 0x6
|
||||||
NL80211_STA_FLAG_MFP = 0x4
|
NL80211_STA_FLAG_MFP = 0x4
|
||||||
NL80211_STA_FLAG_SHORT_PREAMBLE = 0x2
|
NL80211_STA_FLAG_SHORT_PREAMBLE = 0x2
|
||||||
|
@ -5991,3 +6001,34 @@ type CachestatRange struct {
|
||||||
Off uint64
|
Off uint64
|
||||||
Len uint64
|
Len uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
SK_MEMINFO_RMEM_ALLOC = 0x0
|
||||||
|
SK_MEMINFO_RCVBUF = 0x1
|
||||||
|
SK_MEMINFO_WMEM_ALLOC = 0x2
|
||||||
|
SK_MEMINFO_SNDBUF = 0x3
|
||||||
|
SK_MEMINFO_FWD_ALLOC = 0x4
|
||||||
|
SK_MEMINFO_WMEM_QUEUED = 0x5
|
||||||
|
SK_MEMINFO_OPTMEM = 0x6
|
||||||
|
SK_MEMINFO_BACKLOG = 0x7
|
||||||
|
SK_MEMINFO_DROPS = 0x8
|
||||||
|
SK_MEMINFO_VARS = 0x9
|
||||||
|
SKNLGRP_NONE = 0x0
|
||||||
|
SKNLGRP_INET_TCP_DESTROY = 0x1
|
||||||
|
SKNLGRP_INET_UDP_DESTROY = 0x2
|
||||||
|
SKNLGRP_INET6_TCP_DESTROY = 0x3
|
||||||
|
SKNLGRP_INET6_UDP_DESTROY = 0x4
|
||||||
|
SK_DIAG_BPF_STORAGE_REQ_NONE = 0x0
|
||||||
|
SK_DIAG_BPF_STORAGE_REQ_MAP_FD = 0x1
|
||||||
|
SK_DIAG_BPF_STORAGE_REP_NONE = 0x0
|
||||||
|
SK_DIAG_BPF_STORAGE = 0x1
|
||||||
|
SK_DIAG_BPF_STORAGE_NONE = 0x0
|
||||||
|
SK_DIAG_BPF_STORAGE_PAD = 0x1
|
||||||
|
SK_DIAG_BPF_STORAGE_MAP_ID = 0x2
|
||||||
|
SK_DIAG_BPF_STORAGE_MAP_VALUE = 0x3
|
||||||
|
)
|
||||||
|
|
||||||
|
type SockDiagReq struct {
|
||||||
|
Family uint8
|
||||||
|
Protocol uint8
|
||||||
|
}
|
||||||
|
|
|
@ -477,14 +477,6 @@ const (
|
||||||
BLKPG = 0x1269
|
BLKPG = 0x1269
|
||||||
)
|
)
|
||||||
|
|
||||||
type XDPUmemReg struct {
|
|
||||||
Addr uint64
|
|
||||||
Len uint64
|
|
||||||
Size uint32
|
|
||||||
Headroom uint32
|
|
||||||
Flags uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
type CryptoUserAlg struct {
|
type CryptoUserAlg struct {
|
||||||
Name [64]int8
|
Name [64]int8
|
||||||
Driver_name [64]int8
|
Driver_name [64]int8
|
||||||
|
|
|
@ -492,15 +492,6 @@ const (
|
||||||
BLKPG = 0x1269
|
BLKPG = 0x1269
|
||||||
)
|
)
|
||||||
|
|
||||||
type XDPUmemReg struct {
|
|
||||||
Addr uint64
|
|
||||||
Len uint64
|
|
||||||
Size uint32
|
|
||||||
Headroom uint32
|
|
||||||
Flags uint32
|
|
||||||
_ [4]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
type CryptoUserAlg struct {
|
type CryptoUserAlg struct {
|
||||||
Name [64]int8
|
Name [64]int8
|
||||||
Driver_name [64]int8
|
Driver_name [64]int8
|
||||||
|
|
|
@ -470,15 +470,6 @@ const (
|
||||||
BLKPG = 0x1269
|
BLKPG = 0x1269
|
||||||
)
|
)
|
||||||
|
|
||||||
type XDPUmemReg struct {
|
|
||||||
Addr uint64
|
|
||||||
Len uint64
|
|
||||||
Size uint32
|
|
||||||
Headroom uint32
|
|
||||||
Flags uint32
|
|
||||||
_ [4]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
type CryptoUserAlg struct {
|
type CryptoUserAlg struct {
|
||||||
Name [64]uint8
|
Name [64]uint8
|
||||||
Driver_name [64]uint8
|
Driver_name [64]uint8
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue