switch to master version of auth
for https://github.com/go-pkgz/auth/pull/119
This commit is contained in:
+4
-4
@@ -11,7 +11,7 @@ require (
|
||||
github.com/go-chi/chi/v5 v5.0.7
|
||||
github.com/go-chi/cors v1.2.1
|
||||
github.com/go-chi/render v1.0.1
|
||||
github.com/go-pkgz/auth v1.19.0
|
||||
github.com/go-pkgz/auth v1.19.1-0.20220605174438-06e72788bcbb
|
||||
github.com/go-pkgz/jrpc v0.2.0
|
||||
github.com/go-pkgz/lcw v0.8.1
|
||||
github.com/go-pkgz/lgr v0.10.4
|
||||
@@ -39,7 +39,7 @@ require (
|
||||
)
|
||||
|
||||
require (
|
||||
cloud.google.com/go/compute v1.6.0 // indirect
|
||||
cloud.google.com/go/compute v1.6.1 // indirect
|
||||
github.com/andybalholm/cascadia v1.3.1 // indirect
|
||||
github.com/aymerick/douceur v0.2.0 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
@@ -57,7 +57,7 @@ require (
|
||||
github.com/gorilla/websocket v1.5.0 // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/golang-lru v0.5.4 // indirect
|
||||
github.com/klauspost/compress v1.15.1 // indirect
|
||||
github.com/klauspost/compress v1.15.2 // indirect
|
||||
github.com/nullrocks/identicon v0.0.0-20180626043057-7875f45b0022 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
@@ -70,7 +70,7 @@ require (
|
||||
go.mongodb.org/mongo-driver v1.9.1 // indirect
|
||||
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
|
||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
|
||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
golang.org/x/time v0.0.0-20220411224347-583f2d630306 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
|
||||
+18
-19
@@ -35,11 +35,11 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM
|
||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||
cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
|
||||
cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw=
|
||||
cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
|
||||
cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
|
||||
cloud.google.com/go/compute v1.6.0 h1:XdQIN5mdPTSBVwSIVDuY5e8ZzVAccsHvD3qTEz4zIps=
|
||||
cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
|
||||
cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc=
|
||||
cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
|
||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||
@@ -141,8 +141,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-oauth2/oauth2/v4 v4.4.3 h1:IiU3iAK5NEeZ4mUf5HV9tN7iNlx4AGUkIJ5M1C4ARxY=
|
||||
github.com/go-oauth2/oauth2/v4 v4.4.3/go.mod h1:NR9Hugz5/Qe2OGxoPBhsTRNjnm/amC+z9+XTwt63rhs=
|
||||
github.com/go-pkgz/auth v1.19.0 h1:TTfbQvlqsuEhRpYAiY/uF5UGP+HWMc5CN2RAhN06ik0=
|
||||
github.com/go-pkgz/auth v1.19.0/go.mod h1:1pu95rx7tFfeIFq0pjQPwCeL6qGYH4+UxHJudhK0T7M=
|
||||
github.com/go-pkgz/auth v1.19.1-0.20220605174438-06e72788bcbb h1:HYMG+Tto0JVSMPtYkdXR3sT2FbKImFuXctgo9e4OdQw=
|
||||
github.com/go-pkgz/auth v1.19.1-0.20220605174438-06e72788bcbb/go.mod h1:ncL+ePcAf9A7lCKKDAQ6aIs4MTz/Q/g5XIhRx5hap6E=
|
||||
github.com/go-pkgz/email v0.3.0 h1:89FbVF6trHkdn2VVoXlBfZHkdYQ1vLmQ54OhdosaFtc=
|
||||
github.com/go-pkgz/email v0.3.0/go.mod h1:TpnmSLkQW3FyICit2hn7WIhCUDrhCX6btzz5wS3wHRI=
|
||||
github.com/go-pkgz/expirable-cache v0.0.3 h1:rTh6qNPp78z0bQE6HDhXBHUwqnV9i09Vm6dksJLXQDc=
|
||||
@@ -158,7 +158,7 @@ github.com/go-pkgz/notify v0.1.1/go.mod h1:XTzsXgwXXsXbl8iz6qTsCq6gLkaOkimL8mJfL
|
||||
github.com/go-pkgz/repeater v1.1.3 h1:q6+JQF14ESSy28Dd7F+wRelY4F+41HJ0LEy/szNnMiE=
|
||||
github.com/go-pkgz/repeater v1.1.3/go.mod h1:hVTavuO5x3Gxnu8zW7d6sQBfAneKV8X2FjU48kGfpKw=
|
||||
github.com/go-pkgz/rest v1.5.0/go.mod h1:nQaM3RhSTUAmbBZWY4hfe4buyeC9VckvhoCktiQXJxI=
|
||||
github.com/go-pkgz/rest v1.12.2/go.mod h1:KUWAqbDteYGS/CiXftomQsKjtEOifXsJ36Ka0skYbmk=
|
||||
github.com/go-pkgz/rest v1.14.0/go.mod h1:KUWAqbDteYGS/CiXftomQsKjtEOifXsJ36Ka0skYbmk=
|
||||
github.com/go-pkgz/rest v1.15.0 h1:v/BDqJF9robo85GME85GWJ7O/NjtAO0x7LvO4EqWNRE=
|
||||
github.com/go-pkgz/rest v1.15.0/go.mod h1:KUWAqbDteYGS/CiXftomQsKjtEOifXsJ36Ka0skYbmk=
|
||||
github.com/go-pkgz/syncs v1.2.0 h1:aiizQFILlMZ4KtRNaYLcDffRbUQZH9fclsgr5KybWyY=
|
||||
@@ -292,9 +292,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
|
||||
github.com/klauspost/compress v1.10.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A=
|
||||
github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/compress v1.15.2 h1:3WH+AG7s2+T8o3nrM/8u2rdqUEcQhmga7smjrT41nAw=
|
||||
github.com/klauspost/compress v1.15.2/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
|
||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
@@ -388,7 +387,6 @@ github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV
|
||||
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
|
||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
|
||||
github.com/xdg-go/scram v1.1.0/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
|
||||
github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
|
||||
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
|
||||
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
|
||||
@@ -419,7 +417,7 @@ github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb h1:ZkM6LRnq40pR1Ox
|
||||
github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
|
||||
go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
|
||||
go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
|
||||
go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
|
||||
go.mongodb.org/mongo-driver v1.8.5/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
|
||||
go.mongodb.org/mongo-driver v1.9.1 h1:m078y9v7sBItkt1aaoe2YlvWEXcD263e1a4E1fBrJ1c=
|
||||
go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
@@ -439,7 +437,7 @@ 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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898 h1:SLP7Q4Di66FONjDJbCYrCRrh97focO6sLogHO7/g8F0=
|
||||
golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
@@ -454,7 +452,6 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||
golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE=
|
||||
golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
@@ -525,6 +522,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
|
||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y=
|
||||
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
@@ -620,14 +619,13 @@ golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220207234003-57398862261d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
|
||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc=
|
||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
@@ -704,8 +702,9 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U=
|
||||
golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
@@ -737,11 +736,11 @@ google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqiv
|
||||
google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
|
||||
google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
|
||||
google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
|
||||
google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M=
|
||||
google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
|
||||
google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
|
||||
google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
|
||||
google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
|
||||
google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
@@ -810,9 +809,7 @@ google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ6
|
||||
google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
|
||||
google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
|
||||
@@ -821,6 +818,8 @@ google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2
|
||||
google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
|
||||
google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
||||
google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
||||
google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
||||
google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
|
||||
+1
-1
@@ -337,7 +337,7 @@ There are several ways to adjust functionality of the library:
|
||||
1. `SecretReader` - interface with a single method `Get(aud string) string` to return the secret used for JWT signing and verification
|
||||
1. `ClaimsUpdater` - interface with `Update(claims Claims) Claims` method. This is the primary way to alter a token at login time and add any attributes, set ip, email, admin status, roles and so on.
|
||||
1. `Validator` - interface with `Validate(token string, claims Claims) bool` method. This is post-token hook and will be called on **each request** wrapped with `Auth` middleware. This will be the place for special logic to reject some tokens or users.
|
||||
1. `UserUpdater` - interface with `Update(claims token.User) token.User` method. This method will be called on **each request** wrapped with `UpdateUser` middleware. This will be the place for special logic modify User Info in request context. [Example of usage.]((https://github.com/go-pkgz/auth/blob/master/_example/main.go#L148))
|
||||
1. `UserUpdater` - interface with `Update(claims token.User) token.User` method. This method will be called on **each request** wrapped with `UpdateUser` middleware. This will be the place for special logic modify User Info in request context. [Example of usage.](https://github.com/go-pkgz/auth/blob/19c1b6d26608494955a4480f8f6165af85b1deab/_example/main.go#L189)
|
||||
|
||||
All of the interfaces above have corresponding Func adapters - `SecretFunc`, `ClaimsUpdFunc`, `ValidatorFunc` and `UserUpdFunc`.
|
||||
|
||||
|
||||
+5
-6
@@ -8,7 +8,6 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/go-pkgz/rest"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/go-pkgz/auth/avatar"
|
||||
"github.com/go-pkgz/auth/logger"
|
||||
@@ -121,7 +120,7 @@ func NewService(opts Opts) (res *Service) {
|
||||
|
||||
if opts.SecretReader == nil {
|
||||
jwtService.SecretReader = token.SecretFunc(func(string) (string, error) {
|
||||
return "", errors.New("secrets reader not available")
|
||||
return "", fmt.Errorf("secrets reader not available")
|
||||
})
|
||||
res.logger.Logf("[WARN] no secret reader defined")
|
||||
}
|
||||
@@ -170,7 +169,7 @@ func (s *Service) Handlers() (authHandler, avatarHandler http.Handler) {
|
||||
if elems[len(elems)-1] == "logout" {
|
||||
if len(s.providers) == 0 {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
rest.RenderJSON(w, rest.JSON{"error": "provides not defined"})
|
||||
rest.RenderJSON(w, rest.JSON{"error": "providers not defined"})
|
||||
return
|
||||
}
|
||||
s.providers[0].Handler(w, r)
|
||||
@@ -284,7 +283,7 @@ func (s *Service) AddAppleProvider(appleConfig provider.AppleConfig, privKeyLoad
|
||||
// Error checking at create need for catch one when apple private key init
|
||||
appleProvider, err := provider.NewApple(p, appleConfig, privKeyLoader)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "an AppleProvider creating failed")
|
||||
return fmt.Errorf("an AppleProvider creating failed: %w", err)
|
||||
}
|
||||
|
||||
s.providers = append(s.providers, provider.NewService(appleProvider))
|
||||
@@ -365,7 +364,7 @@ func (s *Service) AddCustomHandler(handler provider.Provider) {
|
||||
func (s *Service) DevAuth() (*provider.DevAuthServer, error) {
|
||||
p, err := s.Provider("dev") // peak dev provider
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "dev provider not registered")
|
||||
return nil, fmt.Errorf("dev provider not registered: %w", err)
|
||||
}
|
||||
// make and start dev auth server
|
||||
return &provider.DevAuthServer{Provider: p.Provider.(provider.Oauth2Handler), L: s.logger}, nil
|
||||
@@ -378,7 +377,7 @@ func (s *Service) Provider(name string) (provider.Service, error) {
|
||||
return p, nil
|
||||
}
|
||||
}
|
||||
return provider.Service{}, errors.Errorf("provider %s not found", name)
|
||||
return provider.Service{}, fmt.Errorf("provider %s not found", name)
|
||||
}
|
||||
|
||||
// Providers gets all registered providers
|
||||
|
||||
+11
-9
@@ -17,7 +17,6 @@ import (
|
||||
|
||||
"github.com/go-pkgz/rest"
|
||||
"github.com/nullrocks/identicon"
|
||||
"github.com/pkg/errors"
|
||||
"golang.org/x/image/draw"
|
||||
|
||||
"github.com/go-pkgz/auth/logger"
|
||||
@@ -40,12 +39,12 @@ func (p *Proxy) Put(u token.User, client *http.Client) (avatarURL string, err er
|
||||
genIdenticon := func(userID string) (avatarURL string, err error) {
|
||||
b, e := GenerateAvatar(userID)
|
||||
if e != nil {
|
||||
return "", errors.Wrapf(e, "no picture for %s", userID)
|
||||
return "", fmt.Errorf("no picture for %s: %w", userID, e)
|
||||
}
|
||||
// put returns avatar base name, like 123456.image
|
||||
avatarID, e := p.Store.Put(userID, p.resize(bytes.NewBuffer(b), p.ResizeLimit))
|
||||
if e != nil {
|
||||
return "", err
|
||||
return "", e
|
||||
}
|
||||
|
||||
p.Logf("[DEBUG] saved identicon avatar to %s, user %q", avatarID, u.Name)
|
||||
@@ -88,12 +87,12 @@ func (p *Proxy) load(url string, client *http.Client) (rc io.ReadCloser, err err
|
||||
return e
|
||||
})
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to fetch avatar from the orig")
|
||||
return nil, fmt.Errorf("failed to fetch avatar from the orig: %w", err)
|
||||
}
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
_ = resp.Body.Close() // caller won't close on error
|
||||
return nil, errors.Errorf("failed to get avatar from the orig, status %s", resp.Status)
|
||||
return nil, fmt.Errorf("failed to get avatar from the orig, status %s", resp.Status)
|
||||
}
|
||||
|
||||
return resp.Body, nil
|
||||
@@ -193,12 +192,12 @@ func GenerateAvatar(user string) ([]byte, error) {
|
||||
|
||||
iconGen, err := identicon.New("pkgz/auth", 5, 5)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "can't create identicon service")
|
||||
return nil, fmt.Errorf("can't create identicon service: %w", err)
|
||||
}
|
||||
|
||||
ii, err := iconGen.Draw(user) // generate an IdentIcon
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to draw avatar for %s", user)
|
||||
return nil, fmt.Errorf("failed to draw avatar for %s: %w", user, err)
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
@@ -220,7 +219,7 @@ func GetGravatarURL(email string) (res string, err error) {
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != 200 {
|
||||
return "", errors.New(resp.Status)
|
||||
return "", fmt.Errorf("%s", resp.Status)
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
@@ -232,5 +231,8 @@ func retry(retries int, delay time.Duration, fn func() error) (err error) {
|
||||
}
|
||||
time.Sleep(delay)
|
||||
}
|
||||
return errors.Wrap(err, "retry failed")
|
||||
if err != nil {
|
||||
return fmt.Errorf("retry failed: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
+29
-17
@@ -6,7 +6,6 @@ import (
|
||||
"io"
|
||||
"log"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
@@ -25,17 +24,19 @@ const metasBktName = "metas"
|
||||
func NewBoltDB(fileName string, options bolt.Options) (*BoltDB, error) {
|
||||
db, err := bolt.Open(fileName, 0600, &options) //nolint
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to make boltdb for %s", fileName)
|
||||
return nil, fmt.Errorf("failed to make boltdb for %s: %w", fileName, err)
|
||||
}
|
||||
err = db.Update(func(tx *bolt.Tx) error {
|
||||
if _, e := tx.CreateBucketIfNotExists([]byte(avatarsBktName)); e != nil {
|
||||
return errors.Wrapf(e, "failed to create top level bucket %s", avatarsBktName)
|
||||
return fmt.Errorf("failed to create top level bucket %s: %w", avatarsBktName, e)
|
||||
}
|
||||
_, e := tx.CreateBucketIfNotExists([]byte(metasBktName))
|
||||
return errors.Wrapf(e, "failed to create top metas bucket %s", metasBktName)
|
||||
if _, e := tx.CreateBucketIfNotExists([]byte(metasBktName)); e != nil {
|
||||
return fmt.Errorf("failed to create top metas bucket %s: %w", metasBktName, e)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to initialize boltdb db %q buckets", fileName)
|
||||
return nil, fmt.Errorf("failed to initialize boltdb db %q buckets: %w", fileName, err)
|
||||
}
|
||||
return &BoltDB{db: db, fileName: fileName}, nil
|
||||
}
|
||||
@@ -48,11 +49,11 @@ func (b *BoltDB) Put(userID string, reader io.Reader) (avatar string, err error)
|
||||
err = b.db.Update(func(tx *bolt.Tx) error {
|
||||
buf := &bytes.Buffer{}
|
||||
if _, err = io.Copy(buf, reader); err != nil {
|
||||
return errors.Wrapf(err, "can't read avatar %s", avatarID)
|
||||
return fmt.Errorf("can't read avatar %s: %w", avatarID, err)
|
||||
}
|
||||
|
||||
if err = tx.Bucket([]byte(avatarsBktName)).Put([]byte(avatarID), buf.Bytes()); err != nil {
|
||||
return errors.Wrapf(err, "can't put to bucket with %s", avatarID)
|
||||
return fmt.Errorf("can't put to bucket with %s: %w", avatarID, err)
|
||||
}
|
||||
// store sha1 of the image
|
||||
return tx.Bucket([]byte(metasBktName)).Put([]byte(avatarID), []byte(hash(buf.Bytes(), avatarID)))
|
||||
@@ -66,10 +67,13 @@ func (b *BoltDB) Get(avatarID string) (reader io.ReadCloser, size int, err error
|
||||
err = b.db.View(func(tx *bolt.Tx) error {
|
||||
data := tx.Bucket([]byte(avatarsBktName)).Get([]byte(avatarID))
|
||||
if data == nil {
|
||||
return errors.Errorf("can't load avatar %s", avatarID)
|
||||
return fmt.Errorf("can't load avatar %s", avatarID)
|
||||
}
|
||||
size, err = buf.Write(data)
|
||||
return errors.Wrapf(err, "failed to write for %s", avatarID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to write for %s: %w", avatarID, err)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return io.NopCloser(buf), size, err
|
||||
}
|
||||
@@ -79,7 +83,7 @@ func (b *BoltDB) ID(avatarID string) (id string) {
|
||||
data := []byte{}
|
||||
err := b.db.View(func(tx *bolt.Tx) error {
|
||||
if data = tx.Bucket([]byte(metasBktName)).Get([]byte(avatarID)); data == nil {
|
||||
return errors.Errorf("can't load avatar's id for %s", avatarID)
|
||||
return fmt.Errorf("can't load avatar's id for %s", avatarID)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
@@ -97,13 +101,15 @@ func (b *BoltDB) Remove(avatarID string) (err error) {
|
||||
return b.db.Update(func(tx *bolt.Tx) error {
|
||||
bkt := tx.Bucket([]byte(avatarsBktName))
|
||||
if bkt.Get([]byte(avatarID)) == nil {
|
||||
return errors.Errorf("avatar key not found, %s", avatarID)
|
||||
return fmt.Errorf("avatar key not found, %s", avatarID)
|
||||
}
|
||||
if err = tx.Bucket([]byte(avatarsBktName)).Delete([]byte(avatarID)); err != nil {
|
||||
return errors.Wrapf(err, "can't delete avatar object %s", avatarID)
|
||||
return fmt.Errorf("can't delete avatar object %s: %w", avatarID, err)
|
||||
}
|
||||
return errors.Wrapf(tx.Bucket([]byte(metasBktName)).Delete([]byte(avatarID)),
|
||||
"can't delete meta object %s", avatarID)
|
||||
if err = tx.Bucket([]byte(metasBktName)).Delete([]byte(avatarID)); err != nil {
|
||||
return fmt.Errorf("can't delete meta object %s: %w", avatarID, err)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
@@ -116,12 +122,18 @@ func (b *BoltDB) List() (ids []string, err error) {
|
||||
return nil
|
||||
})
|
||||
})
|
||||
return ids, errors.Wrap(err, "failed to list")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to list: %w", err)
|
||||
}
|
||||
return ids, nil
|
||||
}
|
||||
|
||||
// Close bolt store
|
||||
func (b *BoltDB) Close() error {
|
||||
return errors.Wrapf(b.db.Close(), "failed to close %s", b.fileName)
|
||||
if err := b.db.Close(); err != nil {
|
||||
return fmt.Errorf("failed to close %s: %w", b.fileName, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *BoltDB) String() string {
|
||||
|
||||
+6
-4
@@ -7,7 +7,6 @@ import (
|
||||
"io"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
@@ -38,7 +37,7 @@ func (gf *GridFS) Put(userID string, reader io.Reader) (avatar string, err error
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
if _, err = io.Copy(buf, reader); err != nil {
|
||||
return "", errors.Wrapf(err, "can't read avatar for %s", userID)
|
||||
return "", fmt.Errorf("can't read avatar for %s: %w", userID, err)
|
||||
}
|
||||
|
||||
avaHash := hash(buf.Bytes(), id)
|
||||
@@ -54,7 +53,10 @@ func (gf *GridFS) Get(avatar string) (reader io.ReadCloser, size int, err error)
|
||||
}
|
||||
buf := &bytes.Buffer{}
|
||||
sz, e := bucket.DownloadToStreamByName(avatar, buf)
|
||||
return io.NopCloser(buf), int(sz), errors.Wrapf(e, "can't read avatar %s", avatar)
|
||||
if e != nil {
|
||||
return nil, 0, fmt.Errorf("can't read avatar %s: %w", avatar, e)
|
||||
}
|
||||
return io.NopCloser(buf), int(sz), nil
|
||||
}
|
||||
|
||||
//
|
||||
@@ -112,7 +114,7 @@ func (gf *GridFS) Remove(avatar string) error {
|
||||
}
|
||||
return bucket.Delete(r.ID)
|
||||
}
|
||||
return errors.Errorf("avatar %s not found", avatar)
|
||||
return fmt.Errorf("avatar %s not found", avatar)
|
||||
}
|
||||
|
||||
// List all avatars (ids) on gfs
|
||||
|
||||
+10
-9
@@ -10,8 +10,6 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// LocalFS implements Store for local file system
|
||||
@@ -30,28 +28,28 @@ func NewLocalFS(storePath string) *LocalFS {
|
||||
// userID can be avatarID as well, in this case encoding just strip .image prefix
|
||||
func (fs *LocalFS) Put(userID string, reader io.Reader) (avatar string, err error) {
|
||||
if reader == nil {
|
||||
return "", errors.New("empty reader")
|
||||
return "", fmt.Errorf("empty reader")
|
||||
}
|
||||
id := encodeID(userID)
|
||||
location := fs.location(id) // location adds partition to path
|
||||
|
||||
if e := os.MkdirAll(location, 0o750); e != nil {
|
||||
return "", errors.Wrapf(e, "failed to mkdir avatar location %s", location)
|
||||
return "", fmt.Errorf("failed to mkdir avatar location %s: %w", location, e)
|
||||
}
|
||||
|
||||
avFile := path.Join(location, id+imgSfx)
|
||||
fh, err := os.Create(avFile) //nolint
|
||||
if err != nil {
|
||||
return "", errors.Wrapf(err, "can't create file %s", avFile)
|
||||
return "", fmt.Errorf("can't create file %s: %w", avFile, err)
|
||||
}
|
||||
defer func() { //nolint
|
||||
if e := fh.Close(); e != nil {
|
||||
err = errors.Wrapf(err, "can't close avatar file %s", avFile)
|
||||
err = fmt.Errorf("can't close avatar file %s: %w", avFile, e)
|
||||
}
|
||||
}()
|
||||
|
||||
if _, err = io.Copy(fh, reader); err != nil {
|
||||
return "", errors.Wrapf(err, "can't save file %s", avFile)
|
||||
return "", fmt.Errorf("can't save file %s: %w", avFile, err)
|
||||
}
|
||||
return id + imgSfx, nil
|
||||
}
|
||||
@@ -61,7 +59,7 @@ func (fs *LocalFS) Get(avatar string) (reader io.ReadCloser, size int, err error
|
||||
location := fs.location(strings.TrimSuffix(avatar, imgSfx))
|
||||
fh, err := os.Open(path.Join(location, avatar)) //nolint
|
||||
if err != nil {
|
||||
return nil, 0, errors.Wrapf(err, "can't load avatar %s, id", avatar)
|
||||
return nil, 0, fmt.Errorf("can't load avatar %s, id: %w", avatar, err)
|
||||
}
|
||||
if fi, e := fh.Stat(); e == nil {
|
||||
size = int(fi.Size())
|
||||
@@ -100,7 +98,10 @@ func (fs *LocalFS) List() (ids []string, err error) {
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return ids, errors.Wrap(err, "can't list avatars")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("can't list avatars: %w", err)
|
||||
}
|
||||
return ids, nil
|
||||
}
|
||||
|
||||
// Close gridfs does nothing but satisfies interface
|
||||
|
||||
+4
-5
@@ -17,7 +17,6 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
@@ -53,7 +52,7 @@ func NewStore(uri string) (Store, error) {
|
||||
|
||||
db, bucketName, u, err := parseExtMongoURI(uri)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "can't parse mongo store uri %s", uri)
|
||||
return nil, fmt.Errorf("can't parse mongo store uri %s: %w", uri, err)
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||||
@@ -61,16 +60,16 @@ func NewStore(uri string) (Store, error) {
|
||||
|
||||
client, err := mongo.Connect(ctx, options.Client().ApplyURI(u))
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to connect to mongo server")
|
||||
return nil, fmt.Errorf("failed to connect to mongo server: %w", err)
|
||||
}
|
||||
if err = client.Ping(ctx, nil); err != nil {
|
||||
return nil, errors.Wrap(err, "failed to connect to mongo server")
|
||||
return nil, fmt.Errorf("failed to connect to mongo server: %w", err)
|
||||
}
|
||||
return NewGridFS(client, db, bucketName, time.Second*5), nil
|
||||
case strings.HasPrefix(uri, "bolt://"):
|
||||
return NewBoltDB(strings.TrimPrefix(uri, "bolt://"), bolt.Options{})
|
||||
}
|
||||
return nil, errors.Errorf("can't parse store url %s", uri)
|
||||
return nil, fmt.Errorf("can't parse store url %s", uri)
|
||||
}
|
||||
|
||||
// Migrate avatars between stores
|
||||
|
||||
+8
-9
@@ -6,11 +6,10 @@ package middleware
|
||||
|
||||
import (
|
||||
"crypto/subtle"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/go-pkgz/auth/logger"
|
||||
"github.com/go-pkgz/auth/provider"
|
||||
"github.com/go-pkgz/auth/token"
|
||||
@@ -92,11 +91,11 @@ func (a *Authenticator) auth(reqAuth bool) func(http.Handler) http.Handler {
|
||||
if user, passwd, isBasicAuth := r.BasicAuth(); isBasicAuth {
|
||||
ok, userInfo, err := a.BasicAuthChecker(user, passwd)
|
||||
if err != nil {
|
||||
onError(h, w, r, errors.Wrap(err, "basic auth check failed"))
|
||||
onError(h, w, r, fmt.Errorf("basic auth check failed: %w", err))
|
||||
return
|
||||
}
|
||||
if !ok {
|
||||
onError(h, w, r, errors.Wrap(err, "credentials are wrong for basic auth"))
|
||||
onError(h, w, r, fmt.Errorf("credentials are wrong for basic auth: %w", err))
|
||||
return
|
||||
}
|
||||
r = token.SetUserInfo(r, userInfo) // pass user claims into context of incoming request
|
||||
@@ -107,24 +106,24 @@ func (a *Authenticator) auth(reqAuth bool) func(http.Handler) http.Handler {
|
||||
|
||||
claims, tkn, err := a.JWTService.Get(r)
|
||||
if err != nil {
|
||||
onError(h, w, r, errors.Wrap(err, "can't get token"))
|
||||
onError(h, w, r, fmt.Errorf("can't get token: %w", err))
|
||||
return
|
||||
}
|
||||
|
||||
if claims.Handshake != nil { // handshake in token indicate special use cases, not for login
|
||||
onError(h, w, r, errors.New("invalid kind of token"))
|
||||
onError(h, w, r, fmt.Errorf("invalid kind of token"))
|
||||
return
|
||||
}
|
||||
|
||||
if claims.User == nil {
|
||||
onError(h, w, r, errors.New("no user info presented in the claim"))
|
||||
onError(h, w, r, fmt.Errorf("no user info presented in the claim"))
|
||||
return
|
||||
}
|
||||
|
||||
if claims.User != nil { // if uinfo in token populate it to context
|
||||
// validator passed by client and performs check on token or/and claims
|
||||
if a.Validator != nil && !a.Validator.Validate(tkn, claims) {
|
||||
onError(h, w, r, errors.Errorf("user %s/%s blocked", claims.User.Name, claims.User.ID))
|
||||
onError(h, w, r, fmt.Errorf("user %s/%s blocked", claims.User.Name, claims.User.ID))
|
||||
a.JWTService.Reset(w)
|
||||
return
|
||||
}
|
||||
@@ -132,7 +131,7 @@ func (a *Authenticator) auth(reqAuth bool) func(http.Handler) http.Handler {
|
||||
if a.JWTService.IsExpired(claims) {
|
||||
if claims, err = a.refreshExpiredToken(w, claims, tkn); err != nil {
|
||||
a.JWTService.Reset(w)
|
||||
onError(h, w, r, errors.Wrap(err, "can't refresh token"))
|
||||
onError(h, w, r, fmt.Errorf("can't refresh token: %w", err))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
+8
-9
@@ -25,7 +25,6 @@ import (
|
||||
|
||||
"github.com/go-pkgz/rest"
|
||||
"github.com/golang-jwt/jwt"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/go-pkgz/auth/logger"
|
||||
"github.com/go-pkgz/auth/token"
|
||||
@@ -119,7 +118,7 @@ func LoadApplePrivateKeyFromFile(path string) LoadFromFileFunc {
|
||||
// LoadPrivateKey implement pre-defined (built-in) PrivateKeyLoaderInterface interface method for load private key from local file
|
||||
func (lf LoadFromFileFunc) LoadPrivateKey() ([]byte, error) {
|
||||
if lf.Path == "" {
|
||||
return nil, errors.New("empty private key path not allowed")
|
||||
return nil, fmt.Errorf("empty private key path not allowed")
|
||||
}
|
||||
|
||||
keyFile, err := os.Open(lf.Path)
|
||||
@@ -184,7 +183,7 @@ func NewApple(p Params, appleCfg AppleConfig, privateKeyLoader PrivateKeyLoaderI
|
||||
}
|
||||
|
||||
if privateKeyLoader == nil {
|
||||
return nil, errors.New("private key loader undefined")
|
||||
return nil, fmt.Errorf("private key loader undefined")
|
||||
}
|
||||
|
||||
ah.PrivateKeyLoader = privateKeyLoader
|
||||
@@ -198,12 +197,12 @@ func (ah *AppleHandler) initPrivateKey() error {
|
||||
|
||||
sKey, err := ah.PrivateKeyLoader.LoadPrivateKey()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "problem with private key loading")
|
||||
return fmt.Errorf("problem with private key loading: %w", err)
|
||||
}
|
||||
|
||||
block, _ := pem.Decode(sKey)
|
||||
if block == nil {
|
||||
return errors.New("empty block after decoding")
|
||||
return fmt.Errorf("empty block after decoding")
|
||||
}
|
||||
ah.conf.privateKey, err = x509.ParsePKCS8PrivateKey(block.Bytes)
|
||||
if err != nil {
|
||||
@@ -220,7 +219,7 @@ func (ah *AppleHandler) initPrivateKey() error {
|
||||
// tokenKeyFunc use for verify JWT sign, it receives the parsed token and should return the key for validating.
|
||||
func (ah *AppleHandler) tokenKeyFunc(jwtToken *jwt.Token) (interface{}, error) {
|
||||
if jwtToken == nil {
|
||||
return nil, errors.New("failed to call token keyFunc, because token is nil")
|
||||
return nil, fmt.Errorf("failed to call token keyFunc, because token is nil")
|
||||
}
|
||||
return ah.conf.publicKey, nil // extract public key from private key
|
||||
}
|
||||
@@ -401,7 +400,7 @@ func (ah *AppleHandler) exchange(ctx context.Context, code, redirectURI string,
|
||||
if tkn, err := jwt.Parse(ah.conf.clientSecret, ah.tokenKeyFunc); err != nil || tkn == nil {
|
||||
ah.conf.clientSecret, err = ah.createClientSecret()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "client secret create failed")
|
||||
return fmt.Errorf("client secret create failed: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -430,7 +429,7 @@ func (ah *AppleHandler) exchange(ctx context.Context, code, redirectURI string,
|
||||
// Trying to decode (unmarshal json) data of response
|
||||
err = json.NewDecoder(res.Body).Decode(result)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "unmarshalling data from apple service response failed")
|
||||
return fmt.Errorf("unmarshalling data from apple service response failed: %w", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
@@ -453,7 +452,7 @@ func (ah *AppleHandler) exchange(ctx context.Context, code, redirectURI string,
|
||||
func (ah *AppleHandler) createClientSecret() (string, error) {
|
||||
|
||||
if ah.conf.privateKey == nil {
|
||||
return "", errors.New("private key can't be empty")
|
||||
return "", fmt.Errorf("private key can't be empty")
|
||||
}
|
||||
// Create a claims
|
||||
now := time.Now()
|
||||
|
||||
+9
-10
@@ -17,7 +17,6 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/golang-jwt/jwt"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// appleKeysURL is the endpoint URL for fetch Apple’s public key
|
||||
@@ -56,7 +55,7 @@ func fetchAppleJWK(ctx context.Context, keyURL string) (set appleKeySet, err err
|
||||
req, err := http.NewRequestWithContext(ctx, "GET", keyURL, http.NoBody)
|
||||
|
||||
if err != nil {
|
||||
return set, errors.Wrap(err, "failed to prepare new request for fetch Apple public keys")
|
||||
return set, fmt.Errorf("failed to prepare new request for fetch Apple public keys: %w", err)
|
||||
}
|
||||
|
||||
req.Header.Add("accept", AcceptJSONHeader)
|
||||
@@ -64,18 +63,18 @@ func fetchAppleJWK(ctx context.Context, keyURL string) (set appleKeySet, err err
|
||||
|
||||
res, err := client.Do(req)
|
||||
if err != nil {
|
||||
return set, errors.Wrap(err, "failed to fetch Apple public keys")
|
||||
return set, fmt.Errorf("failed to fetch Apple public keys: %w", err)
|
||||
}
|
||||
|
||||
data, err := io.ReadAll(res.Body)
|
||||
if err != nil {
|
||||
return set, errors.Wrap(err, "failed read data after Apple public key fetched")
|
||||
return set, fmt.Errorf("failed read data after Apple public key fetched: %w", err)
|
||||
}
|
||||
defer func() { _ = res.Body.Close() }()
|
||||
|
||||
set, err = parseAppleJWK(data)
|
||||
if err != nil {
|
||||
return set, errors.Wrap(err, "get set of apple public key failed")
|
||||
return set, fmt.Errorf("get set of apple public key failed: %w", err)
|
||||
}
|
||||
|
||||
return set, nil
|
||||
@@ -92,7 +91,7 @@ func parseAppleJWK(keyData []byte) (set appleKeySet, err error) {
|
||||
keys := make(map[string]*applePublicKey)
|
||||
|
||||
if err = json.Unmarshal(keyData, &rawKeys); err != nil {
|
||||
return set, errors.Wrap(err, "parse json data with Apple keys failed")
|
||||
return set, fmt.Errorf("parse json data with Apple keys failed: %w", err)
|
||||
}
|
||||
for _, rawKey := range rawKeys.Keys {
|
||||
key, err := parseApplePublicKey(rawKey)
|
||||
@@ -129,12 +128,12 @@ func (apk *applePublicKey) createApplePublicKey(n, e string) error {
|
||||
|
||||
bufferN, err := base64.URLEncoding.WithPadding(base64.NoPadding).DecodeString(n) // decode modulus
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to decode Apple public key modulus (n)")
|
||||
return fmt.Errorf("failed to decode Apple public key modulus (n): %w", err)
|
||||
}
|
||||
|
||||
bufferE, err := base64.URLEncoding.WithPadding(base64.NoPadding).DecodeString(e) // decode exponent
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to decode Apple public key exponent (e)")
|
||||
return fmt.Errorf("failed to decode Apple public key exponent (e): %w", err)
|
||||
}
|
||||
|
||||
// create rsa public key from JWK data
|
||||
@@ -153,7 +152,7 @@ type appleKeySet struct {
|
||||
// get return Apple public key with specific KeyID (kid)
|
||||
func (aks *appleKeySet) get(kid string) (keys *applePublicKey, err error) {
|
||||
if aks.keys == nil || len(aks.keys) == 0 {
|
||||
return nil, errors.New("failed to get key in appleKeySet, key set is nil or empty")
|
||||
return nil, fmt.Errorf("failed to get key in appleKeySet, key set is nil or empty")
|
||||
}
|
||||
|
||||
if val, ok := aks.keys[kid]; ok {
|
||||
@@ -167,7 +166,7 @@ func (aks *appleKeySet) keyFunc(token *jwt.Token) (interface{}, error) {
|
||||
|
||||
keyID, ok := token.Header["kid"].(string)
|
||||
if !ok {
|
||||
return nil, errors.New("get JWT kid header not found")
|
||||
return nil, fmt.Errorf("get JWT kid header not found")
|
||||
}
|
||||
key, err := aks.get(keyID)
|
||||
|
||||
|
||||
+1
-1
@@ -3,12 +3,12 @@ package provider
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"sync"
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
goauth2 "github.com/go-oauth2/oauth2/v4/server"
|
||||
|
||||
+1
-1
@@ -3,10 +3,10 @@ package provider
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"net/http"
|
||||
"strings"
|
||||
"sync"
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
"golang.org/x/oauth2"
|
||||
|
||||
+5
-5
@@ -3,13 +3,13 @@ package provider
|
||||
import (
|
||||
"crypto/sha1" //nolint
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"mime"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/go-pkgz/rest"
|
||||
"github.com/golang-jwt/jwt"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/go-pkgz/auth/logger"
|
||||
"github.com/go-pkgz/auth/token"
|
||||
@@ -83,7 +83,7 @@ func (p DirectHandler) LoginHandler(w http.ResponseWriter, r *http.Request) {
|
||||
sessOnly := r.URL.Query().Get("sess") == "1"
|
||||
if p.CredChecker == nil {
|
||||
rest.SendErrorJSON(w, r, p.L, http.StatusInternalServerError,
|
||||
errors.New("no credential checker"), "no credential checker")
|
||||
fmt.Errorf("no credential checker"), "no credential checker")
|
||||
return
|
||||
}
|
||||
ok, err := p.CredChecker.Check(creds.User, creds.Password)
|
||||
@@ -147,7 +147,7 @@ func (p DirectHandler) getCredentials(w http.ResponseWriter, r *http.Request) (c
|
||||
}
|
||||
|
||||
if r.Method != "POST" {
|
||||
return credentials{}, errors.Errorf("method %s not supported", r.Method)
|
||||
return credentials{}, fmt.Errorf("method %s not supported", r.Method)
|
||||
}
|
||||
|
||||
if r.Body != nil {
|
||||
@@ -166,14 +166,14 @@ func (p DirectHandler) getCredentials(w http.ResponseWriter, r *http.Request) (c
|
||||
if contentType == "application/json" {
|
||||
var creds credentials
|
||||
if err := json.NewDecoder(r.Body).Decode(&creds); err != nil {
|
||||
return credentials{}, errors.Wrap(err, "failed to parse request body")
|
||||
return credentials{}, fmt.Errorf("failed to parse request body: %w", err)
|
||||
}
|
||||
return creds, nil
|
||||
}
|
||||
|
||||
// POST with form
|
||||
if err := r.ParseForm(); err != nil {
|
||||
return credentials{}, errors.Wrap(err, "failed to parse request")
|
||||
return credentials{}, fmt.Errorf("failed to parse request: %w", err)
|
||||
}
|
||||
|
||||
return credentials{
|
||||
|
||||
+12
-14
@@ -11,8 +11,6 @@ import (
|
||||
"net/smtp"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/go-pkgz/auth/logger"
|
||||
)
|
||||
|
||||
@@ -62,7 +60,7 @@ func (em *Email) Send(to, text string) error {
|
||||
if client == nil { // if client not set make new net/smtp
|
||||
c, err := em.client()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to make smtp client")
|
||||
return fmt.Errorf("failed to make smtp client: %w", err)
|
||||
}
|
||||
client = c
|
||||
}
|
||||
@@ -80,29 +78,29 @@ func (em *Email) Send(to, text string) error {
|
||||
if em.SMTPUserName != "" && em.SMTPPassword != "" {
|
||||
auth := smtp.PlainAuth("", em.SMTPUserName, em.SMTPPassword, em.Host)
|
||||
if err := client.Auth(auth); err != nil {
|
||||
return errors.Wrapf(err, "failed to auth to smtp %s:%d", em.Host, em.Port)
|
||||
return fmt.Errorf("failed to auth to smtp %s:%d: %w", em.Host, em.Port, err)
|
||||
}
|
||||
}
|
||||
|
||||
if err := client.Mail(em.From); err != nil {
|
||||
return errors.Wrapf(err, "bad from address %q", em.From)
|
||||
return fmt.Errorf("bad from address %q: %w", em.From, err)
|
||||
}
|
||||
if err := client.Rcpt(to); err != nil {
|
||||
return errors.Wrapf(err, "bad to address %q", to)
|
||||
return fmt.Errorf("bad to address %q: %w", to, err)
|
||||
}
|
||||
|
||||
writer, err := client.Data()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "can't make email writer")
|
||||
return fmt.Errorf("can't make email writer: %w", err)
|
||||
}
|
||||
|
||||
msg, err := em.buildMessage(text, to)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "can't make email message")
|
||||
return fmt.Errorf("can't make email message: %w", err)
|
||||
}
|
||||
buf := bytes.NewBufferString(msg)
|
||||
if _, err = buf.WriteTo(writer); err != nil {
|
||||
return errors.Wrapf(err, "failed to send email body to %q", to)
|
||||
return fmt.Errorf("failed to send email body to %q: %w", to, err)
|
||||
}
|
||||
if err = writer.Close(); err != nil {
|
||||
em.Logf("[WARN] can't close smtp body writer, %v", err)
|
||||
@@ -126,22 +124,22 @@ func (em *Email) client() (c *smtp.Client, err error) {
|
||||
}
|
||||
conn, e := tls.Dial("tcp", srvAddress, tlsConf)
|
||||
if e != nil {
|
||||
return nil, errors.Wrapf(e, "failed to dial smtp tls to %s", srvAddress)
|
||||
return nil, fmt.Errorf("failed to dial smtp tls to %s: %w", srvAddress, e)
|
||||
}
|
||||
if c, err = smtp.NewClient(conn, em.Host); err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to make smtp client for %s", srvAddress)
|
||||
return nil, fmt.Errorf("failed to make smtp client for %s: %w", srvAddress, err)
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
conn, err := net.DialTimeout("tcp", srvAddress, em.TimeOut)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "timeout connecting to %s", srvAddress)
|
||||
return nil, fmt.Errorf("timeout connecting to %s: %w", srvAddress, err)
|
||||
}
|
||||
|
||||
c, err = smtp.NewClient(conn, em.Host)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to dial")
|
||||
return nil, fmt.Errorf("failed to dial: %w", err)
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
@@ -169,7 +167,7 @@ func (em *Email) buildMessage(msg, to string) (message string, err error) {
|
||||
}
|
||||
// flush now, must NOT use defer, for small body, defer may cause buff.String() got empty body
|
||||
if err := qp.Close(); err != nil {
|
||||
return "", errors.Wrapf(err, "quotedprintable Write failed")
|
||||
return "", fmt.Errorf("quotedprintable Write failed: %w", err)
|
||||
}
|
||||
m := buff.String()
|
||||
message += "\n" + m
|
||||
|
||||
+3
-5
@@ -7,8 +7,6 @@ import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/go-pkgz/auth/token"
|
||||
)
|
||||
|
||||
@@ -76,7 +74,7 @@ func setAvatar(ava AvatarSaver, u token.User, client *http.Client) (token.User,
|
||||
if ava != nil {
|
||||
avatarURL, e := ava.Put(u, client)
|
||||
if e != nil {
|
||||
return u, errors.Wrap(e, "failed to save avatar for")
|
||||
return u, fmt.Errorf("failed to save avatar for: %w", e)
|
||||
}
|
||||
u.Picture = avatarURL
|
||||
return u, nil
|
||||
@@ -87,11 +85,11 @@ func setAvatar(ava AvatarSaver, u token.User, client *http.Client) (token.User,
|
||||
func randToken() (string, error) {
|
||||
b := make([]byte, 32)
|
||||
if _, err := rand.Read(b); err != nil {
|
||||
return "", errors.Wrap(err, "can't get random")
|
||||
return "", fmt.Errorf("can't get random: %w", err)
|
||||
}
|
||||
s := sha1.New()
|
||||
if _, err := s.Write(b); err != nil {
|
||||
return "", errors.Wrap(err, "can't write randoms to sha1")
|
||||
return "", fmt.Errorf("can't write randoms to sha1: %w", err)
|
||||
}
|
||||
return fmt.Sprintf("%x", s.Sum(nil)), nil
|
||||
}
|
||||
|
||||
+14
-15
@@ -18,7 +18,6 @@ import (
|
||||
"github.com/go-pkgz/repeater"
|
||||
"github.com/go-pkgz/rest"
|
||||
"github.com/golang-jwt/jwt"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/go-pkgz/auth/logger"
|
||||
authtoken "github.com/go-pkgz/auth/token"
|
||||
@@ -68,7 +67,7 @@ func (th *TelegramHandler) Run(ctx context.Context) error {
|
||||
atomic.AddInt32(&th.run, 1)
|
||||
info, err := th.Telegram.BotInfo(ctx)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to fetch bot info")
|
||||
return fmt.Errorf("failed to fetch bot info: %w", err)
|
||||
}
|
||||
th.username = info.Username
|
||||
|
||||
@@ -125,7 +124,7 @@ type telegramUpdate struct {
|
||||
// so that caller could get updates and send it not only there but to multiple sources
|
||||
func (th *TelegramHandler) ProcessUpdate(ctx context.Context, textUpdate string) error {
|
||||
if atomic.LoadInt32(&th.run) != 0 {
|
||||
return errors.New("Run goroutine should not be used with ProcessUpdate")
|
||||
return fmt.Errorf("Run goroutine should not be used with ProcessUpdate")
|
||||
}
|
||||
defer func() {
|
||||
// as Run goroutine is not running, clean up old requests on each update
|
||||
@@ -147,7 +146,7 @@ func (th *TelegramHandler) ProcessUpdate(ctx context.Context, textUpdate string)
|
||||
th.requests.Unlock()
|
||||
var updates telegramUpdate
|
||||
if err := json.Unmarshal([]byte(textUpdate), &updates); err != nil {
|
||||
return errors.Wrap(err, "failed to decode provided telegram update")
|
||||
return fmt.Errorf("failed to decode provided telegram update: %w", err)
|
||||
}
|
||||
th.processUpdates(ctx, &updates)
|
||||
return nil
|
||||
@@ -210,7 +209,7 @@ func (th *TelegramHandler) addToken(token string, expires time.Time) error {
|
||||
th.requests.Lock()
|
||||
if th.requests.data == nil {
|
||||
th.requests.Unlock()
|
||||
return errors.New("run goroutine is not running")
|
||||
return fmt.Errorf("run goroutine is not running")
|
||||
}
|
||||
th.requests.data[token] = tgAuthRequest{
|
||||
expires: expires,
|
||||
@@ -226,18 +225,18 @@ func (th *TelegramHandler) checkToken(token string) (*authtoken.User, error) {
|
||||
th.requests.RUnlock()
|
||||
|
||||
if !ok {
|
||||
return nil, errors.New("request is not found")
|
||||
return nil, fmt.Errorf("request is not found")
|
||||
}
|
||||
|
||||
if time.Now().After(authRequest.expires) {
|
||||
th.requests.Lock()
|
||||
delete(th.requests.data, token)
|
||||
th.requests.Unlock()
|
||||
return nil, errors.New("request expired")
|
||||
return nil, fmt.Errorf("request expired")
|
||||
}
|
||||
|
||||
if !authRequest.confirmed {
|
||||
return nil, errors.New("request is not verified yet")
|
||||
return nil, fmt.Errorf("request is not verified yet")
|
||||
}
|
||||
|
||||
return authRequest.user, nil
|
||||
@@ -365,7 +364,7 @@ func (tg *tgAPI) GetUpdates(ctx context.Context) (*telegramUpdate, error) {
|
||||
|
||||
err := tg.request(ctx, url, &result)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to fetch updates")
|
||||
return nil, fmt.Errorf("failed to fetch updates: %w", err)
|
||||
}
|
||||
|
||||
for _, u := range result.Result {
|
||||
@@ -441,7 +440,7 @@ func (tg *tgAPI) BotInfo(ctx context.Context) (*botInfo, error) {
|
||||
return nil, err
|
||||
}
|
||||
if resp.Result == nil {
|
||||
return nil, errors.New("received empty result")
|
||||
return nil, fmt.Errorf("received empty result")
|
||||
}
|
||||
|
||||
return resp.Result, nil
|
||||
@@ -453,12 +452,12 @@ func (tg *tgAPI) request(ctx context.Context, method string, data interface{}) e
|
||||
|
||||
req, err := http.NewRequestWithContext(ctx, "GET", url, http.NoBody)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to create request")
|
||||
return fmt.Errorf("failed to create request: %w", err)
|
||||
}
|
||||
|
||||
resp, err := tg.client.Do(req)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to send request")
|
||||
return fmt.Errorf("failed to send request: %w", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
@@ -467,7 +466,7 @@ func (tg *tgAPI) request(ctx context.Context, method string, data interface{}) e
|
||||
}
|
||||
|
||||
if err = json.NewDecoder(resp.Body).Decode(data); err != nil {
|
||||
return errors.Wrap(err, "failed to decode json response")
|
||||
return fmt.Errorf("failed to decode json response: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -479,7 +478,7 @@ func (tg *tgAPI) parseError(r io.Reader, statusCode int) error {
|
||||
Description string `json:"description"`
|
||||
}{}
|
||||
if err := json.NewDecoder(r).Decode(&tgErr); err != nil {
|
||||
return errors.Errorf("unexpected telegram API status code %d", statusCode)
|
||||
return fmt.Errorf("unexpected telegram API status code %d", statusCode)
|
||||
}
|
||||
return errors.Errorf("unexpected telegram API status code %d, error: %q", statusCode, tgErr.Description)
|
||||
return fmt.Errorf("unexpected telegram API status code %d, error: %q", statusCode, tgErr.Description)
|
||||
}
|
||||
|
||||
+27
-6
@@ -3,14 +3,15 @@ package provider
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/sha1"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"net/http"
|
||||
"strings"
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
"github.com/go-pkgz/rest"
|
||||
"github.com/golang-jwt/jwt"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/microcosm-cc/bluemonday"
|
||||
|
||||
"github.com/go-pkgz/auth/avatar"
|
||||
"github.com/go-pkgz/auth/logger"
|
||||
@@ -75,13 +76,13 @@ func (e VerifyHandler) LoginHandler(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
if e.TokenService.IsExpired(confClaims) {
|
||||
rest.SendErrorJSON(w, r, e.L, http.StatusForbidden, errors.New("expired"), "failed to verify confirmation token")
|
||||
rest.SendErrorJSON(w, r, e.L, http.StatusForbidden, fmt.Errorf("expired"), "failed to verify confirmation token")
|
||||
return
|
||||
}
|
||||
|
||||
elems := strings.Split(confClaims.Handshake.ID, "::")
|
||||
if len(elems) != 2 {
|
||||
rest.SendErrorJSON(w, r, e.L, http.StatusBadRequest, errors.New(confClaims.Handshake.ID), "invalid handshake token")
|
||||
rest.SendErrorJSON(w, r, e.L, http.StatusBadRequest, fmt.Errorf("%s", confClaims.Handshake.ID), "invalid handshake token")
|
||||
return
|
||||
}
|
||||
user, address := elems[0], elems[1]
|
||||
@@ -132,11 +133,16 @@ func (e VerifyHandler) LoginHandler(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// GET /login?site=site&user=name&address=someone@example.com
|
||||
func (e VerifyHandler) sendConfirmation(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
user, address := r.URL.Query().Get("user"), r.URL.Query().Get("address")
|
||||
user = e.sanitize(user)
|
||||
address = e.sanitize(address)
|
||||
|
||||
if user == "" || address == "" {
|
||||
rest.SendErrorJSON(w, r, e.L, http.StatusBadRequest, errors.New("wrong request"), "can't get user and address")
|
||||
rest.SendErrorJSON(w, r, e.L, http.StatusBadRequest, fmt.Errorf("wrong request"), "can't get user and address")
|
||||
return
|
||||
}
|
||||
|
||||
claims := token.Claims{
|
||||
Handshake: &token.Handshake{
|
||||
State: "",
|
||||
@@ -144,7 +150,7 @@ func (e VerifyHandler) sendConfirmation(w http.ResponseWriter, r *http.Request)
|
||||
},
|
||||
SessionOnly: r.URL.Query().Get("session") != "" && r.URL.Query().Get("session") != "0",
|
||||
StandardClaims: jwt.StandardClaims{
|
||||
Audience: r.URL.Query().Get("site"),
|
||||
Audience: e.sanitize(r.URL.Query().Get("site")),
|
||||
ExpiresAt: time.Now().Add(30 * time.Minute).Unix(),
|
||||
NotBefore: time.Now().Add(-1 * time.Minute).Unix(),
|
||||
Issuer: e.Issuer,
|
||||
@@ -205,3 +211,18 @@ Confirmation for {{.User}} {{.Address}}, site {{.Site}}
|
||||
|
||||
Token: {{.Token}}
|
||||
`
|
||||
|
||||
func (e VerifyHandler) sanitize(inp string) string {
|
||||
p := bluemonday.UGCPolicy()
|
||||
res := p.Sanitize(inp)
|
||||
res = template.HTMLEscapeString(res)
|
||||
res = strings.ReplaceAll(res, "&", "&")
|
||||
res = strings.ReplaceAll(res, """, "\"")
|
||||
res = strings.ReplaceAll(res, "'", "'")
|
||||
res = strings.ReplaceAll(res, "\n", "")
|
||||
res = strings.TrimSpace(res)
|
||||
if len(res) > 128 {
|
||||
return res[:128]
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
+21
-22
@@ -9,7 +9,6 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/golang-jwt/jwt"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// Service wraps jwt operations
|
||||
@@ -115,21 +114,21 @@ func (j *Service) Token(claims Claims) (string, error) {
|
||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
||||
|
||||
if j.SecretReader == nil {
|
||||
return "", errors.New("secret reader not defined")
|
||||
return "", fmt.Errorf("secret reader not defined")
|
||||
}
|
||||
|
||||
if err := j.checkAuds(&claims, j.AudienceReader); err != nil {
|
||||
return "", errors.Wrap(err, "aud rejected")
|
||||
return "", fmt.Errorf("aud rejected: %w", err)
|
||||
}
|
||||
|
||||
secret, err := j.SecretReader.Get(claims.Audience) // get secret via consumer defined SecretReader
|
||||
if err != nil {
|
||||
return "", errors.Wrap(err, "can't get secret")
|
||||
return "", fmt.Errorf("can't get secret: %w", err)
|
||||
}
|
||||
|
||||
tokenString, err := token.SignedString([]byte(secret))
|
||||
if err != nil {
|
||||
return "", errors.Wrap(err, "can't sign token")
|
||||
return "", fmt.Errorf("can't sign token: %w", err)
|
||||
}
|
||||
return tokenString, nil
|
||||
}
|
||||
@@ -139,7 +138,7 @@ func (j *Service) Parse(tokenString string) (Claims, error) {
|
||||
parser := jwt.Parser{SkipClaimsValidation: true} // allow parsing of expired tokens
|
||||
|
||||
if j.SecretReader == nil {
|
||||
return Claims{}, errors.New("secret reader not defined")
|
||||
return Claims{}, fmt.Errorf("secret reader not defined")
|
||||
}
|
||||
|
||||
aud := "ignore"
|
||||
@@ -147,32 +146,32 @@ func (j *Service) Parse(tokenString string) (Claims, error) {
|
||||
var err error
|
||||
aud, err = j.aud(tokenString)
|
||||
if err != nil {
|
||||
return Claims{}, errors.New("can't retrieve audience from the token")
|
||||
return Claims{}, fmt.Errorf("can't retrieve audience from the token")
|
||||
}
|
||||
}
|
||||
|
||||
secret, err := j.SecretReader.Get(aud)
|
||||
if err != nil {
|
||||
return Claims{}, errors.Wrap(err, "can't get secret")
|
||||
return Claims{}, fmt.Errorf("can't get secret: %w", err)
|
||||
}
|
||||
|
||||
token, err := parser.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
|
||||
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
|
||||
return nil, errors.Errorf("unexpected signing method: %v", token.Header["alg"])
|
||||
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
|
||||
}
|
||||
return []byte(secret), nil
|
||||
})
|
||||
if err != nil {
|
||||
return Claims{}, errors.Wrap(err, "can't parse token")
|
||||
return Claims{}, fmt.Errorf("can't parse token: %w", err)
|
||||
}
|
||||
|
||||
claims, ok := token.Claims.(*Claims)
|
||||
if !ok {
|
||||
return Claims{}, errors.New("invalid token")
|
||||
return Claims{}, fmt.Errorf("invalid token")
|
||||
}
|
||||
|
||||
if err = j.checkAuds(claims, j.AudienceReader); err != nil {
|
||||
return Claims{}, errors.Wrap(err, "aud rejected")
|
||||
return Claims{}, fmt.Errorf("aud rejected: %w", err)
|
||||
}
|
||||
return *claims, j.validate(claims)
|
||||
}
|
||||
@@ -183,14 +182,14 @@ func (j *Service) aud(tokenString string) (string, error) {
|
||||
parser := jwt.Parser{}
|
||||
token, _, err := parser.ParseUnverified(tokenString, &Claims{})
|
||||
if err != nil {
|
||||
return "", errors.Wrap(err, "can't pre-parse token")
|
||||
return "", fmt.Errorf("can't pre-parse token: %w", err)
|
||||
}
|
||||
claims, ok := token.Claims.(*Claims)
|
||||
if !ok {
|
||||
return "", errors.New("invalid token")
|
||||
return "", fmt.Errorf("invalid token")
|
||||
}
|
||||
if strings.TrimSpace(claims.Audience) == "" {
|
||||
return "", errors.New("empty aud")
|
||||
return "", fmt.Errorf("empty aud")
|
||||
}
|
||||
return claims.Audience, nil
|
||||
}
|
||||
@@ -229,7 +228,7 @@ func (j *Service) Set(w http.ResponseWriter, claims Claims) (Claims, error) {
|
||||
|
||||
tokenString, err := j.Token(claims)
|
||||
if err != nil {
|
||||
return Claims{}, errors.Wrap(err, "failed to make token token")
|
||||
return Claims{}, fmt.Errorf("failed to make token token: %w", err)
|
||||
}
|
||||
|
||||
if j.SendJWTHeader {
|
||||
@@ -275,14 +274,14 @@ func (j *Service) Get(r *http.Request) (Claims, string, error) {
|
||||
fromCookie = true
|
||||
jc, err := r.Cookie(j.JWTCookieName)
|
||||
if err != nil {
|
||||
return Claims{}, "", errors.Wrap(err, "token cookie was not presented")
|
||||
return Claims{}, "", fmt.Errorf("token cookie was not presented: %w", err)
|
||||
}
|
||||
tokenString = jc.Value
|
||||
}
|
||||
|
||||
claims, err := j.Parse(tokenString)
|
||||
if err != nil {
|
||||
return Claims{}, "", errors.Wrap(err, "failed to get token")
|
||||
return Claims{}, "", fmt.Errorf("failed to get token: %w", err)
|
||||
}
|
||||
|
||||
// promote claim's aud to User.Audience
|
||||
@@ -291,7 +290,7 @@ func (j *Service) Get(r *http.Request) (Claims, string, error) {
|
||||
}
|
||||
|
||||
if !fromCookie && j.IsExpired(claims) {
|
||||
return Claims{}, "", errors.New("token expired")
|
||||
return Claims{}, "", fmt.Errorf("token expired")
|
||||
}
|
||||
|
||||
if j.DisableXSRF {
|
||||
@@ -301,7 +300,7 @@ func (j *Service) Get(r *http.Request) (Claims, string, error) {
|
||||
if fromCookie && claims.User != nil {
|
||||
xsrf := r.Header.Get(j.XSRFHeaderKey)
|
||||
if claims.Id != xsrf {
|
||||
return Claims{}, "", errors.New("xsrf mismatch")
|
||||
return Claims{}, "", fmt.Errorf("xsrf mismatch")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -331,14 +330,14 @@ func (j *Service) checkAuds(claims *Claims, audReader Audience) error {
|
||||
}
|
||||
auds, err := audReader.Get()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to get auds")
|
||||
return fmt.Errorf("failed to get auds: %w", err)
|
||||
}
|
||||
for _, a := range auds {
|
||||
if strings.EqualFold(a, claims.Audience) {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return errors.Errorf("aud %q not allowed", claims.Audience)
|
||||
return fmt.Errorf("aud %q not allowed", claims.Audience)
|
||||
}
|
||||
|
||||
func (c Claims) String() string {
|
||||
|
||||
+2
-4
@@ -9,8 +9,6 @@ import (
|
||||
"io"
|
||||
"net/http"
|
||||
"regexp"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
var reValidSha = regexp.MustCompile("^[a-fA-F0-9]{40}$")
|
||||
@@ -144,13 +142,13 @@ func GetUserInfo(r *http.Request) (user User, err error) {
|
||||
|
||||
ctx := r.Context()
|
||||
if ctx == nil {
|
||||
return User{}, errors.New("no info about user")
|
||||
return User{}, fmt.Errorf("no info about user")
|
||||
}
|
||||
if u, ok := ctx.Value(contextKey("user")).(User); ok {
|
||||
return u, nil
|
||||
}
|
||||
|
||||
return User{}, errors.New("user can't be parsed")
|
||||
return User{}, fmt.Errorf("user can't be parsed")
|
||||
}
|
||||
|
||||
// SetUserInfo sets user into request context
|
||||
|
||||
@@ -23,3 +23,10 @@ _testmain.go
|
||||
*.test
|
||||
*.prof
|
||||
/s2/cmd/_s2sx/sfx-exe
|
||||
|
||||
# Linux perf files
|
||||
perf.data
|
||||
perf.data.old
|
||||
|
||||
# gdb history
|
||||
.gdb_history
|
||||
|
||||
+7
@@ -17,6 +17,13 @@ This package provides various compression algorithms.
|
||||
|
||||
# changelog
|
||||
|
||||
* Mar 11, 2022 (v1.15.1)
|
||||
* huff0: Add x86 assembly of Decode4X by @WojciechMula in [#512](https://github.com/klauspost/compress/pull/512)
|
||||
* zstd: Reuse zip decoders in [#514](https://github.com/klauspost/compress/pull/514)
|
||||
* zstd: Detect extra block data and report as corrupted in [#520](https://github.com/klauspost/compress/pull/520)
|
||||
* zstd: Handle zero sized frame content size stricter in [#521](https://github.com/klauspost/compress/pull/521)
|
||||
* zstd: Add stricter block size checks in [#523](https://github.com/klauspost/compress/pull/523)
|
||||
|
||||
* Mar 3, 2022 (v1.15.0)
|
||||
* zstd: Refactor decoder by @klauspost in [#498](https://github.com/klauspost/compress/pull/498)
|
||||
* zstd: Add stream encoding without goroutines by @klauspost in [#505](https://github.com/klauspost/compress/pull/505)
|
||||
|
||||
+2
-2
@@ -12,14 +12,14 @@ import (
|
||||
|
||||
// decompress4x_main_loop_x86 is an x86 assembler implementation
|
||||
// of Decompress4X when tablelog > 8.
|
||||
// go:noescape
|
||||
//go:noescape
|
||||
func decompress4x_main_loop_x86(pbr0, pbr1, pbr2, pbr3 *bitReaderShifted,
|
||||
peekBits uint8, buf *byte, tbl *dEntrySingle) uint8
|
||||
|
||||
// decompress4x_8b_loop_x86 is an x86 assembler implementation
|
||||
// of Decompress4X when tablelog <= 8 which decodes 4 entries
|
||||
// per loop.
|
||||
// go:noescape
|
||||
//go:noescape
|
||||
func decompress4x_8b_loop_x86(pbr0, pbr1, pbr2, pbr3 *bitReaderShifted,
|
||||
peekBits uint8, buf *byte, tbl *dEntrySingle) uint8
|
||||
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
// Package cpuinfo gives runtime info about the current CPU.
|
||||
//
|
||||
// This is a very limited module meant for use internally
|
||||
// in this project. For more versatile solution check
|
||||
// https://github.com/klauspost/cpuid.
|
||||
package cpuinfo
|
||||
|
||||
// HasBMI1 checks whether an x86 CPU supports the BMI1 extension.
|
||||
func HasBMI1() bool {
|
||||
return hasBMI1
|
||||
}
|
||||
|
||||
// HasBMI2 checks whether an x86 CPU supports the BMI2 extension.
|
||||
func HasBMI2() bool {
|
||||
return hasBMI2
|
||||
}
|
||||
|
||||
// DisableBMI2 will disable BMI2, for testing purposes.
|
||||
// Call returned function to restore previous state.
|
||||
func DisableBMI2() func() {
|
||||
old := hasBMI2
|
||||
hasBMI2 = false
|
||||
return func() {
|
||||
hasBMI2 = old
|
||||
}
|
||||
}
|
||||
|
||||
// HasBMI checks whether an x86 CPU supports both BMI1 and BMI2 extensions.
|
||||
func HasBMI() bool {
|
||||
return HasBMI1() && HasBMI2()
|
||||
}
|
||||
|
||||
var hasBMI1 bool
|
||||
var hasBMI2 bool
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
//go:build amd64 && !appengine && !noasm && gc
|
||||
// +build amd64,!appengine,!noasm,gc
|
||||
|
||||
package cpuinfo
|
||||
|
||||
// go:noescape
|
||||
func x86extensions() (bmi1, bmi2 bool)
|
||||
|
||||
func init() {
|
||||
hasBMI1, hasBMI2 = x86extensions()
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
// +build !appengine
|
||||
// +build gc
|
||||
// +build !noasm
|
||||
|
||||
#include "textflag.h"
|
||||
#include "funcdata.h"
|
||||
#include "go_asm.h"
|
||||
|
||||
TEXT ·x86extensions(SB), NOSPLIT, $0
|
||||
// 1. determine max EAX value
|
||||
XORQ AX, AX
|
||||
CPUID
|
||||
|
||||
CMPQ AX, $7
|
||||
JB unsupported
|
||||
|
||||
// 2. EAX = 7, ECX = 0 --- see Table 3-8 "Information Returned by CPUID Instruction"
|
||||
MOVQ $7, AX
|
||||
MOVQ $0, CX
|
||||
CPUID
|
||||
|
||||
BTQ $3, BX // bit 3 = BMI1
|
||||
SETCS AL
|
||||
|
||||
BTQ $8, BX // bit 8 = BMI2
|
||||
SETCS AH
|
||||
|
||||
MOVB AL, bmi1+0(FP)
|
||||
MOVB AH, bmi2+1(FP)
|
||||
RET
|
||||
|
||||
unsupported:
|
||||
XORQ AX, AX
|
||||
MOVB AL, bmi1+0(FP)
|
||||
MOVB AL, bmi2+1(FP)
|
||||
RET
|
||||
+19
-35
@@ -386,47 +386,31 @@ In practice this means that concurrency is often limited to utilizing about 3 co
|
||||
|
||||
### Benchmarks
|
||||
|
||||
These are some examples of performance compared to [datadog cgo library](https://github.com/DataDog/zstd).
|
||||
|
||||
The first two are streaming decodes and the last are smaller inputs.
|
||||
|
||||
|
||||
Running on AMD Ryzen 9 3950X 16-Core Processor. AMD64 assembly used.
|
||||
|
||||
```
|
||||
BenchmarkDecoderSilesia-8 3 385000067 ns/op 550.51 MB/s 5498 B/op 8 allocs/op
|
||||
BenchmarkDecoderSilesiaCgo-8 6 197666567 ns/op 1072.25 MB/s 270672 B/op 8 allocs/op
|
||||
BenchmarkDecoderSilesia-32 5 206878840 ns/op 1024.50 MB/s 49808 B/op 43 allocs/op
|
||||
BenchmarkDecoderEnwik9-32 1 1271809000 ns/op 786.28 MB/s 72048 B/op 52 allocs/op
|
||||
|
||||
BenchmarkDecoderEnwik9-8 1 2027001600 ns/op 493.34 MB/s 10496 B/op 18 allocs/op
|
||||
BenchmarkDecoderEnwik9Cgo-8 2 979499200 ns/op 1020.93 MB/s 270672 B/op 8 allocs/op
|
||||
Concurrent blocks, performance:
|
||||
|
||||
Concurrent performance:
|
||||
|
||||
BenchmarkDecoder_DecodeAllParallel/kppkn.gtb.zst-16 28915 42469 ns/op 4340.07 MB/s 114 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/geo.protodata.zst-16 116505 9965 ns/op 11900.16 MB/s 16 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/plrabn12.txt.zst-16 8952 134272 ns/op 3588.70 MB/s 915 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/lcet10.txt.zst-16 11820 102538 ns/op 4161.90 MB/s 594 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/asyoulik.txt.zst-16 34782 34184 ns/op 3661.88 MB/s 60 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/alice29.txt.zst-16 27712 43447 ns/op 3500.58 MB/s 99 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/html_x_4.zst-16 62826 18750 ns/op 21845.10 MB/s 104 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/paper-100k.pdf.zst-16 631545 1794 ns/op 57078.74 MB/s 2 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/fireworks.jpeg.zst-16 1690140 712 ns/op 172938.13 MB/s 1 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/urls.10K.zst-16 10432 113593 ns/op 6180.73 MB/s 1143 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/html.zst-16 113206 10671 ns/op 9596.27 MB/s 15 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/comp-data.bin.zst-16 1530615 779 ns/op 5229.49 MB/s 0 B/op 0 allocs/op
|
||||
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/kppkn.gtb.zst-16 65217 16192 ns/op 11383.34 MB/s 46 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/geo.protodata.zst-16 292671 4039 ns/op 29363.19 MB/s 6 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/plrabn12.txt.zst-16 26314 46021 ns/op 10470.43 MB/s 293 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/lcet10.txt.zst-16 33897 34900 ns/op 12227.96 MB/s 205 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/asyoulik.txt.zst-16 104348 11433 ns/op 10949.01 MB/s 20 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/alice29.txt.zst-16 75949 15510 ns/op 9805.60 MB/s 32 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/html_x_4.zst-16 173910 6756 ns/op 60624.29 MB/s 37 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/paper-100k.pdf.zst-16 923076 1339 ns/op 76474.87 MB/s 1 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/fireworks.jpeg.zst-16 922920 1351 ns/op 91102.57 MB/s 2 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/urls.10K.zst-16 27649 43618 ns/op 16096.19 MB/s 407 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/html.zst-16 279073 4160 ns/op 24614.18 MB/s 6 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallelCgo/comp-data.bin.zst-16 749938 1579 ns/op 2581.71 MB/s 0 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/kppkn.gtb.zst-32 67356 17857 ns/op 10321.96 MB/s 22.48 pct 102 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/geo.protodata.zst-32 266656 4421 ns/op 26823.21 MB/s 11.89 pct 19 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/plrabn12.txt.zst-32 20992 56842 ns/op 8477.17 MB/s 39.90 pct 754 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/lcet10.txt.zst-32 27456 43932 ns/op 9714.01 MB/s 33.27 pct 524 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/asyoulik.txt.zst-32 78432 15047 ns/op 8319.15 MB/s 40.34 pct 66 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/alice29.txt.zst-32 65800 18436 ns/op 8249.63 MB/s 37.75 pct 88 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/html_x_4.zst-32 102993 11523 ns/op 35546.09 MB/s 3.637 pct 143 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/paper-100k.pdf.zst-32 1000000 1070 ns/op 95720.98 MB/s 80.53 pct 3 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/fireworks.jpeg.zst-32 749802 1752 ns/op 70272.35 MB/s 100.0 pct 5 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/urls.10K.zst-32 22640 52934 ns/op 13263.37 MB/s 26.25 pct 1014 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/html.zst-32 226412 5232 ns/op 19572.27 MB/s 14.49 pct 20 B/op 0 allocs/op
|
||||
BenchmarkDecoder_DecodeAllParallel/comp-data.bin.zst-32 923041 1276 ns/op 3194.71 MB/s 31.26 pct 0 B/op 0 allocs/op
|
||||
```
|
||||
|
||||
This reflects the performance around May 2020, but this may be out of date.
|
||||
This reflects the performance around May 2022, but this may be out of date.
|
||||
|
||||
## Zstd inside ZIP files
|
||||
|
||||
|
||||
+36
-6
@@ -5,9 +5,14 @@
|
||||
package zstd
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
|
||||
"github.com/klauspost/compress/huff0"
|
||||
@@ -38,6 +43,9 @@ const (
|
||||
// maxCompressedBlockSize is the biggest allowed compressed block size (128KB)
|
||||
maxCompressedBlockSize = 128 << 10
|
||||
|
||||
compressedBlockOverAlloc = 16
|
||||
maxCompressedBlockSizeAlloc = 128<<10 + compressedBlockOverAlloc
|
||||
|
||||
// Maximum possible block size (all Raw+Uncompressed).
|
||||
maxBlockSize = (1 << 21) - 1
|
||||
|
||||
@@ -136,7 +144,7 @@ func (b *blockDec) reset(br byteBuffer, windowSize uint64) error {
|
||||
b.Type = blockType((bh >> 1) & 3)
|
||||
// find size.
|
||||
cSize := int(bh >> 3)
|
||||
maxSize := maxBlockSize
|
||||
maxSize := maxCompressedBlockSizeAlloc
|
||||
switch b.Type {
|
||||
case blockTypeReserved:
|
||||
return ErrReservedBlockType
|
||||
@@ -157,9 +165,9 @@ func (b *blockDec) reset(br byteBuffer, windowSize uint64) error {
|
||||
println("Data size on stream:", cSize)
|
||||
}
|
||||
b.RLESize = 0
|
||||
maxSize = maxCompressedBlockSize
|
||||
maxSize = maxCompressedBlockSizeAlloc
|
||||
if windowSize < maxCompressedBlockSize && b.lowMem {
|
||||
maxSize = int(windowSize)
|
||||
maxSize = int(windowSize) + compressedBlockOverAlloc
|
||||
}
|
||||
if cSize > maxCompressedBlockSize || uint64(cSize) > b.WindowSize {
|
||||
if debugDecoder {
|
||||
@@ -190,9 +198,9 @@ func (b *blockDec) reset(br byteBuffer, windowSize uint64) error {
|
||||
// Read block data.
|
||||
if cap(b.dataStorage) < cSize {
|
||||
if b.lowMem || cSize > maxCompressedBlockSize {
|
||||
b.dataStorage = make([]byte, 0, cSize)
|
||||
b.dataStorage = make([]byte, 0, cSize+compressedBlockOverAlloc)
|
||||
} else {
|
||||
b.dataStorage = make([]byte, 0, maxCompressedBlockSize)
|
||||
b.dataStorage = make([]byte, 0, maxCompressedBlockSizeAlloc)
|
||||
}
|
||||
}
|
||||
if cap(b.dst) <= maxSize {
|
||||
@@ -486,10 +494,15 @@ func (b *blockDec) decodeCompressed(hist *history) error {
|
||||
b.dst = append(b.dst, hist.decoders.literals...)
|
||||
return nil
|
||||
}
|
||||
err = hist.decoders.decodeSync(hist)
|
||||
before := len(hist.decoders.out)
|
||||
err = hist.decoders.decodeSync(hist.b[hist.ignoreBuffer:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if hist.decoders.maxSyncLen > 0 {
|
||||
hist.decoders.maxSyncLen += uint64(before)
|
||||
hist.decoders.maxSyncLen -= uint64(len(hist.decoders.out))
|
||||
}
|
||||
b.dst = hist.decoders.out
|
||||
hist.recentOffsets = hist.decoders.prevOffset
|
||||
return nil
|
||||
@@ -632,6 +645,22 @@ func (b *blockDec) prepareSequences(in []byte, hist *history) (err error) {
|
||||
println("initializing sequences:", err)
|
||||
return err
|
||||
}
|
||||
// Extract blocks...
|
||||
if false && hist.dict == nil {
|
||||
fatalErr := func(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
fn := fmt.Sprintf("n-%d-lits-%d-prev-%d-%d-%d-win-%d.blk", hist.decoders.nSeqs, len(hist.decoders.literals), hist.recentOffsets[0], hist.recentOffsets[1], hist.recentOffsets[2], hist.windowSize)
|
||||
var buf bytes.Buffer
|
||||
fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.litLengths.fse))
|
||||
fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.matchLengths.fse))
|
||||
fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.offsets.fse))
|
||||
buf.Write(in)
|
||||
ioutil.WriteFile(filepath.Join("testdata", "seqs", fn), buf.Bytes(), os.ModePerm)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -650,6 +679,7 @@ func (b *blockDec) decodeSequences(hist *history) error {
|
||||
}
|
||||
hist.decoders.windowSize = hist.windowSize
|
||||
hist.decoders.prevOffset = hist.recentOffsets
|
||||
|
||||
err := hist.decoders.decode(b.sequence)
|
||||
hist.recentOffsets = hist.decoders.prevOffset
|
||||
return err
|
||||
|
||||
+8
-6
@@ -347,18 +347,20 @@ func (d *Decoder) DecodeAll(input, dst []byte) ([]byte, error) {
|
||||
}
|
||||
frame.history.setDict(&dict)
|
||||
}
|
||||
|
||||
if frame.FrameContentSize != fcsUnknown && frame.FrameContentSize > d.o.maxDecodedSize-uint64(len(dst)) {
|
||||
return dst, ErrDecoderSizeExceeded
|
||||
if frame.WindowSize > d.o.maxWindowSize {
|
||||
return dst, ErrWindowSizeExceeded
|
||||
}
|
||||
if frame.FrameContentSize < 1<<30 {
|
||||
// Never preallocate more than 1 GB up front.
|
||||
if frame.FrameContentSize != fcsUnknown {
|
||||
if frame.FrameContentSize > d.o.maxDecodedSize-uint64(len(dst)) {
|
||||
return dst, ErrDecoderSizeExceeded
|
||||
}
|
||||
if cap(dst)-len(dst) < int(frame.FrameContentSize) {
|
||||
dst2 := make([]byte, len(dst), len(dst)+int(frame.FrameContentSize))
|
||||
dst2 := make([]byte, len(dst), len(dst)+int(frame.FrameContentSize)+compressedBlockOverAlloc)
|
||||
copy(dst2, dst)
|
||||
dst = dst2
|
||||
}
|
||||
}
|
||||
|
||||
if cap(dst) == 0 {
|
||||
// Allocate len(input) * 2 by default if nothing is provided
|
||||
// and we didn't get frame content size.
|
||||
|
||||
+2
-2
@@ -31,7 +31,7 @@ func (o *decoderOptions) setDefault() {
|
||||
if o.concurrent > 4 {
|
||||
o.concurrent = 4
|
||||
}
|
||||
o.maxDecodedSize = 1 << 63
|
||||
o.maxDecodedSize = 64 << 30
|
||||
}
|
||||
|
||||
// WithDecoderLowmem will set whether to use a lower amount of memory,
|
||||
@@ -66,7 +66,7 @@ func WithDecoderConcurrency(n int) DOption {
|
||||
// WithDecoderMaxMemory allows to set a maximum decoded size for in-memory
|
||||
// non-streaming operations or maximum window size for streaming operations.
|
||||
// This can be used to control memory usage of potentially hostile content.
|
||||
// Maximum and default is 1 << 63 bytes.
|
||||
// Maximum is 1 << 63 bytes. Default is 64GiB.
|
||||
func WithDecoderMaxMemory(n uint64) DOption {
|
||||
return func(o *decoderOptions) error {
|
||||
if n == 0 {
|
||||
|
||||
+13
@@ -326,6 +326,19 @@ func (d *frameDec) runDecoder(dst []byte, dec *blockDec) ([]byte, error) {
|
||||
d.history.ignoreBuffer = len(dst)
|
||||
// Store input length, so we only check new data.
|
||||
crcStart := len(dst)
|
||||
d.history.decoders.maxSyncLen = 0
|
||||
if d.FrameContentSize != fcsUnknown {
|
||||
d.history.decoders.maxSyncLen = d.FrameContentSize + uint64(len(dst))
|
||||
if d.history.decoders.maxSyncLen > d.o.maxDecodedSize {
|
||||
return dst, ErrDecoderSizeExceeded
|
||||
}
|
||||
if uint64(cap(dst)) < d.history.decoders.maxSyncLen {
|
||||
// Alloc for output
|
||||
dst2 := make([]byte, len(dst), d.history.decoders.maxSyncLen+compressedBlockOverAlloc)
|
||||
copy(dst2, dst)
|
||||
dst = dst2
|
||||
}
|
||||
}
|
||||
var err error
|
||||
for {
|
||||
err = dec.reset(d.rawInput, d.WindowSize)
|
||||
|
||||
+25
@@ -5,8 +5,10 @@
|
||||
package zstd
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -182,6 +184,29 @@ func (s *fseDecoder) readNCount(b *byteReader, maxSymbol uint16) error {
|
||||
return s.buildDtable()
|
||||
}
|
||||
|
||||
func (s *fseDecoder) mustReadFrom(r io.Reader) {
|
||||
fatalErr := func(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
// dt [maxTablesize]decSymbol // Decompression table.
|
||||
// symbolLen uint16 // Length of active part of the symbol table.
|
||||
// actualTableLog uint8 // Selected tablelog.
|
||||
// maxBits uint8 // Maximum number of additional bits
|
||||
// // used for table creation to avoid allocations.
|
||||
// stateTable [256]uint16
|
||||
// norm [maxSymbolValue + 1]int16
|
||||
// preDefined bool
|
||||
fatalErr(binary.Read(r, binary.LittleEndian, &s.dt))
|
||||
fatalErr(binary.Read(r, binary.LittleEndian, &s.symbolLen))
|
||||
fatalErr(binary.Read(r, binary.LittleEndian, &s.actualTableLog))
|
||||
fatalErr(binary.Read(r, binary.LittleEndian, &s.maxBits))
|
||||
fatalErr(binary.Read(r, binary.LittleEndian, &s.stateTable))
|
||||
fatalErr(binary.Read(r, binary.LittleEndian, &s.norm))
|
||||
fatalErr(binary.Read(r, binary.LittleEndian, &s.preDefined))
|
||||
}
|
||||
|
||||
// decSymbol contains information about a state entry,
|
||||
// Including the state offset base, the output symbol and
|
||||
// the number of bits to read for the low part of the destination state.
|
||||
|
||||
+17
-151
@@ -73,6 +73,7 @@ type sequenceDecs struct {
|
||||
seqSize int
|
||||
windowSize int
|
||||
maxBits uint8
|
||||
maxSyncLen uint64
|
||||
}
|
||||
|
||||
// initialize all 3 decoders from the stream input.
|
||||
@@ -98,153 +99,13 @@ func (s *sequenceDecs) initialize(br *bitReader, hist *history, out []byte) erro
|
||||
return nil
|
||||
}
|
||||
|
||||
// decode sequences from the stream with the provided history.
|
||||
func (s *sequenceDecs) decode(seqs []seqVals) error {
|
||||
br := s.br
|
||||
|
||||
// Grab full sizes tables, to avoid bounds checks.
|
||||
llTable, mlTable, ofTable := s.litLengths.fse.dt[:maxTablesize], s.matchLengths.fse.dt[:maxTablesize], s.offsets.fse.dt[:maxTablesize]
|
||||
llState, mlState, ofState := s.litLengths.state.state, s.matchLengths.state.state, s.offsets.state.state
|
||||
s.seqSize = 0
|
||||
litRemain := len(s.literals)
|
||||
maxBlockSize := maxCompressedBlockSize
|
||||
if s.windowSize < maxBlockSize {
|
||||
maxBlockSize = s.windowSize
|
||||
}
|
||||
for i := range seqs {
|
||||
var ll, mo, ml int
|
||||
if br.off > 4+((maxOffsetBits+16+16)>>3) {
|
||||
// inlined function:
|
||||
// ll, mo, ml = s.nextFast(br, llState, mlState, ofState)
|
||||
|
||||
// Final will not read from stream.
|
||||
var llB, mlB, moB uint8
|
||||
ll, llB = llState.final()
|
||||
ml, mlB = mlState.final()
|
||||
mo, moB = ofState.final()
|
||||
|
||||
// extra bits are stored in reverse order.
|
||||
br.fillFast()
|
||||
mo += br.getBits(moB)
|
||||
if s.maxBits > 32 {
|
||||
br.fillFast()
|
||||
}
|
||||
ml += br.getBits(mlB)
|
||||
ll += br.getBits(llB)
|
||||
|
||||
if moB > 1 {
|
||||
s.prevOffset[2] = s.prevOffset[1]
|
||||
s.prevOffset[1] = s.prevOffset[0]
|
||||
s.prevOffset[0] = mo
|
||||
} else {
|
||||
// mo = s.adjustOffset(mo, ll, moB)
|
||||
// Inlined for rather big speedup
|
||||
if ll == 0 {
|
||||
// There is an exception though, when current sequence's literals_length = 0.
|
||||
// In this case, repeated offsets are shifted by one, so an offset_value of 1 means Repeated_Offset2,
|
||||
// an offset_value of 2 means Repeated_Offset3, and an offset_value of 3 means Repeated_Offset1 - 1_byte.
|
||||
mo++
|
||||
}
|
||||
|
||||
if mo == 0 {
|
||||
mo = s.prevOffset[0]
|
||||
} else {
|
||||
var temp int
|
||||
if mo == 3 {
|
||||
temp = s.prevOffset[0] - 1
|
||||
} else {
|
||||
temp = s.prevOffset[mo]
|
||||
}
|
||||
|
||||
if temp == 0 {
|
||||
// 0 is not valid; input is corrupted; force offset to 1
|
||||
println("WARNING: temp was 0")
|
||||
temp = 1
|
||||
}
|
||||
|
||||
if mo != 1 {
|
||||
s.prevOffset[2] = s.prevOffset[1]
|
||||
}
|
||||
s.prevOffset[1] = s.prevOffset[0]
|
||||
s.prevOffset[0] = temp
|
||||
mo = temp
|
||||
}
|
||||
}
|
||||
br.fillFast()
|
||||
} else {
|
||||
if br.overread() {
|
||||
if debugDecoder {
|
||||
printf("reading sequence %d, exceeded available data\n", i)
|
||||
}
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
ll, mo, ml = s.next(br, llState, mlState, ofState)
|
||||
br.fill()
|
||||
}
|
||||
|
||||
if debugSequences {
|
||||
println("Seq", i, "Litlen:", ll, "mo:", mo, "(abs) ml:", ml)
|
||||
}
|
||||
// Evaluate.
|
||||
// We might be doing this async, so do it early.
|
||||
if mo == 0 && ml > 0 {
|
||||
return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml)
|
||||
}
|
||||
if ml > maxMatchLen {
|
||||
return fmt.Errorf("match len (%d) bigger than max allowed length", ml)
|
||||
}
|
||||
s.seqSize += ll + ml
|
||||
if s.seqSize > maxBlockSize {
|
||||
return fmt.Errorf("output (%d) bigger than max block size (%d)", s.seqSize, maxBlockSize)
|
||||
}
|
||||
litRemain -= ll
|
||||
if litRemain < 0 {
|
||||
return fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ll, litRemain+ll)
|
||||
}
|
||||
seqs[i] = seqVals{
|
||||
ll: ll,
|
||||
ml: ml,
|
||||
mo: mo,
|
||||
}
|
||||
if i == len(seqs)-1 {
|
||||
// This is the last sequence, so we shouldn't update state.
|
||||
break
|
||||
}
|
||||
|
||||
// Manually inlined, ~ 5-20% faster
|
||||
// Update all 3 states at once. Approx 20% faster.
|
||||
nBits := llState.nbBits() + mlState.nbBits() + ofState.nbBits()
|
||||
if nBits == 0 {
|
||||
llState = llTable[llState.newState()&maxTableMask]
|
||||
mlState = mlTable[mlState.newState()&maxTableMask]
|
||||
ofState = ofTable[ofState.newState()&maxTableMask]
|
||||
} else {
|
||||
bits := br.get32BitsFast(nBits)
|
||||
lowBits := uint16(bits >> ((ofState.nbBits() + mlState.nbBits()) & 31))
|
||||
llState = llTable[(llState.newState()+lowBits)&maxTableMask]
|
||||
|
||||
lowBits = uint16(bits >> (ofState.nbBits() & 31))
|
||||
lowBits &= bitMask[mlState.nbBits()&15]
|
||||
mlState = mlTable[(mlState.newState()+lowBits)&maxTableMask]
|
||||
|
||||
lowBits = uint16(bits) & bitMask[ofState.nbBits()&15]
|
||||
ofState = ofTable[(ofState.newState()+lowBits)&maxTableMask]
|
||||
}
|
||||
}
|
||||
s.seqSize += litRemain
|
||||
if s.seqSize > maxBlockSize {
|
||||
return fmt.Errorf("output (%d) bigger than max block size (%d)", s.seqSize, maxBlockSize)
|
||||
}
|
||||
err := br.close()
|
||||
if err != nil {
|
||||
printf("Closing sequences: %v, %+v\n", err, *br)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// execute will execute the decoded sequence with the provided history.
|
||||
// The sequence must be evaluated before being sent.
|
||||
func (s *sequenceDecs) execute(seqs []seqVals, hist []byte) error {
|
||||
if len(s.dict) == 0 {
|
||||
return s.executeSimple(seqs, hist)
|
||||
}
|
||||
|
||||
// Ensure we have enough output size...
|
||||
if len(s.out)+s.seqSize > cap(s.out) {
|
||||
addBytes := s.seqSize + len(s.out)
|
||||
@@ -341,14 +202,19 @@ func (s *sequenceDecs) execute(seqs []seqVals, hist []byte) error {
|
||||
}
|
||||
|
||||
// decode sequences from the stream with the provided history.
|
||||
func (s *sequenceDecs) decodeSync(history *history) error {
|
||||
func (s *sequenceDecs) decodeSync(hist []byte) error {
|
||||
if true {
|
||||
supported, err := s.decodeSyncSimple(hist)
|
||||
if supported {
|
||||
return err
|
||||
}
|
||||
}
|
||||
br := s.br
|
||||
seqs := s.nSeqs
|
||||
startSize := len(s.out)
|
||||
// Grab full sizes tables, to avoid bounds checks.
|
||||
llTable, mlTable, ofTable := s.litLengths.fse.dt[:maxTablesize], s.matchLengths.fse.dt[:maxTablesize], s.offsets.fse.dt[:maxTablesize]
|
||||
llState, mlState, ofState := s.litLengths.state.state, s.matchLengths.state.state, s.offsets.state.state
|
||||
hist := history.b[history.ignoreBuffer:]
|
||||
out := s.out
|
||||
maxBlockSize := maxCompressedBlockSize
|
||||
if s.windowSize < maxBlockSize {
|
||||
@@ -433,7 +299,7 @@ func (s *sequenceDecs) decodeSync(history *history) error {
|
||||
}
|
||||
size := ll + ml + len(out)
|
||||
if size-startSize > maxBlockSize {
|
||||
return fmt.Errorf("output (%d) bigger than max block size (%d)", size, maxBlockSize)
|
||||
return fmt.Errorf("output (%d) bigger than max block size (%d)", size-startSize, maxBlockSize)
|
||||
}
|
||||
if size > cap(out) {
|
||||
// Not enough size, which can happen under high volume block streaming conditions
|
||||
@@ -463,13 +329,13 @@ func (s *sequenceDecs) decodeSync(history *history) error {
|
||||
|
||||
if mo > len(out)+len(hist) || mo > s.windowSize {
|
||||
if len(s.dict) == 0 {
|
||||
return fmt.Errorf("match offset (%d) bigger than current history (%d)", mo, len(out)+len(hist))
|
||||
return fmt.Errorf("match offset (%d) bigger than current history (%d)", mo, len(out)+len(hist)-startSize)
|
||||
}
|
||||
|
||||
// we may be in dictionary.
|
||||
dictO := len(s.dict) - (mo - (len(out) + len(hist)))
|
||||
if dictO < 0 || dictO >= len(s.dict) {
|
||||
return fmt.Errorf("match offset (%d) bigger than current history (%d)", mo, len(out)+len(hist))
|
||||
return fmt.Errorf("match offset (%d) bigger than current history (%d)", mo, len(out)+len(hist)-startSize)
|
||||
}
|
||||
end := dictO + ml
|
||||
if end > len(s.dict) {
|
||||
@@ -543,8 +409,8 @@ func (s *sequenceDecs) decodeSync(history *history) error {
|
||||
}
|
||||
|
||||
// Check if space for literals
|
||||
if len(s.literals)+len(s.out)-startSize > maxBlockSize {
|
||||
return fmt.Errorf("output (%d) bigger than max block size (%d)", len(s.out), maxBlockSize)
|
||||
if size := len(s.literals) + len(s.out) - startSize; size > maxBlockSize {
|
||||
return fmt.Errorf("output (%d) bigger than max block size (%d)", size, maxBlockSize)
|
||||
}
|
||||
|
||||
// Add final literals
|
||||
|
||||
+350
@@ -0,0 +1,350 @@
|
||||
//go:build amd64 && !appengine && !noasm && gc
|
||||
// +build amd64,!appengine,!noasm,gc
|
||||
|
||||
package zstd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/klauspost/compress/internal/cpuinfo"
|
||||
)
|
||||
|
||||
type decodeSyncAsmContext struct {
|
||||
llTable []decSymbol
|
||||
mlTable []decSymbol
|
||||
ofTable []decSymbol
|
||||
llState uint64
|
||||
mlState uint64
|
||||
ofState uint64
|
||||
iteration int
|
||||
litRemain int
|
||||
out []byte
|
||||
outPosition int
|
||||
literals []byte
|
||||
litPosition int
|
||||
history []byte
|
||||
windowSize int
|
||||
ll int // set on error (not for all errors, please refer to _generate/gen.go)
|
||||
ml int // set on error (not for all errors, please refer to _generate/gen.go)
|
||||
mo int // set on error (not for all errors, please refer to _generate/gen.go)
|
||||
}
|
||||
|
||||
// sequenceDecs_decodeSync_amd64 implements the main loop of sequenceDecs.decodeSync in x86 asm.
|
||||
//
|
||||
// Please refer to seqdec_generic.go for the reference implementation.
|
||||
//go:noescape
|
||||
func sequenceDecs_decodeSync_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int
|
||||
|
||||
// sequenceDecs_decodeSync_bmi2 implements the main loop of sequenceDecs.decodeSync in x86 asm with BMI2 extensions.
|
||||
//go:noescape
|
||||
func sequenceDecs_decodeSync_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int
|
||||
|
||||
// sequenceDecs_decodeSync_safe_amd64 does the same as above, but does not write more than output buffer.
|
||||
//go:noescape
|
||||
func sequenceDecs_decodeSync_safe_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int
|
||||
|
||||
// sequenceDecs_decodeSync_safe_bmi2 does the same as above, but does not write more than output buffer.
|
||||
//go:noescape
|
||||
func sequenceDecs_decodeSync_safe_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int
|
||||
|
||||
// decode sequences from the stream with the provided history but without a dictionary.
|
||||
func (s *sequenceDecs) decodeSyncSimple(hist []byte) (bool, error) {
|
||||
if len(s.dict) > 0 {
|
||||
return false, nil
|
||||
}
|
||||
if s.maxSyncLen == 0 && cap(s.out)-len(s.out) < maxCompressedBlockSize {
|
||||
return false, nil
|
||||
}
|
||||
useSafe := false
|
||||
if s.maxSyncLen == 0 && cap(s.out)-len(s.out) < maxCompressedBlockSizeAlloc {
|
||||
useSafe = true
|
||||
}
|
||||
if s.maxSyncLen > 0 && cap(s.out)-len(s.out)-compressedBlockOverAlloc < int(s.maxSyncLen) {
|
||||
useSafe = true
|
||||
}
|
||||
br := s.br
|
||||
|
||||
maxBlockSize := maxCompressedBlockSize
|
||||
if s.windowSize < maxBlockSize {
|
||||
maxBlockSize = s.windowSize
|
||||
}
|
||||
|
||||
ctx := decodeSyncAsmContext{
|
||||
llTable: s.litLengths.fse.dt[:maxTablesize],
|
||||
mlTable: s.matchLengths.fse.dt[:maxTablesize],
|
||||
ofTable: s.offsets.fse.dt[:maxTablesize],
|
||||
llState: uint64(s.litLengths.state.state),
|
||||
mlState: uint64(s.matchLengths.state.state),
|
||||
ofState: uint64(s.offsets.state.state),
|
||||
iteration: s.nSeqs - 1,
|
||||
litRemain: len(s.literals),
|
||||
out: s.out,
|
||||
outPosition: len(s.out),
|
||||
literals: s.literals,
|
||||
windowSize: s.windowSize,
|
||||
history: hist,
|
||||
}
|
||||
|
||||
s.seqSize = 0
|
||||
startSize := len(s.out)
|
||||
|
||||
var errCode int
|
||||
if cpuinfo.HasBMI2() {
|
||||
if useSafe {
|
||||
errCode = sequenceDecs_decodeSync_safe_bmi2(s, br, &ctx)
|
||||
} else {
|
||||
errCode = sequenceDecs_decodeSync_bmi2(s, br, &ctx)
|
||||
}
|
||||
} else {
|
||||
if useSafe {
|
||||
errCode = sequenceDecs_decodeSync_safe_amd64(s, br, &ctx)
|
||||
} else {
|
||||
errCode = sequenceDecs_decodeSync_amd64(s, br, &ctx)
|
||||
}
|
||||
}
|
||||
switch errCode {
|
||||
case noError:
|
||||
break
|
||||
|
||||
case errorMatchLenOfsMismatch:
|
||||
return true, fmt.Errorf("zero matchoff and matchlen (%d) > 0", ctx.ml)
|
||||
|
||||
case errorMatchLenTooBig:
|
||||
return true, fmt.Errorf("match len (%d) bigger than max allowed length", ctx.ml)
|
||||
|
||||
case errorMatchOffTooBig:
|
||||
return true, fmt.Errorf("match offset (%d) bigger than current history (%d)",
|
||||
ctx.mo, ctx.outPosition+len(hist)-startSize)
|
||||
|
||||
case errorNotEnoughLiterals:
|
||||
return true, fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available",
|
||||
ctx.ll, ctx.litRemain+ctx.ll)
|
||||
|
||||
case errorNotEnoughSpace:
|
||||
size := ctx.outPosition + ctx.ll + ctx.ml
|
||||
if debugDecoder {
|
||||
println("msl:", s.maxSyncLen, "cap", cap(s.out), "bef:", startSize, "sz:", size-startSize, "mbs:", maxBlockSize, "outsz:", cap(s.out)-startSize)
|
||||
}
|
||||
return true, fmt.Errorf("output (%d) bigger than max block size (%d)", size-startSize, maxBlockSize)
|
||||
|
||||
default:
|
||||
return true, fmt.Errorf("sequenceDecs_decode returned erronous code %d", errCode)
|
||||
}
|
||||
|
||||
s.seqSize += ctx.litRemain
|
||||
if s.seqSize > maxBlockSize {
|
||||
return true, fmt.Errorf("output (%d) bigger than max block size (%d)", s.seqSize, maxBlockSize)
|
||||
}
|
||||
err := br.close()
|
||||
if err != nil {
|
||||
printf("Closing sequences: %v, %+v\n", err, *br)
|
||||
return true, err
|
||||
}
|
||||
|
||||
s.literals = s.literals[ctx.litPosition:]
|
||||
t := ctx.outPosition
|
||||
s.out = s.out[:t]
|
||||
|
||||
// Add final literals
|
||||
s.out = append(s.out, s.literals...)
|
||||
if debugDecoder {
|
||||
t += len(s.literals)
|
||||
if t != len(s.out) {
|
||||
panic(fmt.Errorf("length mismatch, want %d, got %d", len(s.out), t))
|
||||
}
|
||||
}
|
||||
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
type decodeAsmContext struct {
|
||||
llTable []decSymbol
|
||||
mlTable []decSymbol
|
||||
ofTable []decSymbol
|
||||
llState uint64
|
||||
mlState uint64
|
||||
ofState uint64
|
||||
iteration int
|
||||
seqs []seqVals
|
||||
litRemain int
|
||||
}
|
||||
|
||||
const noError = 0
|
||||
|
||||
// error reported when mo == 0 && ml > 0
|
||||
const errorMatchLenOfsMismatch = 1
|
||||
|
||||
// error reported when ml > maxMatchLen
|
||||
const errorMatchLenTooBig = 2
|
||||
|
||||
// error reported when mo > available history or mo > s.windowSize
|
||||
const errorMatchOffTooBig = 3
|
||||
|
||||
// error reported when the sum of literal lengths exeeceds the literal buffer size
|
||||
const errorNotEnoughLiterals = 4
|
||||
|
||||
// error reported when capacity of `out` is too small
|
||||
const errorNotEnoughSpace = 5
|
||||
|
||||
// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm.
|
||||
//
|
||||
// Please refer to seqdec_generic.go for the reference implementation.
|
||||
//go:noescape
|
||||
func sequenceDecs_decode_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int
|
||||
|
||||
// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm.
|
||||
//
|
||||
// Please refer to seqdec_generic.go for the reference implementation.
|
||||
//go:noescape
|
||||
func sequenceDecs_decode_56_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int
|
||||
|
||||
// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm with BMI2 extensions.
|
||||
//go:noescape
|
||||
func sequenceDecs_decode_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int
|
||||
|
||||
// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm with BMI2 extensions.
|
||||
//go:noescape
|
||||
func sequenceDecs_decode_56_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int
|
||||
|
||||
// decode sequences from the stream without the provided history.
|
||||
func (s *sequenceDecs) decode(seqs []seqVals) error {
|
||||
br := s.br
|
||||
|
||||
maxBlockSize := maxCompressedBlockSize
|
||||
if s.windowSize < maxBlockSize {
|
||||
maxBlockSize = s.windowSize
|
||||
}
|
||||
|
||||
ctx := decodeAsmContext{
|
||||
llTable: s.litLengths.fse.dt[:maxTablesize],
|
||||
mlTable: s.matchLengths.fse.dt[:maxTablesize],
|
||||
ofTable: s.offsets.fse.dt[:maxTablesize],
|
||||
llState: uint64(s.litLengths.state.state),
|
||||
mlState: uint64(s.matchLengths.state.state),
|
||||
ofState: uint64(s.offsets.state.state),
|
||||
seqs: seqs,
|
||||
iteration: len(seqs) - 1,
|
||||
litRemain: len(s.literals),
|
||||
}
|
||||
|
||||
s.seqSize = 0
|
||||
lte56bits := s.maxBits+s.offsets.fse.actualTableLog+s.matchLengths.fse.actualTableLog+s.litLengths.fse.actualTableLog <= 56
|
||||
var errCode int
|
||||
if cpuinfo.HasBMI2() {
|
||||
if lte56bits {
|
||||
errCode = sequenceDecs_decode_56_bmi2(s, br, &ctx)
|
||||
} else {
|
||||
errCode = sequenceDecs_decode_bmi2(s, br, &ctx)
|
||||
}
|
||||
} else {
|
||||
if lte56bits {
|
||||
errCode = sequenceDecs_decode_56_amd64(s, br, &ctx)
|
||||
} else {
|
||||
errCode = sequenceDecs_decode_amd64(s, br, &ctx)
|
||||
}
|
||||
}
|
||||
if errCode != 0 {
|
||||
i := len(seqs) - ctx.iteration - 1
|
||||
switch errCode {
|
||||
case errorMatchLenOfsMismatch:
|
||||
ml := ctx.seqs[i].ml
|
||||
return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml)
|
||||
|
||||
case errorMatchLenTooBig:
|
||||
ml := ctx.seqs[i].ml
|
||||
return fmt.Errorf("match len (%d) bigger than max allowed length", ml)
|
||||
|
||||
case errorNotEnoughLiterals:
|
||||
ll := ctx.seqs[i].ll
|
||||
return fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ll, ctx.litRemain+ll)
|
||||
}
|
||||
|
||||
return fmt.Errorf("sequenceDecs_decode_amd64 returned erronous code %d", errCode)
|
||||
}
|
||||
|
||||
if ctx.litRemain < 0 {
|
||||
return fmt.Errorf("literal count is too big: total available %d, total requested %d",
|
||||
len(s.literals), len(s.literals)-ctx.litRemain)
|
||||
}
|
||||
|
||||
s.seqSize += ctx.litRemain
|
||||
if s.seqSize > maxBlockSize {
|
||||
return fmt.Errorf("output (%d) bigger than max block size (%d)", s.seqSize, maxBlockSize)
|
||||
}
|
||||
err := br.close()
|
||||
if err != nil {
|
||||
printf("Closing sequences: %v, %+v\n", err, *br)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
type executeAsmContext struct {
|
||||
seqs []seqVals
|
||||
seqIndex int
|
||||
out []byte
|
||||
history []byte
|
||||
literals []byte
|
||||
outPosition int
|
||||
litPosition int
|
||||
windowSize int
|
||||
}
|
||||
|
||||
// sequenceDecs_executeSimple_amd64 implements the main loop of sequenceDecs.executeSimple in x86 asm.
|
||||
//
|
||||
// Returns false if a match offset is too big.
|
||||
//
|
||||
// Please refer to seqdec_generic.go for the reference implementation.
|
||||
//go:noescape
|
||||
func sequenceDecs_executeSimple_amd64(ctx *executeAsmContext) bool
|
||||
|
||||
// executeSimple handles cases when dictionary is not used.
|
||||
func (s *sequenceDecs) executeSimple(seqs []seqVals, hist []byte) error {
|
||||
// Ensure we have enough output size...
|
||||
if len(s.out)+s.seqSize+compressedBlockOverAlloc > cap(s.out) {
|
||||
addBytes := s.seqSize + len(s.out) + compressedBlockOverAlloc
|
||||
s.out = append(s.out, make([]byte, addBytes)...)
|
||||
s.out = s.out[:len(s.out)-addBytes]
|
||||
}
|
||||
|
||||
if debugDecoder {
|
||||
printf("Execute %d seqs with literals: %d into %d bytes\n", len(seqs), len(s.literals), s.seqSize)
|
||||
}
|
||||
|
||||
var t = len(s.out)
|
||||
out := s.out[:t+s.seqSize]
|
||||
|
||||
ctx := executeAsmContext{
|
||||
seqs: seqs,
|
||||
seqIndex: 0,
|
||||
out: out,
|
||||
history: hist,
|
||||
outPosition: t,
|
||||
litPosition: 0,
|
||||
literals: s.literals,
|
||||
windowSize: s.windowSize,
|
||||
}
|
||||
|
||||
ok := sequenceDecs_executeSimple_amd64(&ctx)
|
||||
if !ok {
|
||||
return fmt.Errorf("match offset (%d) bigger than current history (%d)",
|
||||
seqs[ctx.seqIndex].mo, ctx.outPosition+len(hist))
|
||||
}
|
||||
s.literals = s.literals[ctx.litPosition:]
|
||||
t = ctx.outPosition
|
||||
|
||||
// Add final literals
|
||||
copy(out[t:], s.literals)
|
||||
if debugDecoder {
|
||||
t += len(s.literals)
|
||||
if t != len(out) {
|
||||
panic(fmt.Errorf("length mismatch, want %d, got %d, ss: %d", len(out), t, s.seqSize))
|
||||
}
|
||||
}
|
||||
s.out = out
|
||||
|
||||
return nil
|
||||
}
|
||||
+3519
File diff suppressed because it is too large
Load Diff
+237
@@ -0,0 +1,237 @@
|
||||
//go:build !amd64 || appengine || !gc || noasm
|
||||
// +build !amd64 appengine !gc noasm
|
||||
|
||||
package zstd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
)
|
||||
|
||||
// decode sequences from the stream with the provided history but without dictionary.
|
||||
func (s *sequenceDecs) decodeSyncSimple(hist []byte) (bool, error) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// decode sequences from the stream without the provided history.
|
||||
func (s *sequenceDecs) decode(seqs []seqVals) error {
|
||||
br := s.br
|
||||
|
||||
// Grab full sizes tables, to avoid bounds checks.
|
||||
llTable, mlTable, ofTable := s.litLengths.fse.dt[:maxTablesize], s.matchLengths.fse.dt[:maxTablesize], s.offsets.fse.dt[:maxTablesize]
|
||||
llState, mlState, ofState := s.litLengths.state.state, s.matchLengths.state.state, s.offsets.state.state
|
||||
s.seqSize = 0
|
||||
litRemain := len(s.literals)
|
||||
|
||||
maxBlockSize := maxCompressedBlockSize
|
||||
if s.windowSize < maxBlockSize {
|
||||
maxBlockSize = s.windowSize
|
||||
}
|
||||
for i := range seqs {
|
||||
var ll, mo, ml int
|
||||
if br.off > 4+((maxOffsetBits+16+16)>>3) {
|
||||
// inlined function:
|
||||
// ll, mo, ml = s.nextFast(br, llState, mlState, ofState)
|
||||
|
||||
// Final will not read from stream.
|
||||
var llB, mlB, moB uint8
|
||||
ll, llB = llState.final()
|
||||
ml, mlB = mlState.final()
|
||||
mo, moB = ofState.final()
|
||||
|
||||
// extra bits are stored in reverse order.
|
||||
br.fillFast()
|
||||
mo += br.getBits(moB)
|
||||
if s.maxBits > 32 {
|
||||
br.fillFast()
|
||||
}
|
||||
ml += br.getBits(mlB)
|
||||
ll += br.getBits(llB)
|
||||
|
||||
if moB > 1 {
|
||||
s.prevOffset[2] = s.prevOffset[1]
|
||||
s.prevOffset[1] = s.prevOffset[0]
|
||||
s.prevOffset[0] = mo
|
||||
} else {
|
||||
// mo = s.adjustOffset(mo, ll, moB)
|
||||
// Inlined for rather big speedup
|
||||
if ll == 0 {
|
||||
// There is an exception though, when current sequence's literals_length = 0.
|
||||
// In this case, repeated offsets are shifted by one, so an offset_value of 1 means Repeated_Offset2,
|
||||
// an offset_value of 2 means Repeated_Offset3, and an offset_value of 3 means Repeated_Offset1 - 1_byte.
|
||||
mo++
|
||||
}
|
||||
|
||||
if mo == 0 {
|
||||
mo = s.prevOffset[0]
|
||||
} else {
|
||||
var temp int
|
||||
if mo == 3 {
|
||||
temp = s.prevOffset[0] - 1
|
||||
} else {
|
||||
temp = s.prevOffset[mo]
|
||||
}
|
||||
|
||||
if temp == 0 {
|
||||
// 0 is not valid; input is corrupted; force offset to 1
|
||||
println("WARNING: temp was 0")
|
||||
temp = 1
|
||||
}
|
||||
|
||||
if mo != 1 {
|
||||
s.prevOffset[2] = s.prevOffset[1]
|
||||
}
|
||||
s.prevOffset[1] = s.prevOffset[0]
|
||||
s.prevOffset[0] = temp
|
||||
mo = temp
|
||||
}
|
||||
}
|
||||
br.fillFast()
|
||||
} else {
|
||||
if br.overread() {
|
||||
if debugDecoder {
|
||||
printf("reading sequence %d, exceeded available data\n", i)
|
||||
}
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
ll, mo, ml = s.next(br, llState, mlState, ofState)
|
||||
br.fill()
|
||||
}
|
||||
|
||||
if debugSequences {
|
||||
println("Seq", i, "Litlen:", ll, "mo:", mo, "(abs) ml:", ml)
|
||||
}
|
||||
// Evaluate.
|
||||
// We might be doing this async, so do it early.
|
||||
if mo == 0 && ml > 0 {
|
||||
return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml)
|
||||
}
|
||||
if ml > maxMatchLen {
|
||||
return fmt.Errorf("match len (%d) bigger than max allowed length", ml)
|
||||
}
|
||||
s.seqSize += ll + ml
|
||||
if s.seqSize > maxBlockSize {
|
||||
return fmt.Errorf("output (%d) bigger than max block size (%d)", s.seqSize, maxBlockSize)
|
||||
}
|
||||
litRemain -= ll
|
||||
if litRemain < 0 {
|
||||
return fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ll, litRemain+ll)
|
||||
}
|
||||
seqs[i] = seqVals{
|
||||
ll: ll,
|
||||
ml: ml,
|
||||
mo: mo,
|
||||
}
|
||||
if i == len(seqs)-1 {
|
||||
// This is the last sequence, so we shouldn't update state.
|
||||
break
|
||||
}
|
||||
|
||||
// Manually inlined, ~ 5-20% faster
|
||||
// Update all 3 states at once. Approx 20% faster.
|
||||
nBits := llState.nbBits() + mlState.nbBits() + ofState.nbBits()
|
||||
if nBits == 0 {
|
||||
llState = llTable[llState.newState()&maxTableMask]
|
||||
mlState = mlTable[mlState.newState()&maxTableMask]
|
||||
ofState = ofTable[ofState.newState()&maxTableMask]
|
||||
} else {
|
||||
bits := br.get32BitsFast(nBits)
|
||||
lowBits := uint16(bits >> ((ofState.nbBits() + mlState.nbBits()) & 31))
|
||||
llState = llTable[(llState.newState()+lowBits)&maxTableMask]
|
||||
|
||||
lowBits = uint16(bits >> (ofState.nbBits() & 31))
|
||||
lowBits &= bitMask[mlState.nbBits()&15]
|
||||
mlState = mlTable[(mlState.newState()+lowBits)&maxTableMask]
|
||||
|
||||
lowBits = uint16(bits) & bitMask[ofState.nbBits()&15]
|
||||
ofState = ofTable[(ofState.newState()+lowBits)&maxTableMask]
|
||||
}
|
||||
}
|
||||
s.seqSize += litRemain
|
||||
if s.seqSize > maxBlockSize {
|
||||
return fmt.Errorf("output (%d) bigger than max block size (%d)", s.seqSize, maxBlockSize)
|
||||
}
|
||||
err := br.close()
|
||||
if err != nil {
|
||||
printf("Closing sequences: %v, %+v\n", err, *br)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// executeSimple handles cases when a dictionary is not used.
|
||||
func (s *sequenceDecs) executeSimple(seqs []seqVals, hist []byte) error {
|
||||
// Ensure we have enough output size...
|
||||
if len(s.out)+s.seqSize > cap(s.out) {
|
||||
addBytes := s.seqSize + len(s.out)
|
||||
s.out = append(s.out, make([]byte, addBytes)...)
|
||||
s.out = s.out[:len(s.out)-addBytes]
|
||||
}
|
||||
|
||||
if debugDecoder {
|
||||
printf("Execute %d seqs with literals: %d into %d bytes\n", len(seqs), len(s.literals), s.seqSize)
|
||||
}
|
||||
|
||||
var t = len(s.out)
|
||||
out := s.out[:t+s.seqSize]
|
||||
|
||||
for _, seq := range seqs {
|
||||
// Add literals
|
||||
copy(out[t:], s.literals[:seq.ll])
|
||||
t += seq.ll
|
||||
s.literals = s.literals[seq.ll:]
|
||||
|
||||
// Malformed input
|
||||
if seq.mo > t+len(hist) || seq.mo > s.windowSize {
|
||||
return fmt.Errorf("match offset (%d) bigger than current history (%d)", seq.mo, t+len(hist))
|
||||
}
|
||||
|
||||
// Copy from history.
|
||||
if v := seq.mo - t; v > 0 {
|
||||
// v is the start position in history from end.
|
||||
start := len(hist) - v
|
||||
if seq.ml > v {
|
||||
// Some goes into the current block.
|
||||
// Copy remainder of history
|
||||
copy(out[t:], hist[start:])
|
||||
t += v
|
||||
seq.ml -= v
|
||||
} else {
|
||||
copy(out[t:], hist[start:start+seq.ml])
|
||||
t += seq.ml
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// We must be in the current buffer now
|
||||
if seq.ml > 0 {
|
||||
start := t - seq.mo
|
||||
if seq.ml <= t-start {
|
||||
// No overlap
|
||||
copy(out[t:], out[start:start+seq.ml])
|
||||
t += seq.ml
|
||||
} else {
|
||||
// Overlapping copy
|
||||
// Extend destination slice and copy one byte at the time.
|
||||
src := out[start : start+seq.ml]
|
||||
dst := out[t:]
|
||||
dst = dst[:len(src)]
|
||||
t += len(src)
|
||||
// Destination is the space we just added.
|
||||
for i := range src {
|
||||
dst[i] = src[i]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Add final literals
|
||||
copy(out[t:], s.literals)
|
||||
if debugDecoder {
|
||||
t += len(s.literals)
|
||||
if t != len(out) {
|
||||
panic(fmt.Errorf("length mismatch, want %d, got %d, ss: %d", len(out), t, s.seqSize))
|
||||
}
|
||||
}
|
||||
s.out = out
|
||||
|
||||
return nil
|
||||
}
|
||||
+31
-17
@@ -21,23 +21,34 @@ const ZipMethodPKWare = 20
|
||||
var zipReaderPool sync.Pool
|
||||
|
||||
// newZipReader creates a pooled zip decompressor.
|
||||
func newZipReader(r io.Reader) io.ReadCloser {
|
||||
dec, ok := zipReaderPool.Get().(*Decoder)
|
||||
if ok {
|
||||
dec.Reset(r)
|
||||
} else {
|
||||
d, err := NewReader(r, WithDecoderConcurrency(1), WithDecoderLowmem(true))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
func newZipReader(opts ...DOption) func(r io.Reader) io.ReadCloser {
|
||||
pool := &zipReaderPool
|
||||
if len(opts) > 0 {
|
||||
opts = append([]DOption{WithDecoderLowmem(true), WithDecoderMaxWindow(128 << 20)}, opts...)
|
||||
// Force concurrency 1
|
||||
opts = append(opts, WithDecoderConcurrency(1))
|
||||
// Create our own pool
|
||||
pool = &sync.Pool{}
|
||||
}
|
||||
return func(r io.Reader) io.ReadCloser {
|
||||
dec, ok := pool.Get().(*Decoder)
|
||||
if ok {
|
||||
dec.Reset(r)
|
||||
} else {
|
||||
d, err := NewReader(r, opts...)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
dec = d
|
||||
}
|
||||
dec = d
|
||||
return &pooledZipReader{dec: dec, pool: pool}
|
||||
}
|
||||
return &pooledZipReader{dec: dec}
|
||||
}
|
||||
|
||||
type pooledZipReader struct {
|
||||
mu sync.Mutex // guards Close and Read
|
||||
dec *Decoder
|
||||
mu sync.Mutex // guards Close and Read
|
||||
pool *sync.Pool
|
||||
dec *Decoder
|
||||
}
|
||||
|
||||
func (r *pooledZipReader) Read(p []byte) (n int, err error) {
|
||||
@@ -48,8 +59,8 @@ func (r *pooledZipReader) Read(p []byte) (n int, err error) {
|
||||
}
|
||||
dec, err := r.dec.Read(p)
|
||||
if err == io.EOF {
|
||||
err = r.dec.Reset(nil)
|
||||
zipReaderPool.Put(r.dec)
|
||||
r.dec.Reset(nil)
|
||||
r.pool.Put(r.dec)
|
||||
r.dec = nil
|
||||
}
|
||||
return dec, err
|
||||
@@ -61,7 +72,7 @@ func (r *pooledZipReader) Close() error {
|
||||
var err error
|
||||
if r.dec != nil {
|
||||
err = r.dec.Reset(nil)
|
||||
zipReaderPool.Put(r.dec)
|
||||
r.pool.Put(r.dec)
|
||||
r.dec = nil
|
||||
}
|
||||
return err
|
||||
@@ -115,6 +126,9 @@ func ZipCompressor(opts ...EOption) func(w io.Writer) (io.WriteCloser, error) {
|
||||
|
||||
// ZipDecompressor returns a decompressor that can be registered with zip libraries.
|
||||
// See ZipCompressor for example.
|
||||
func ZipDecompressor() func(r io.Reader) io.ReadCloser {
|
||||
return newZipReader
|
||||
// Options can be specified. WithDecoderConcurrency(1) is forced,
|
||||
// and by default a 128MB maximum decompression window is specified.
|
||||
// The window size can be overridden if required.
|
||||
func ZipDecompressor(opts ...DOption) func(r io.Reader) io.ReadCloser {
|
||||
return newZipReader(opts...)
|
||||
}
|
||||
|
||||
+2
-2
@@ -2,8 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
//
|
||||
//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh
|
||||
// +build 386 amd64 amd64p32 alpha arm arm64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh
|
||||
//go:build 386 || amd64 || amd64p32 || alpha || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || nios2 || ppc64le || riscv || riscv64 || sh
|
||||
// +build 386 amd64 amd64p32 alpha arm arm64 loong64 mipsle mips64le mips64p32le nios2 ppc64le riscv riscv64 sh
|
||||
|
||||
package unix
|
||||
|
||||
|
||||
+191
@@ -0,0 +1,191 @@
|
||||
// Copyright 2022 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build loong64 && linux
|
||||
// +build loong64,linux
|
||||
|
||||
package unix
|
||||
|
||||
import "unsafe"
|
||||
|
||||
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT
|
||||
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
|
||||
//sys Fchown(fd int, uid int, gid int) (err error)
|
||||
//sys Fstat(fd int, stat *Stat_t) (err error)
|
||||
//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
|
||||
//sys Fstatfs(fd int, buf *Statfs_t) (err error)
|
||||
//sys Ftruncate(fd int, length int64) (err error)
|
||||
//sysnb Getegid() (egid int)
|
||||
//sysnb Geteuid() (euid int)
|
||||
//sysnb Getgid() (gid int)
|
||||
//sysnb Getuid() (uid int)
|
||||
//sys Listen(s int, n int) (err error)
|
||||
//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
|
||||
//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
|
||||
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
|
||||
|
||||
func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
|
||||
var ts *Timespec
|
||||
if timeout != nil {
|
||||
ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000}
|
||||
}
|
||||
return Pselect(nfd, r, w, e, ts, nil)
|
||||
}
|
||||
|
||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
||||
//sys setfsgid(gid int) (prev int, err error)
|
||||
//sys setfsuid(uid int) (prev int, err error)
|
||||
//sysnb Setregid(rgid int, egid int) (err error)
|
||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
||||
//sysnb Setreuid(ruid int, euid int) (err error)
|
||||
//sys Shutdown(fd int, how int) (err error)
|
||||
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
|
||||
|
||||
func Stat(path string, stat *Stat_t) (err error) {
|
||||
return Fstatat(AT_FDCWD, path, stat, 0)
|
||||
}
|
||||
|
||||
func Lchown(path string, uid int, gid int) (err error) {
|
||||
return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW)
|
||||
}
|
||||
|
||||
func Lstat(path string, stat *Stat_t) (err error) {
|
||||
return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW)
|
||||
}
|
||||
|
||||
//sys Statfs(path string, buf *Statfs_t) (err error)
|
||||
//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error)
|
||||
//sys Truncate(path string, length int64) (err error)
|
||||
|
||||
func Ustat(dev int, ubuf *Ustat_t) (err error) {
|
||||
return ENOSYS
|
||||
}
|
||||
|
||||
//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
|
||||
//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
|
||||
//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
|
||||
//sysnb getgroups(n int, list *_Gid_t) (nn int, err error)
|
||||
//sysnb setgroups(n int, list *_Gid_t) (err error)
|
||||
//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
|
||||
//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
|
||||
//sysnb socket(domain int, typ int, proto int) (fd int, err error)
|
||||
//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
|
||||
//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
|
||||
//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
|
||||
//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
|
||||
//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
|
||||
//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
|
||||
//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
|
||||
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
|
||||
|
||||
//sysnb Gettimeofday(tv *Timeval) (err error)
|
||||
|
||||
func setTimespec(sec, nsec int64) Timespec {
|
||||
return Timespec{Sec: sec, Nsec: nsec}
|
||||
}
|
||||
|
||||
func setTimeval(sec, usec int64) Timeval {
|
||||
return Timeval{Sec: sec, Usec: usec}
|
||||
}
|
||||
|
||||
func Getrlimit(resource int, rlim *Rlimit) (err error) {
|
||||
err = Prlimit(0, resource, nil, rlim)
|
||||
return
|
||||
}
|
||||
|
||||
func Setrlimit(resource int, rlim *Rlimit) (err error) {
|
||||
err = Prlimit(0, resource, rlim, nil)
|
||||
return
|
||||
}
|
||||
|
||||
func futimesat(dirfd int, path string, tv *[2]Timeval) (err error) {
|
||||
if tv == nil {
|
||||
return utimensat(dirfd, path, nil, 0)
|
||||
}
|
||||
|
||||
ts := []Timespec{
|
||||
NsecToTimespec(TimevalToNsec(tv[0])),
|
||||
NsecToTimespec(TimevalToNsec(tv[1])),
|
||||
}
|
||||
return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
|
||||
}
|
||||
|
||||
func Time(t *Time_t) (Time_t, error) {
|
||||
var tv Timeval
|
||||
err := Gettimeofday(&tv)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if t != nil {
|
||||
*t = Time_t(tv.Sec)
|
||||
}
|
||||
return Time_t(tv.Sec), nil
|
||||
}
|
||||
|
||||
func Utime(path string, buf *Utimbuf) error {
|
||||
tv := []Timeval{
|
||||
{Sec: buf.Actime},
|
||||
{Sec: buf.Modtime},
|
||||
}
|
||||
return Utimes(path, tv)
|
||||
}
|
||||
|
||||
func utimes(path string, tv *[2]Timeval) (err error) {
|
||||
if tv == nil {
|
||||
return utimensat(AT_FDCWD, path, nil, 0)
|
||||
}
|
||||
|
||||
ts := []Timespec{
|
||||
NsecToTimespec(TimevalToNsec(tv[0])),
|
||||
NsecToTimespec(TimevalToNsec(tv[1])),
|
||||
}
|
||||
return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
|
||||
}
|
||||
|
||||
func (r *PtraceRegs) PC() uint64 { return r.Era }
|
||||
|
||||
func (r *PtraceRegs) SetPC(era uint64) { r.Era = era }
|
||||
|
||||
func (iov *Iovec) SetLen(length int) {
|
||||
iov.Len = uint64(length)
|
||||
}
|
||||
|
||||
func (msghdr *Msghdr) SetControllen(length int) {
|
||||
msghdr.Controllen = uint64(length)
|
||||
}
|
||||
|
||||
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||
msghdr.Iovlen = uint64(length)
|
||||
}
|
||||
|
||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||
cmsg.Len = uint64(length)
|
||||
}
|
||||
|
||||
func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) {
|
||||
rsa.Service_name_len = uint64(length)
|
||||
}
|
||||
|
||||
func Pause() error {
|
||||
_, err := ppoll(nil, 0, nil, nil)
|
||||
return err
|
||||
}
|
||||
|
||||
func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {
|
||||
return Renameat2(olddirfd, oldpath, newdirfd, newpath, 0)
|
||||
}
|
||||
|
||||
//sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error)
|
||||
|
||||
func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error {
|
||||
cmdlineLen := len(cmdline)
|
||||
if cmdlineLen > 0 {
|
||||
// Account for the additional NULL byte added by
|
||||
// BytePtrFromString in kexecFileLoad. The kexec_file_load
|
||||
// syscall expects a NULL-terminated string.
|
||||
cmdlineLen++
|
||||
}
|
||||
return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags)
|
||||
}
|
||||
+1
@@ -1310,6 +1310,7 @@ const (
|
||||
KEXEC_ARCH_ARM = 0x280000
|
||||
KEXEC_ARCH_DEFAULT = 0x0
|
||||
KEXEC_ARCH_IA_64 = 0x320000
|
||||
KEXEC_ARCH_LOONGARCH = 0x1020000
|
||||
KEXEC_ARCH_MASK = 0xffff0000
|
||||
KEXEC_ARCH_MIPS = 0x80000
|
||||
KEXEC_ARCH_MIPS_LE = 0xa0000
|
||||
|
||||
+818
@@ -0,0 +1,818 @@
|
||||
// mkerrors.sh -Wall -Werror -static -I/tmp/include
|
||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||
|
||||
//go:build loong64 && linux
|
||||
// +build loong64,linux
|
||||
|
||||
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||
// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go
|
||||
|
||||
package unix
|
||||
|
||||
import "syscall"
|
||||
|
||||
const (
|
||||
B1000000 = 0x1008
|
||||
B115200 = 0x1002
|
||||
B1152000 = 0x1009
|
||||
B1500000 = 0x100a
|
||||
B2000000 = 0x100b
|
||||
B230400 = 0x1003
|
||||
B2500000 = 0x100c
|
||||
B3000000 = 0x100d
|
||||
B3500000 = 0x100e
|
||||
B4000000 = 0x100f
|
||||
B460800 = 0x1004
|
||||
B500000 = 0x1005
|
||||
B57600 = 0x1001
|
||||
B576000 = 0x1006
|
||||
B921600 = 0x1007
|
||||
BLKBSZGET = 0x80081270
|
||||
BLKBSZSET = 0x40081271
|
||||
BLKFLSBUF = 0x1261
|
||||
BLKFRAGET = 0x1265
|
||||
BLKFRASET = 0x1264
|
||||
BLKGETSIZE = 0x1260
|
||||
BLKGETSIZE64 = 0x80081272
|
||||
BLKPBSZGET = 0x127b
|
||||
BLKRAGET = 0x1263
|
||||
BLKRASET = 0x1262
|
||||
BLKROGET = 0x125e
|
||||
BLKROSET = 0x125d
|
||||
BLKRRPART = 0x125f
|
||||
BLKSECTGET = 0x1267
|
||||
BLKSECTSET = 0x1266
|
||||
BLKSSZGET = 0x1268
|
||||
BOTHER = 0x1000
|
||||
BS1 = 0x2000
|
||||
BSDLY = 0x2000
|
||||
CBAUD = 0x100f
|
||||
CBAUDEX = 0x1000
|
||||
CIBAUD = 0x100f0000
|
||||
CLOCAL = 0x800
|
||||
CR1 = 0x200
|
||||
CR2 = 0x400
|
||||
CR3 = 0x600
|
||||
CRDLY = 0x600
|
||||
CREAD = 0x80
|
||||
CS6 = 0x10
|
||||
CS7 = 0x20
|
||||
CS8 = 0x30
|
||||
CSIZE = 0x30
|
||||
CSTOPB = 0x40
|
||||
ECCGETLAYOUT = 0x81484d11
|
||||
ECCGETSTATS = 0x80104d12
|
||||
ECHOCTL = 0x200
|
||||
ECHOE = 0x10
|
||||
ECHOK = 0x20
|
||||
ECHOKE = 0x800
|
||||
ECHONL = 0x40
|
||||
ECHOPRT = 0x400
|
||||
EFD_CLOEXEC = 0x80000
|
||||
EFD_NONBLOCK = 0x800
|
||||
EPOLL_CLOEXEC = 0x80000
|
||||
EXTPROC = 0x10000
|
||||
FF1 = 0x8000
|
||||
FFDLY = 0x8000
|
||||
FICLONE = 0x40049409
|
||||
FICLONERANGE = 0x4020940d
|
||||
FLUSHO = 0x1000
|
||||
FPU_CTX_MAGIC = 0x46505501
|
||||
FS_IOC_ENABLE_VERITY = 0x40806685
|
||||
FS_IOC_GETFLAGS = 0x80086601
|
||||
FS_IOC_GET_ENCRYPTION_NONCE = 0x8010661b
|
||||
FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615
|
||||
FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614
|
||||
FS_IOC_SETFLAGS = 0x40086602
|
||||
FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613
|
||||
F_GETLK = 0x5
|
||||
F_GETLK64 = 0x5
|
||||
F_GETOWN = 0x9
|
||||
F_RDLCK = 0x0
|
||||
F_SETLK = 0x6
|
||||
F_SETLK64 = 0x6
|
||||
F_SETLKW = 0x7
|
||||
F_SETLKW64 = 0x7
|
||||
F_SETOWN = 0x8
|
||||
F_UNLCK = 0x2
|
||||
F_WRLCK = 0x1
|
||||
HIDIOCGRAWINFO = 0x80084803
|
||||
HIDIOCGRDESC = 0x90044802
|
||||
HIDIOCGRDESCSIZE = 0x80044801
|
||||
HUPCL = 0x400
|
||||
ICANON = 0x2
|
||||
IEXTEN = 0x8000
|
||||
IN_CLOEXEC = 0x80000
|
||||
IN_NONBLOCK = 0x800
|
||||
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
|
||||
ISIG = 0x1
|
||||
IUCLC = 0x200
|
||||
IXOFF = 0x1000
|
||||
IXON = 0x400
|
||||
LASX_CTX_MAGIC = 0x41535801
|
||||
LSX_CTX_MAGIC = 0x53580001
|
||||
MAP_ANON = 0x20
|
||||
MAP_ANONYMOUS = 0x20
|
||||
MAP_DENYWRITE = 0x800
|
||||
MAP_EXECUTABLE = 0x1000
|
||||
MAP_GROWSDOWN = 0x100
|
||||
MAP_HUGETLB = 0x40000
|
||||
MAP_LOCKED = 0x2000
|
||||
MAP_NONBLOCK = 0x10000
|
||||
MAP_NORESERVE = 0x4000
|
||||
MAP_POPULATE = 0x8000
|
||||
MAP_STACK = 0x20000
|
||||
MAP_SYNC = 0x80000
|
||||
MCL_CURRENT = 0x1
|
||||
MCL_FUTURE = 0x2
|
||||
MCL_ONFAULT = 0x4
|
||||
MEMERASE = 0x40084d02
|
||||
MEMERASE64 = 0x40104d14
|
||||
MEMGETBADBLOCK = 0x40084d0b
|
||||
MEMGETINFO = 0x80204d01
|
||||
MEMGETOOBSEL = 0x80c84d0a
|
||||
MEMGETREGIONCOUNT = 0x80044d07
|
||||
MEMISLOCKED = 0x80084d17
|
||||
MEMLOCK = 0x40084d05
|
||||
MEMREADOOB = 0xc0104d04
|
||||
MEMSETBADBLOCK = 0x40084d0c
|
||||
MEMUNLOCK = 0x40084d06
|
||||
MEMWRITEOOB = 0xc0104d03
|
||||
MTDFILEMODE = 0x4d13
|
||||
NFDBITS = 0x40
|
||||
NLDLY = 0x100
|
||||
NOFLSH = 0x80
|
||||
NS_GET_NSTYPE = 0xb703
|
||||
NS_GET_OWNER_UID = 0xb704
|
||||
NS_GET_PARENT = 0xb702
|
||||
NS_GET_USERNS = 0xb701
|
||||
OLCUC = 0x2
|
||||
ONLCR = 0x4
|
||||
OTPERASE = 0x400c4d19
|
||||
OTPGETREGIONCOUNT = 0x40044d0e
|
||||
OTPGETREGIONINFO = 0x400c4d0f
|
||||
OTPLOCK = 0x800c4d10
|
||||
OTPSELECT = 0x80044d0d
|
||||
O_APPEND = 0x400
|
||||
O_ASYNC = 0x2000
|
||||
O_CLOEXEC = 0x80000
|
||||
O_CREAT = 0x40
|
||||
O_DIRECT = 0x4000
|
||||
O_DIRECTORY = 0x10000
|
||||
O_DSYNC = 0x1000
|
||||
O_EXCL = 0x80
|
||||
O_FSYNC = 0x101000
|
||||
O_LARGEFILE = 0x0
|
||||
O_NDELAY = 0x800
|
||||
O_NOATIME = 0x40000
|
||||
O_NOCTTY = 0x100
|
||||
O_NOFOLLOW = 0x20000
|
||||
O_NONBLOCK = 0x800
|
||||
O_PATH = 0x200000
|
||||
O_RSYNC = 0x101000
|
||||
O_SYNC = 0x101000
|
||||
O_TMPFILE = 0x410000
|
||||
O_TRUNC = 0x200
|
||||
PARENB = 0x100
|
||||
PARODD = 0x200
|
||||
PENDIN = 0x4000
|
||||
PERF_EVENT_IOC_DISABLE = 0x2401
|
||||
PERF_EVENT_IOC_ENABLE = 0x2400
|
||||
PERF_EVENT_IOC_ID = 0x80082407
|
||||
PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b
|
||||
PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409
|
||||
PERF_EVENT_IOC_PERIOD = 0x40082404
|
||||
PERF_EVENT_IOC_QUERY_BPF = 0xc008240a
|
||||
PERF_EVENT_IOC_REFRESH = 0x2402
|
||||
PERF_EVENT_IOC_RESET = 0x2403
|
||||
PERF_EVENT_IOC_SET_BPF = 0x40042408
|
||||
PERF_EVENT_IOC_SET_FILTER = 0x40082406
|
||||
PERF_EVENT_IOC_SET_OUTPUT = 0x2405
|
||||
PPPIOCATTACH = 0x4004743d
|
||||
PPPIOCATTCHAN = 0x40047438
|
||||
PPPIOCBRIDGECHAN = 0x40047435
|
||||
PPPIOCCONNECT = 0x4004743a
|
||||
PPPIOCDETACH = 0x4004743c
|
||||
PPPIOCDISCONN = 0x7439
|
||||
PPPIOCGASYNCMAP = 0x80047458
|
||||
PPPIOCGCHAN = 0x80047437
|
||||
PPPIOCGDEBUG = 0x80047441
|
||||
PPPIOCGFLAGS = 0x8004745a
|
||||
PPPIOCGIDLE = 0x8010743f
|
||||
PPPIOCGIDLE32 = 0x8008743f
|
||||
PPPIOCGIDLE64 = 0x8010743f
|
||||
PPPIOCGL2TPSTATS = 0x80487436
|
||||
PPPIOCGMRU = 0x80047453
|
||||
PPPIOCGRASYNCMAP = 0x80047455
|
||||
PPPIOCGUNIT = 0x80047456
|
||||
PPPIOCGXASYNCMAP = 0x80207450
|
||||
PPPIOCSACTIVE = 0x40107446
|
||||
PPPIOCSASYNCMAP = 0x40047457
|
||||
PPPIOCSCOMPRESS = 0x4010744d
|
||||
PPPIOCSDEBUG = 0x40047440
|
||||
PPPIOCSFLAGS = 0x40047459
|
||||
PPPIOCSMAXCID = 0x40047451
|
||||
PPPIOCSMRRU = 0x4004743b
|
||||
PPPIOCSMRU = 0x40047452
|
||||
PPPIOCSNPMODE = 0x4008744b
|
||||
PPPIOCSPASS = 0x40107447
|
||||
PPPIOCSRASYNCMAP = 0x40047454
|
||||
PPPIOCSXASYNCMAP = 0x4020744f
|
||||
PPPIOCUNBRIDGECHAN = 0x7434
|
||||
PPPIOCXFERUNIT = 0x744e
|
||||
PR_SET_PTRACER_ANY = 0xffffffffffffffff
|
||||
PTRACE_SYSEMU = 0x1f
|
||||
PTRACE_SYSEMU_SINGLESTEP = 0x20
|
||||
RLIMIT_AS = 0x9
|
||||
RLIMIT_MEMLOCK = 0x8
|
||||
RLIMIT_NOFILE = 0x7
|
||||
RLIMIT_NPROC = 0x6
|
||||
RLIMIT_RSS = 0x5
|
||||
RNDADDENTROPY = 0x40085203
|
||||
RNDADDTOENTCNT = 0x40045201
|
||||
RNDCLEARPOOL = 0x5206
|
||||
RNDGETENTCNT = 0x80045200
|
||||
RNDGETPOOL = 0x80085202
|
||||
RNDRESEEDCRNG = 0x5207
|
||||
RNDZAPENTCNT = 0x5204
|
||||
RTC_AIE_OFF = 0x7002
|
||||
RTC_AIE_ON = 0x7001
|
||||
RTC_ALM_READ = 0x80247008
|
||||
RTC_ALM_SET = 0x40247007
|
||||
RTC_EPOCH_READ = 0x8008700d
|
||||
RTC_EPOCH_SET = 0x4008700e
|
||||
RTC_IRQP_READ = 0x8008700b
|
||||
RTC_IRQP_SET = 0x4008700c
|
||||
RTC_PARAM_GET = 0x40187013
|
||||
RTC_PARAM_SET = 0x40187014
|
||||
RTC_PIE_OFF = 0x7006
|
||||
RTC_PIE_ON = 0x7005
|
||||
RTC_PLL_GET = 0x80207011
|
||||
RTC_PLL_SET = 0x40207012
|
||||
RTC_RD_TIME = 0x80247009
|
||||
RTC_SET_TIME = 0x4024700a
|
||||
RTC_UIE_OFF = 0x7004
|
||||
RTC_UIE_ON = 0x7003
|
||||
RTC_VL_CLR = 0x7014
|
||||
RTC_VL_READ = 0x80047013
|
||||
RTC_WIE_OFF = 0x7010
|
||||
RTC_WIE_ON = 0x700f
|
||||
RTC_WKALM_RD = 0x80287010
|
||||
RTC_WKALM_SET = 0x4028700f
|
||||
SCM_TIMESTAMPING = 0x25
|
||||
SCM_TIMESTAMPING_OPT_STATS = 0x36
|
||||
SCM_TIMESTAMPING_PKTINFO = 0x3a
|
||||
SCM_TIMESTAMPNS = 0x23
|
||||
SCM_TXTIME = 0x3d
|
||||
SCM_WIFI_STATUS = 0x29
|
||||
SFD_CLOEXEC = 0x80000
|
||||
SFD_NONBLOCK = 0x800
|
||||
SIOCATMARK = 0x8905
|
||||
SIOCGPGRP = 0x8904
|
||||
SIOCGSTAMPNS_NEW = 0x80108907
|
||||
SIOCGSTAMP_NEW = 0x80108906
|
||||
SIOCINQ = 0x541b
|
||||
SIOCOUTQ = 0x5411
|
||||
SIOCSPGRP = 0x8902
|
||||
SOCK_CLOEXEC = 0x80000
|
||||
SOCK_DGRAM = 0x2
|
||||
SOCK_NONBLOCK = 0x800
|
||||
SOCK_STREAM = 0x1
|
||||
SOL_SOCKET = 0x1
|
||||
SO_ACCEPTCONN = 0x1e
|
||||
SO_ATTACH_BPF = 0x32
|
||||
SO_ATTACH_REUSEPORT_CBPF = 0x33
|
||||
SO_ATTACH_REUSEPORT_EBPF = 0x34
|
||||
SO_BINDTODEVICE = 0x19
|
||||
SO_BINDTOIFINDEX = 0x3e
|
||||
SO_BPF_EXTENSIONS = 0x30
|
||||
SO_BROADCAST = 0x6
|
||||
SO_BSDCOMPAT = 0xe
|
||||
SO_BUF_LOCK = 0x48
|
||||
SO_BUSY_POLL = 0x2e
|
||||
SO_BUSY_POLL_BUDGET = 0x46
|
||||
SO_CNX_ADVICE = 0x35
|
||||
SO_COOKIE = 0x39
|
||||
SO_DETACH_REUSEPORT_BPF = 0x44
|
||||
SO_DOMAIN = 0x27
|
||||
SO_DONTROUTE = 0x5
|
||||
SO_ERROR = 0x4
|
||||
SO_INCOMING_CPU = 0x31
|
||||
SO_INCOMING_NAPI_ID = 0x38
|
||||
SO_KEEPALIVE = 0x9
|
||||
SO_LINGER = 0xd
|
||||
SO_LOCK_FILTER = 0x2c
|
||||
SO_MARK = 0x24
|
||||
SO_MAX_PACING_RATE = 0x2f
|
||||
SO_MEMINFO = 0x37
|
||||
SO_NETNS_COOKIE = 0x47
|
||||
SO_NOFCS = 0x2b
|
||||
SO_OOBINLINE = 0xa
|
||||
SO_PASSCRED = 0x10
|
||||
SO_PASSSEC = 0x22
|
||||
SO_PEEK_OFF = 0x2a
|
||||
SO_PEERCRED = 0x11
|
||||
SO_PEERGROUPS = 0x3b
|
||||
SO_PEERSEC = 0x1f
|
||||
SO_PREFER_BUSY_POLL = 0x45
|
||||
SO_PROTOCOL = 0x26
|
||||
SO_RCVBUF = 0x8
|
||||
SO_RCVBUFFORCE = 0x21
|
||||
SO_RCVLOWAT = 0x12
|
||||
SO_RCVTIMEO = 0x14
|
||||
SO_RCVTIMEO_NEW = 0x42
|
||||
SO_RCVTIMEO_OLD = 0x14
|
||||
SO_RESERVE_MEM = 0x49
|
||||
SO_REUSEADDR = 0x2
|
||||
SO_REUSEPORT = 0xf
|
||||
SO_RXQ_OVFL = 0x28
|
||||
SO_SECURITY_AUTHENTICATION = 0x16
|
||||
SO_SECURITY_ENCRYPTION_NETWORK = 0x18
|
||||
SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17
|
||||
SO_SELECT_ERR_QUEUE = 0x2d
|
||||
SO_SNDBUF = 0x7
|
||||
SO_SNDBUFFORCE = 0x20
|
||||
SO_SNDLOWAT = 0x13
|
||||
SO_SNDTIMEO = 0x15
|
||||
SO_SNDTIMEO_NEW = 0x43
|
||||
SO_SNDTIMEO_OLD = 0x15
|
||||
SO_TIMESTAMPING = 0x25
|
||||
SO_TIMESTAMPING_NEW = 0x41
|
||||
SO_TIMESTAMPING_OLD = 0x25
|
||||
SO_TIMESTAMPNS = 0x23
|
||||
SO_TIMESTAMPNS_NEW = 0x40
|
||||
SO_TIMESTAMPNS_OLD = 0x23
|
||||
SO_TIMESTAMP_NEW = 0x3f
|
||||
SO_TXTIME = 0x3d
|
||||
SO_TYPE = 0x3
|
||||
SO_WIFI_STATUS = 0x29
|
||||
SO_ZEROCOPY = 0x3c
|
||||
TAB1 = 0x800
|
||||
TAB2 = 0x1000
|
||||
TAB3 = 0x1800
|
||||
TABDLY = 0x1800
|
||||
TCFLSH = 0x540b
|
||||
TCGETA = 0x5405
|
||||
TCGETS = 0x5401
|
||||
TCGETS2 = 0x802c542a
|
||||
TCGETX = 0x5432
|
||||
TCSAFLUSH = 0x2
|
||||
TCSBRK = 0x5409
|
||||
TCSBRKP = 0x5425
|
||||
TCSETA = 0x5406
|
||||
TCSETAF = 0x5408
|
||||
TCSETAW = 0x5407
|
||||
TCSETS = 0x5402
|
||||
TCSETS2 = 0x402c542b
|
||||
TCSETSF = 0x5404
|
||||
TCSETSF2 = 0x402c542d
|
||||
TCSETSW = 0x5403
|
||||
TCSETSW2 = 0x402c542c
|
||||
TCSETX = 0x5433
|
||||
TCSETXF = 0x5434
|
||||
TCSETXW = 0x5435
|
||||
TCXONC = 0x540a
|
||||
TFD_CLOEXEC = 0x80000
|
||||
TFD_NONBLOCK = 0x800
|
||||
TIOCCBRK = 0x5428
|
||||
TIOCCONS = 0x541d
|
||||
TIOCEXCL = 0x540c
|
||||
TIOCGDEV = 0x80045432
|
||||
TIOCGETD = 0x5424
|
||||
TIOCGEXCL = 0x80045440
|
||||
TIOCGICOUNT = 0x545d
|
||||
TIOCGISO7816 = 0x80285442
|
||||
TIOCGLCKTRMIOS = 0x5456
|
||||
TIOCGPGRP = 0x540f
|
||||
TIOCGPKT = 0x80045438
|
||||
TIOCGPTLCK = 0x80045439
|
||||
TIOCGPTN = 0x80045430
|
||||
TIOCGPTPEER = 0x5441
|
||||
TIOCGRS485 = 0x542e
|
||||
TIOCGSERIAL = 0x541e
|
||||
TIOCGSID = 0x5429
|
||||
TIOCGSOFTCAR = 0x5419
|
||||
TIOCGWINSZ = 0x5413
|
||||
TIOCINQ = 0x541b
|
||||
TIOCLINUX = 0x541c
|
||||
TIOCMBIC = 0x5417
|
||||
TIOCMBIS = 0x5416
|
||||
TIOCMGET = 0x5415
|
||||
TIOCMIWAIT = 0x545c
|
||||
TIOCMSET = 0x5418
|
||||
TIOCM_CAR = 0x40
|
||||
TIOCM_CD = 0x40
|
||||
TIOCM_CTS = 0x20
|
||||
TIOCM_DSR = 0x100
|
||||
TIOCM_RI = 0x80
|
||||
TIOCM_RNG = 0x80
|
||||
TIOCM_SR = 0x10
|
||||
TIOCM_ST = 0x8
|
||||
TIOCNOTTY = 0x5422
|
||||
TIOCNXCL = 0x540d
|
||||
TIOCOUTQ = 0x5411
|
||||
TIOCPKT = 0x5420
|
||||
TIOCSBRK = 0x5427
|
||||
TIOCSCTTY = 0x540e
|
||||
TIOCSERCONFIG = 0x5453
|
||||
TIOCSERGETLSR = 0x5459
|
||||
TIOCSERGETMULTI = 0x545a
|
||||
TIOCSERGSTRUCT = 0x5458
|
||||
TIOCSERGWILD = 0x5454
|
||||
TIOCSERSETMULTI = 0x545b
|
||||
TIOCSERSWILD = 0x5455
|
||||
TIOCSER_TEMT = 0x1
|
||||
TIOCSETD = 0x5423
|
||||
TIOCSIG = 0x40045436
|
||||
TIOCSISO7816 = 0xc0285443
|
||||
TIOCSLCKTRMIOS = 0x5457
|
||||
TIOCSPGRP = 0x5410
|
||||
TIOCSPTLCK = 0x40045431
|
||||
TIOCSRS485 = 0x542f
|
||||
TIOCSSERIAL = 0x541f
|
||||
TIOCSSOFTCAR = 0x541a
|
||||
TIOCSTI = 0x5412
|
||||
TIOCSWINSZ = 0x5414
|
||||
TIOCVHANGUP = 0x5437
|
||||
TOSTOP = 0x100
|
||||
TUNATTACHFILTER = 0x401054d5
|
||||
TUNDETACHFILTER = 0x401054d6
|
||||
TUNGETDEVNETNS = 0x54e3
|
||||
TUNGETFEATURES = 0x800454cf
|
||||
TUNGETFILTER = 0x801054db
|
||||
TUNGETIFF = 0x800454d2
|
||||
TUNGETSNDBUF = 0x800454d3
|
||||
TUNGETVNETBE = 0x800454df
|
||||
TUNGETVNETHDRSZ = 0x800454d7
|
||||
TUNGETVNETLE = 0x800454dd
|
||||
TUNSETCARRIER = 0x400454e2
|
||||
TUNSETDEBUG = 0x400454c9
|
||||
TUNSETFILTEREBPF = 0x800454e1
|
||||
TUNSETGROUP = 0x400454ce
|
||||
TUNSETIFF = 0x400454ca
|
||||
TUNSETIFINDEX = 0x400454da
|
||||
TUNSETLINK = 0x400454cd
|
||||
TUNSETNOCSUM = 0x400454c8
|
||||
TUNSETOFFLOAD = 0x400454d0
|
||||
TUNSETOWNER = 0x400454cc
|
||||
TUNSETPERSIST = 0x400454cb
|
||||
TUNSETQUEUE = 0x400454d9
|
||||
TUNSETSNDBUF = 0x400454d4
|
||||
TUNSETSTEERINGEBPF = 0x800454e0
|
||||
TUNSETTXFILTER = 0x400454d1
|
||||
TUNSETVNETBE = 0x400454de
|
||||
TUNSETVNETHDRSZ = 0x400454d8
|
||||
TUNSETVNETLE = 0x400454dc
|
||||
UBI_IOCATT = 0x40186f40
|
||||
UBI_IOCDET = 0x40046f41
|
||||
UBI_IOCEBCH = 0x40044f02
|
||||
UBI_IOCEBER = 0x40044f01
|
||||
UBI_IOCEBISMAP = 0x80044f05
|
||||
UBI_IOCEBMAP = 0x40084f03
|
||||
UBI_IOCEBUNMAP = 0x40044f04
|
||||
UBI_IOCMKVOL = 0x40986f00
|
||||
UBI_IOCRMVOL = 0x40046f01
|
||||
UBI_IOCRNVOL = 0x51106f03
|
||||
UBI_IOCRPEB = 0x40046f04
|
||||
UBI_IOCRSVOL = 0x400c6f02
|
||||
UBI_IOCSETVOLPROP = 0x40104f06
|
||||
UBI_IOCSPEB = 0x40046f05
|
||||
UBI_IOCVOLCRBLK = 0x40804f07
|
||||
UBI_IOCVOLRMBLK = 0x4f08
|
||||
UBI_IOCVOLUP = 0x40084f00
|
||||
VDISCARD = 0xd
|
||||
VEOF = 0x4
|
||||
VEOL = 0xb
|
||||
VEOL2 = 0x10
|
||||
VMIN = 0x6
|
||||
VREPRINT = 0xc
|
||||
VSTART = 0x8
|
||||
VSTOP = 0x9
|
||||
VSUSP = 0xa
|
||||
VSWTC = 0x7
|
||||
VT1 = 0x4000
|
||||
VTDLY = 0x4000
|
||||
VTIME = 0x5
|
||||
VWERASE = 0xe
|
||||
WDIOC_GETBOOTSTATUS = 0x80045702
|
||||
WDIOC_GETPRETIMEOUT = 0x80045709
|
||||
WDIOC_GETSTATUS = 0x80045701
|
||||
WDIOC_GETSUPPORT = 0x80285700
|
||||
WDIOC_GETTEMP = 0x80045703
|
||||
WDIOC_GETTIMELEFT = 0x8004570a
|
||||
WDIOC_GETTIMEOUT = 0x80045707
|
||||
WDIOC_KEEPALIVE = 0x80045705
|
||||
WDIOC_SETOPTIONS = 0x80045704
|
||||
WORDSIZE = 0x40
|
||||
XCASE = 0x4
|
||||
XTABS = 0x1800
|
||||
_HIDIOCGRAWNAME = 0x80804804
|
||||
_HIDIOCGRAWPHYS = 0x80404805
|
||||
_HIDIOCGRAWUNIQ = 0x80404808
|
||||
)
|
||||
|
||||
// Errors
|
||||
const (
|
||||
EADDRINUSE = syscall.Errno(0x62)
|
||||
EADDRNOTAVAIL = syscall.Errno(0x63)
|
||||
EADV = syscall.Errno(0x44)
|
||||
EAFNOSUPPORT = syscall.Errno(0x61)
|
||||
EALREADY = syscall.Errno(0x72)
|
||||
EBADE = syscall.Errno(0x34)
|
||||
EBADFD = syscall.Errno(0x4d)
|
||||
EBADMSG = syscall.Errno(0x4a)
|
||||
EBADR = syscall.Errno(0x35)
|
||||
EBADRQC = syscall.Errno(0x38)
|
||||
EBADSLT = syscall.Errno(0x39)
|
||||
EBFONT = syscall.Errno(0x3b)
|
||||
ECANCELED = syscall.Errno(0x7d)
|
||||
ECHRNG = syscall.Errno(0x2c)
|
||||
ECOMM = syscall.Errno(0x46)
|
||||
ECONNABORTED = syscall.Errno(0x67)
|
||||
ECONNREFUSED = syscall.Errno(0x6f)
|
||||
ECONNRESET = syscall.Errno(0x68)
|
||||
EDEADLK = syscall.Errno(0x23)
|
||||
EDEADLOCK = syscall.Errno(0x23)
|
||||
EDESTADDRREQ = syscall.Errno(0x59)
|
||||
EDOTDOT = syscall.Errno(0x49)
|
||||
EDQUOT = syscall.Errno(0x7a)
|
||||
EHOSTDOWN = syscall.Errno(0x70)
|
||||
EHOSTUNREACH = syscall.Errno(0x71)
|
||||
EHWPOISON = syscall.Errno(0x85)
|
||||
EIDRM = syscall.Errno(0x2b)
|
||||
EILSEQ = syscall.Errno(0x54)
|
||||
EINPROGRESS = syscall.Errno(0x73)
|
||||
EISCONN = syscall.Errno(0x6a)
|
||||
EISNAM = syscall.Errno(0x78)
|
||||
EKEYEXPIRED = syscall.Errno(0x7f)
|
||||
EKEYREJECTED = syscall.Errno(0x81)
|
||||
EKEYREVOKED = syscall.Errno(0x80)
|
||||
EL2HLT = syscall.Errno(0x33)
|
||||
EL2NSYNC = syscall.Errno(0x2d)
|
||||
EL3HLT = syscall.Errno(0x2e)
|
||||
EL3RST = syscall.Errno(0x2f)
|
||||
ELIBACC = syscall.Errno(0x4f)
|
||||
ELIBBAD = syscall.Errno(0x50)
|
||||
ELIBEXEC = syscall.Errno(0x53)
|
||||
ELIBMAX = syscall.Errno(0x52)
|
||||
ELIBSCN = syscall.Errno(0x51)
|
||||
ELNRNG = syscall.Errno(0x30)
|
||||
ELOOP = syscall.Errno(0x28)
|
||||
EMEDIUMTYPE = syscall.Errno(0x7c)
|
||||
EMSGSIZE = syscall.Errno(0x5a)
|
||||
EMULTIHOP = syscall.Errno(0x48)
|
||||
ENAMETOOLONG = syscall.Errno(0x24)
|
||||
ENAVAIL = syscall.Errno(0x77)
|
||||
ENETDOWN = syscall.Errno(0x64)
|
||||
ENETRESET = syscall.Errno(0x66)
|
||||
ENETUNREACH = syscall.Errno(0x65)
|
||||
ENOANO = syscall.Errno(0x37)
|
||||
ENOBUFS = syscall.Errno(0x69)
|
||||
ENOCSI = syscall.Errno(0x32)
|
||||
ENODATA = syscall.Errno(0x3d)
|
||||
ENOKEY = syscall.Errno(0x7e)
|
||||
ENOLCK = syscall.Errno(0x25)
|
||||
ENOLINK = syscall.Errno(0x43)
|
||||
ENOMEDIUM = syscall.Errno(0x7b)
|
||||
ENOMSG = syscall.Errno(0x2a)
|
||||
ENONET = syscall.Errno(0x40)
|
||||
ENOPKG = syscall.Errno(0x41)
|
||||
ENOPROTOOPT = syscall.Errno(0x5c)
|
||||
ENOSR = syscall.Errno(0x3f)
|
||||
ENOSTR = syscall.Errno(0x3c)
|
||||
ENOSYS = syscall.Errno(0x26)
|
||||
ENOTCONN = syscall.Errno(0x6b)
|
||||
ENOTEMPTY = syscall.Errno(0x27)
|
||||
ENOTNAM = syscall.Errno(0x76)
|
||||
ENOTRECOVERABLE = syscall.Errno(0x83)
|
||||
ENOTSOCK = syscall.Errno(0x58)
|
||||
ENOTSUP = syscall.Errno(0x5f)
|
||||
ENOTUNIQ = syscall.Errno(0x4c)
|
||||
EOPNOTSUPP = syscall.Errno(0x5f)
|
||||
EOVERFLOW = syscall.Errno(0x4b)
|
||||
EOWNERDEAD = syscall.Errno(0x82)
|
||||
EPFNOSUPPORT = syscall.Errno(0x60)
|
||||
EPROTO = syscall.Errno(0x47)
|
||||
EPROTONOSUPPORT = syscall.Errno(0x5d)
|
||||
EPROTOTYPE = syscall.Errno(0x5b)
|
||||
EREMCHG = syscall.Errno(0x4e)
|
||||
EREMOTE = syscall.Errno(0x42)
|
||||
EREMOTEIO = syscall.Errno(0x79)
|
||||
ERESTART = syscall.Errno(0x55)
|
||||
ERFKILL = syscall.Errno(0x84)
|
||||
ESHUTDOWN = syscall.Errno(0x6c)
|
||||
ESOCKTNOSUPPORT = syscall.Errno(0x5e)
|
||||
ESRMNT = syscall.Errno(0x45)
|
||||
ESTALE = syscall.Errno(0x74)
|
||||
ESTRPIPE = syscall.Errno(0x56)
|
||||
ETIME = syscall.Errno(0x3e)
|
||||
ETIMEDOUT = syscall.Errno(0x6e)
|
||||
ETOOMANYREFS = syscall.Errno(0x6d)
|
||||
EUCLEAN = syscall.Errno(0x75)
|
||||
EUNATCH = syscall.Errno(0x31)
|
||||
EUSERS = syscall.Errno(0x57)
|
||||
EXFULL = syscall.Errno(0x36)
|
||||
)
|
||||
|
||||
// Signals
|
||||
const (
|
||||
SIGBUS = syscall.Signal(0x7)
|
||||
SIGCHLD = syscall.Signal(0x11)
|
||||
SIGCLD = syscall.Signal(0x11)
|
||||
SIGCONT = syscall.Signal(0x12)
|
||||
SIGIO = syscall.Signal(0x1d)
|
||||
SIGPOLL = syscall.Signal(0x1d)
|
||||
SIGPROF = syscall.Signal(0x1b)
|
||||
SIGPWR = syscall.Signal(0x1e)
|
||||
SIGSTKFLT = syscall.Signal(0x10)
|
||||
SIGSTOP = syscall.Signal(0x13)
|
||||
SIGSYS = syscall.Signal(0x1f)
|
||||
SIGTSTP = syscall.Signal(0x14)
|
||||
SIGTTIN = syscall.Signal(0x15)
|
||||
SIGTTOU = syscall.Signal(0x16)
|
||||
SIGURG = syscall.Signal(0x17)
|
||||
SIGUSR1 = syscall.Signal(0xa)
|
||||
SIGUSR2 = syscall.Signal(0xc)
|
||||
SIGVTALRM = syscall.Signal(0x1a)
|
||||
SIGWINCH = syscall.Signal(0x1c)
|
||||
SIGXCPU = syscall.Signal(0x18)
|
||||
SIGXFSZ = syscall.Signal(0x19)
|
||||
)
|
||||
|
||||
// Error table
|
||||
var errorList = [...]struct {
|
||||
num syscall.Errno
|
||||
name string
|
||||
desc string
|
||||
}{
|
||||
{1, "EPERM", "operation not permitted"},
|
||||
{2, "ENOENT", "no such file or directory"},
|
||||
{3, "ESRCH", "no such process"},
|
||||
{4, "EINTR", "interrupted system call"},
|
||||
{5, "EIO", "input/output error"},
|
||||
{6, "ENXIO", "no such device or address"},
|
||||
{7, "E2BIG", "argument list too long"},
|
||||
{8, "ENOEXEC", "exec format error"},
|
||||
{9, "EBADF", "bad file descriptor"},
|
||||
{10, "ECHILD", "no child processes"},
|
||||
{11, "EAGAIN", "resource temporarily unavailable"},
|
||||
{12, "ENOMEM", "cannot allocate memory"},
|
||||
{13, "EACCES", "permission denied"},
|
||||
{14, "EFAULT", "bad address"},
|
||||
{15, "ENOTBLK", "block device required"},
|
||||
{16, "EBUSY", "device or resource busy"},
|
||||
{17, "EEXIST", "file exists"},
|
||||
{18, "EXDEV", "invalid cross-device link"},
|
||||
{19, "ENODEV", "no such device"},
|
||||
{20, "ENOTDIR", "not a directory"},
|
||||
{21, "EISDIR", "is a directory"},
|
||||
{22, "EINVAL", "invalid argument"},
|
||||
{23, "ENFILE", "too many open files in system"},
|
||||
{24, "EMFILE", "too many open files"},
|
||||
{25, "ENOTTY", "inappropriate ioctl for device"},
|
||||
{26, "ETXTBSY", "text file busy"},
|
||||
{27, "EFBIG", "file too large"},
|
||||
{28, "ENOSPC", "no space left on device"},
|
||||
{29, "ESPIPE", "illegal seek"},
|
||||
{30, "EROFS", "read-only file system"},
|
||||
{31, "EMLINK", "too many links"},
|
||||
{32, "EPIPE", "broken pipe"},
|
||||
{33, "EDOM", "numerical argument out of domain"},
|
||||
{34, "ERANGE", "numerical result out of range"},
|
||||
{35, "EDEADLK", "resource deadlock avoided"},
|
||||
{36, "ENAMETOOLONG", "file name too long"},
|
||||
{37, "ENOLCK", "no locks available"},
|
||||
{38, "ENOSYS", "function not implemented"},
|
||||
{39, "ENOTEMPTY", "directory not empty"},
|
||||
{40, "ELOOP", "too many levels of symbolic links"},
|
||||
{42, "ENOMSG", "no message of desired type"},
|
||||
{43, "EIDRM", "identifier removed"},
|
||||
{44, "ECHRNG", "channel number out of range"},
|
||||
{45, "EL2NSYNC", "level 2 not synchronized"},
|
||||
{46, "EL3HLT", "level 3 halted"},
|
||||
{47, "EL3RST", "level 3 reset"},
|
||||
{48, "ELNRNG", "link number out of range"},
|
||||
{49, "EUNATCH", "protocol driver not attached"},
|
||||
{50, "ENOCSI", "no CSI structure available"},
|
||||
{51, "EL2HLT", "level 2 halted"},
|
||||
{52, "EBADE", "invalid exchange"},
|
||||
{53, "EBADR", "invalid request descriptor"},
|
||||
{54, "EXFULL", "exchange full"},
|
||||
{55, "ENOANO", "no anode"},
|
||||
{56, "EBADRQC", "invalid request code"},
|
||||
{57, "EBADSLT", "invalid slot"},
|
||||
{59, "EBFONT", "bad font file format"},
|
||||
{60, "ENOSTR", "device not a stream"},
|
||||
{61, "ENODATA", "no data available"},
|
||||
{62, "ETIME", "timer expired"},
|
||||
{63, "ENOSR", "out of streams resources"},
|
||||
{64, "ENONET", "machine is not on the network"},
|
||||
{65, "ENOPKG", "package not installed"},
|
||||
{66, "EREMOTE", "object is remote"},
|
||||
{67, "ENOLINK", "link has been severed"},
|
||||
{68, "EADV", "advertise error"},
|
||||
{69, "ESRMNT", "srmount error"},
|
||||
{70, "ECOMM", "communication error on send"},
|
||||
{71, "EPROTO", "protocol error"},
|
||||
{72, "EMULTIHOP", "multihop attempted"},
|
||||
{73, "EDOTDOT", "RFS specific error"},
|
||||
{74, "EBADMSG", "bad message"},
|
||||
{75, "EOVERFLOW", "value too large for defined data type"},
|
||||
{76, "ENOTUNIQ", "name not unique on network"},
|
||||
{77, "EBADFD", "file descriptor in bad state"},
|
||||
{78, "EREMCHG", "remote address changed"},
|
||||
{79, "ELIBACC", "can not access a needed shared library"},
|
||||
{80, "ELIBBAD", "accessing a corrupted shared library"},
|
||||
{81, "ELIBSCN", ".lib section in a.out corrupted"},
|
||||
{82, "ELIBMAX", "attempting to link in too many shared libraries"},
|
||||
{83, "ELIBEXEC", "cannot exec a shared library directly"},
|
||||
{84, "EILSEQ", "invalid or incomplete multibyte or wide character"},
|
||||
{85, "ERESTART", "interrupted system call should be restarted"},
|
||||
{86, "ESTRPIPE", "streams pipe error"},
|
||||
{87, "EUSERS", "too many users"},
|
||||
{88, "ENOTSOCK", "socket operation on non-socket"},
|
||||
{89, "EDESTADDRREQ", "destination address required"},
|
||||
{90, "EMSGSIZE", "message too long"},
|
||||
{91, "EPROTOTYPE", "protocol wrong type for socket"},
|
||||
{92, "ENOPROTOOPT", "protocol not available"},
|
||||
{93, "EPROTONOSUPPORT", "protocol not supported"},
|
||||
{94, "ESOCKTNOSUPPORT", "socket type not supported"},
|
||||
{95, "ENOTSUP", "operation not supported"},
|
||||
{96, "EPFNOSUPPORT", "protocol family not supported"},
|
||||
{97, "EAFNOSUPPORT", "address family not supported by protocol"},
|
||||
{98, "EADDRINUSE", "address already in use"},
|
||||
{99, "EADDRNOTAVAIL", "cannot assign requested address"},
|
||||
{100, "ENETDOWN", "network is down"},
|
||||
{101, "ENETUNREACH", "network is unreachable"},
|
||||
{102, "ENETRESET", "network dropped connection on reset"},
|
||||
{103, "ECONNABORTED", "software caused connection abort"},
|
||||
{104, "ECONNRESET", "connection reset by peer"},
|
||||
{105, "ENOBUFS", "no buffer space available"},
|
||||
{106, "EISCONN", "transport endpoint is already connected"},
|
||||
{107, "ENOTCONN", "transport endpoint is not connected"},
|
||||
{108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
|
||||
{109, "ETOOMANYREFS", "too many references: cannot splice"},
|
||||
{110, "ETIMEDOUT", "connection timed out"},
|
||||
{111, "ECONNREFUSED", "connection refused"},
|
||||
{112, "EHOSTDOWN", "host is down"},
|
||||
{113, "EHOSTUNREACH", "no route to host"},
|
||||
{114, "EALREADY", "operation already in progress"},
|
||||
{115, "EINPROGRESS", "operation now in progress"},
|
||||
{116, "ESTALE", "stale file handle"},
|
||||
{117, "EUCLEAN", "structure needs cleaning"},
|
||||
{118, "ENOTNAM", "not a XENIX named type file"},
|
||||
{119, "ENAVAIL", "no XENIX semaphores available"},
|
||||
{120, "EISNAM", "is a named type file"},
|
||||
{121, "EREMOTEIO", "remote I/O error"},
|
||||
{122, "EDQUOT", "disk quota exceeded"},
|
||||
{123, "ENOMEDIUM", "no medium found"},
|
||||
{124, "EMEDIUMTYPE", "wrong medium type"},
|
||||
{125, "ECANCELED", "operation canceled"},
|
||||
{126, "ENOKEY", "required key not available"},
|
||||
{127, "EKEYEXPIRED", "key has expired"},
|
||||
{128, "EKEYREVOKED", "key has been revoked"},
|
||||
{129, "EKEYREJECTED", "key was rejected by service"},
|
||||
{130, "EOWNERDEAD", "owner died"},
|
||||
{131, "ENOTRECOVERABLE", "state not recoverable"},
|
||||
{132, "ERFKILL", "operation not possible due to RF-kill"},
|
||||
{133, "EHWPOISON", "memory page has hardware error"},
|
||||
}
|
||||
|
||||
// Signal table
|
||||
var signalList = [...]struct {
|
||||
num syscall.Signal
|
||||
name string
|
||||
desc string
|
||||
}{
|
||||
{1, "SIGHUP", "hangup"},
|
||||
{2, "SIGINT", "interrupt"},
|
||||
{3, "SIGQUIT", "quit"},
|
||||
{4, "SIGILL", "illegal instruction"},
|
||||
{5, "SIGTRAP", "trace/breakpoint trap"},
|
||||
{6, "SIGABRT", "aborted"},
|
||||
{7, "SIGBUS", "bus error"},
|
||||
{8, "SIGFPE", "floating point exception"},
|
||||
{9, "SIGKILL", "killed"},
|
||||
{10, "SIGUSR1", "user defined signal 1"},
|
||||
{11, "SIGSEGV", "segmentation fault"},
|
||||
{12, "SIGUSR2", "user defined signal 2"},
|
||||
{13, "SIGPIPE", "broken pipe"},
|
||||
{14, "SIGALRM", "alarm clock"},
|
||||
{15, "SIGTERM", "terminated"},
|
||||
{16, "SIGSTKFLT", "stack fault"},
|
||||
{17, "SIGCHLD", "child exited"},
|
||||
{18, "SIGCONT", "continued"},
|
||||
{19, "SIGSTOP", "stopped (signal)"},
|
||||
{20, "SIGTSTP", "stopped"},
|
||||
{21, "SIGTTIN", "stopped (tty input)"},
|
||||
{22, "SIGTTOU", "stopped (tty output)"},
|
||||
{23, "SIGURG", "urgent I/O condition"},
|
||||
{24, "SIGXCPU", "CPU time limit exceeded"},
|
||||
{25, "SIGXFSZ", "file size limit exceeded"},
|
||||
{26, "SIGVTALRM", "virtual timer expired"},
|
||||
{27, "SIGPROF", "profiling timer expired"},
|
||||
{28, "SIGWINCH", "window changed"},
|
||||
{29, "SIGIO", "I/O possible"},
|
||||
{30, "SIGPWR", "power failure"},
|
||||
{31, "SIGSYS", "bad system call"},
|
||||
}
|
||||
+552
@@ -0,0 +1,552 @@
|
||||
// go run mksyscall.go -tags linux,loong64 syscall_linux.go syscall_linux_loong64.go
|
||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||
|
||||
//go:build linux && loong64
|
||||
// +build linux,loong64
|
||||
|
||||
package unix
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var _ syscall.Errno
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) {
|
||||
_, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Fallocate(fd int, mode uint32, off int64, len int64) (err error) {
|
||||
_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {
|
||||
r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)
|
||||
n = int64(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
|
||||
var _p0 unsafe.Pointer
|
||||
if len(events) > 0 {
|
||||
_p0 = unsafe.Pointer(&events[0])
|
||||
} else {
|
||||
_p0 = unsafe.Pointer(&_zero)
|
||||
}
|
||||
r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)
|
||||
n = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
|
||||
_, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Fchown(fd int, uid int, gid int) (err error) {
|
||||
_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Fstat(fd int, stat *Stat_t) (err error) {
|
||||
_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) {
|
||||
var _p0 *byte
|
||||
_p0, err = BytePtrFromString(path)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Fstatfs(fd int, buf *Statfs_t) (err error) {
|
||||
_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Ftruncate(fd int, length int64) (err error) {
|
||||
_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Getegid() (egid int) {
|
||||
r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0)
|
||||
egid = int(r0)
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Geteuid() (euid int) {
|
||||
r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0)
|
||||
euid = int(r0)
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Getgid() (gid int) {
|
||||
r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0)
|
||||
gid = int(r0)
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Getuid() (uid int) {
|
||||
r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0)
|
||||
uid = int(r0)
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Listen(s int, n int) (err error) {
|
||||
_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func pread(fd int, p []byte, offset int64) (n int, err error) {
|
||||
var _p0 unsafe.Pointer
|
||||
if len(p) > 0 {
|
||||
_p0 = unsafe.Pointer(&p[0])
|
||||
} else {
|
||||
_p0 = unsafe.Pointer(&_zero)
|
||||
}
|
||||
r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)
|
||||
n = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func pwrite(fd int, p []byte, offset int64) (n int, err error) {
|
||||
var _p0 unsafe.Pointer
|
||||
if len(p) > 0 {
|
||||
_p0 = unsafe.Pointer(&p[0])
|
||||
} else {
|
||||
_p0 = unsafe.Pointer(&_zero)
|
||||
}
|
||||
r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)
|
||||
n = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Seek(fd int, offset int64, whence int) (off int64, err error) {
|
||||
r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))
|
||||
off = int64(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
||||
r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)
|
||||
written = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func setfsgid(gid int) (prev int, err error) {
|
||||
r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)
|
||||
prev = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func setfsuid(uid int) (prev int, err error) {
|
||||
r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)
|
||||
prev = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Setregid(rgid int, egid int) (err error) {
|
||||
_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Setresgid(rgid int, egid int, sgid int) (err error) {
|
||||
_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Setresuid(ruid int, euid int, suid int) (err error) {
|
||||
_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Setreuid(ruid int, euid int) (err error) {
|
||||
_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Shutdown(fd int, how int) (err error) {
|
||||
_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {
|
||||
r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))
|
||||
n = int64(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Statfs(path string, buf *Statfs_t) (err error) {
|
||||
var _p0 *byte
|
||||
_p0, err = BytePtrFromString(path)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func SyncFileRange(fd int, off int64, n int64, flags int) (err error) {
|
||||
_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Truncate(path string, length int64) (err error) {
|
||||
var _p0 *byte
|
||||
_p0, err = BytePtrFromString(path)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {
|
||||
r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)
|
||||
fd = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
|
||||
_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
|
||||
_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func getgroups(n int, list *_Gid_t) (nn int, err error) {
|
||||
r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)
|
||||
nn = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func setgroups(n int, list *_Gid_t) (err error) {
|
||||
_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {
|
||||
_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {
|
||||
_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func socket(domain int, typ int, proto int) (fd int, err error) {
|
||||
r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))
|
||||
fd = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {
|
||||
_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
|
||||
_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
|
||||
_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {
|
||||
var _p0 unsafe.Pointer
|
||||
if len(p) > 0 {
|
||||
_p0 = unsafe.Pointer(&p[0])
|
||||
} else {
|
||||
_p0 = unsafe.Pointer(&_zero)
|
||||
}
|
||||
r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))
|
||||
n = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {
|
||||
var _p0 unsafe.Pointer
|
||||
if len(buf) > 0 {
|
||||
_p0 = unsafe.Pointer(&buf[0])
|
||||
} else {
|
||||
_p0 = unsafe.Pointer(&_zero)
|
||||
}
|
||||
_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
|
||||
r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
|
||||
n = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
|
||||
r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
|
||||
n = int(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
|
||||
r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset))
|
||||
xaddr = uintptr(r0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func Gettimeofday(tv *Timeval) (err error) {
|
||||
_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||
|
||||
func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) {
|
||||
var _p0 *byte
|
||||
_p0, err = BytePtrFromString(cmdline)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, _, e1 := Syscall6(SYS_KEXEC_FILE_LOAD, uintptr(kernelFd), uintptr(initrdFd), uintptr(cmdlineLen), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
+313
@@ -0,0 +1,313 @@
|
||||
// go run linux/mksysnum.go -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h
|
||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||
|
||||
//go:build loong64 && linux
|
||||
// +build loong64,linux
|
||||
|
||||
package unix
|
||||
|
||||
const (
|
||||
SYS_IO_SETUP = 0
|
||||
SYS_IO_DESTROY = 1
|
||||
SYS_IO_SUBMIT = 2
|
||||
SYS_IO_CANCEL = 3
|
||||
SYS_IO_GETEVENTS = 4
|
||||
SYS_SETXATTR = 5
|
||||
SYS_LSETXATTR = 6
|
||||
SYS_FSETXATTR = 7
|
||||
SYS_GETXATTR = 8
|
||||
SYS_LGETXATTR = 9
|
||||
SYS_FGETXATTR = 10
|
||||
SYS_LISTXATTR = 11
|
||||
SYS_LLISTXATTR = 12
|
||||
SYS_FLISTXATTR = 13
|
||||
SYS_REMOVEXATTR = 14
|
||||
SYS_LREMOVEXATTR = 15
|
||||
SYS_FREMOVEXATTR = 16
|
||||
SYS_GETCWD = 17
|
||||
SYS_LOOKUP_DCOOKIE = 18
|
||||
SYS_EVENTFD2 = 19
|
||||
SYS_EPOLL_CREATE1 = 20
|
||||
SYS_EPOLL_CTL = 21
|
||||
SYS_EPOLL_PWAIT = 22
|
||||
SYS_DUP = 23
|
||||
SYS_DUP3 = 24
|
||||
SYS_FCNTL = 25
|
||||
SYS_INOTIFY_INIT1 = 26
|
||||
SYS_INOTIFY_ADD_WATCH = 27
|
||||
SYS_INOTIFY_RM_WATCH = 28
|
||||
SYS_IOCTL = 29
|
||||
SYS_IOPRIO_SET = 30
|
||||
SYS_IOPRIO_GET = 31
|
||||
SYS_FLOCK = 32
|
||||
SYS_MKNODAT = 33
|
||||
SYS_MKDIRAT = 34
|
||||
SYS_UNLINKAT = 35
|
||||
SYS_SYMLINKAT = 36
|
||||
SYS_LINKAT = 37
|
||||
SYS_UMOUNT2 = 39
|
||||
SYS_MOUNT = 40
|
||||
SYS_PIVOT_ROOT = 41
|
||||
SYS_NFSSERVCTL = 42
|
||||
SYS_STATFS = 43
|
||||
SYS_FSTATFS = 44
|
||||
SYS_TRUNCATE = 45
|
||||
SYS_FTRUNCATE = 46
|
||||
SYS_FALLOCATE = 47
|
||||
SYS_FACCESSAT = 48
|
||||
SYS_CHDIR = 49
|
||||
SYS_FCHDIR = 50
|
||||
SYS_CHROOT = 51
|
||||
SYS_FCHMOD = 52
|
||||
SYS_FCHMODAT = 53
|
||||
SYS_FCHOWNAT = 54
|
||||
SYS_FCHOWN = 55
|
||||
SYS_OPENAT = 56
|
||||
SYS_CLOSE = 57
|
||||
SYS_VHANGUP = 58
|
||||
SYS_PIPE2 = 59
|
||||
SYS_QUOTACTL = 60
|
||||
SYS_GETDENTS64 = 61
|
||||
SYS_LSEEK = 62
|
||||
SYS_READ = 63
|
||||
SYS_WRITE = 64
|
||||
SYS_READV = 65
|
||||
SYS_WRITEV = 66
|
||||
SYS_PREAD64 = 67
|
||||
SYS_PWRITE64 = 68
|
||||
SYS_PREADV = 69
|
||||
SYS_PWRITEV = 70
|
||||
SYS_SENDFILE = 71
|
||||
SYS_PSELECT6 = 72
|
||||
SYS_PPOLL = 73
|
||||
SYS_SIGNALFD4 = 74
|
||||
SYS_VMSPLICE = 75
|
||||
SYS_SPLICE = 76
|
||||
SYS_TEE = 77
|
||||
SYS_READLINKAT = 78
|
||||
SYS_FSTATAT = 79
|
||||
SYS_FSTAT = 80
|
||||
SYS_SYNC = 81
|
||||
SYS_FSYNC = 82
|
||||
SYS_FDATASYNC = 83
|
||||
SYS_SYNC_FILE_RANGE = 84
|
||||
SYS_TIMERFD_CREATE = 85
|
||||
SYS_TIMERFD_SETTIME = 86
|
||||
SYS_TIMERFD_GETTIME = 87
|
||||
SYS_UTIMENSAT = 88
|
||||
SYS_ACCT = 89
|
||||
SYS_CAPGET = 90
|
||||
SYS_CAPSET = 91
|
||||
SYS_PERSONALITY = 92
|
||||
SYS_EXIT = 93
|
||||
SYS_EXIT_GROUP = 94
|
||||
SYS_WAITID = 95
|
||||
SYS_SET_TID_ADDRESS = 96
|
||||
SYS_UNSHARE = 97
|
||||
SYS_FUTEX = 98
|
||||
SYS_SET_ROBUST_LIST = 99
|
||||
SYS_GET_ROBUST_LIST = 100
|
||||
SYS_NANOSLEEP = 101
|
||||
SYS_GETITIMER = 102
|
||||
SYS_SETITIMER = 103
|
||||
SYS_KEXEC_LOAD = 104
|
||||
SYS_INIT_MODULE = 105
|
||||
SYS_DELETE_MODULE = 106
|
||||
SYS_TIMER_CREATE = 107
|
||||
SYS_TIMER_GETTIME = 108
|
||||
SYS_TIMER_GETOVERRUN = 109
|
||||
SYS_TIMER_SETTIME = 110
|
||||
SYS_TIMER_DELETE = 111
|
||||
SYS_CLOCK_SETTIME = 112
|
||||
SYS_CLOCK_GETTIME = 113
|
||||
SYS_CLOCK_GETRES = 114
|
||||
SYS_CLOCK_NANOSLEEP = 115
|
||||
SYS_SYSLOG = 116
|
||||
SYS_PTRACE = 117
|
||||
SYS_SCHED_SETPARAM = 118
|
||||
SYS_SCHED_SETSCHEDULER = 119
|
||||
SYS_SCHED_GETSCHEDULER = 120
|
||||
SYS_SCHED_GETPARAM = 121
|
||||
SYS_SCHED_SETAFFINITY = 122
|
||||
SYS_SCHED_GETAFFINITY = 123
|
||||
SYS_SCHED_YIELD = 124
|
||||
SYS_SCHED_GET_PRIORITY_MAX = 125
|
||||
SYS_SCHED_GET_PRIORITY_MIN = 126
|
||||
SYS_SCHED_RR_GET_INTERVAL = 127
|
||||
SYS_RESTART_SYSCALL = 128
|
||||
SYS_KILL = 129
|
||||
SYS_TKILL = 130
|
||||
SYS_TGKILL = 131
|
||||
SYS_SIGALTSTACK = 132
|
||||
SYS_RT_SIGSUSPEND = 133
|
||||
SYS_RT_SIGACTION = 134
|
||||
SYS_RT_SIGPROCMASK = 135
|
||||
SYS_RT_SIGPENDING = 136
|
||||
SYS_RT_SIGTIMEDWAIT = 137
|
||||
SYS_RT_SIGQUEUEINFO = 138
|
||||
SYS_RT_SIGRETURN = 139
|
||||
SYS_SETPRIORITY = 140
|
||||
SYS_GETPRIORITY = 141
|
||||
SYS_REBOOT = 142
|
||||
SYS_SETREGID = 143
|
||||
SYS_SETGID = 144
|
||||
SYS_SETREUID = 145
|
||||
SYS_SETUID = 146
|
||||
SYS_SETRESUID = 147
|
||||
SYS_GETRESUID = 148
|
||||
SYS_SETRESGID = 149
|
||||
SYS_GETRESGID = 150
|
||||
SYS_SETFSUID = 151
|
||||
SYS_SETFSGID = 152
|
||||
SYS_TIMES = 153
|
||||
SYS_SETPGID = 154
|
||||
SYS_GETPGID = 155
|
||||
SYS_GETSID = 156
|
||||
SYS_SETSID = 157
|
||||
SYS_GETGROUPS = 158
|
||||
SYS_SETGROUPS = 159
|
||||
SYS_UNAME = 160
|
||||
SYS_SETHOSTNAME = 161
|
||||
SYS_SETDOMAINNAME = 162
|
||||
SYS_GETRUSAGE = 165
|
||||
SYS_UMASK = 166
|
||||
SYS_PRCTL = 167
|
||||
SYS_GETCPU = 168
|
||||
SYS_GETTIMEOFDAY = 169
|
||||
SYS_SETTIMEOFDAY = 170
|
||||
SYS_ADJTIMEX = 171
|
||||
SYS_GETPID = 172
|
||||
SYS_GETPPID = 173
|
||||
SYS_GETUID = 174
|
||||
SYS_GETEUID = 175
|
||||
SYS_GETGID = 176
|
||||
SYS_GETEGID = 177
|
||||
SYS_GETTID = 178
|
||||
SYS_SYSINFO = 179
|
||||
SYS_MQ_OPEN = 180
|
||||
SYS_MQ_UNLINK = 181
|
||||
SYS_MQ_TIMEDSEND = 182
|
||||
SYS_MQ_TIMEDRECEIVE = 183
|
||||
SYS_MQ_NOTIFY = 184
|
||||
SYS_MQ_GETSETATTR = 185
|
||||
SYS_MSGGET = 186
|
||||
SYS_MSGCTL = 187
|
||||
SYS_MSGRCV = 188
|
||||
SYS_MSGSND = 189
|
||||
SYS_SEMGET = 190
|
||||
SYS_SEMCTL = 191
|
||||
SYS_SEMTIMEDOP = 192
|
||||
SYS_SEMOP = 193
|
||||
SYS_SHMGET = 194
|
||||
SYS_SHMCTL = 195
|
||||
SYS_SHMAT = 196
|
||||
SYS_SHMDT = 197
|
||||
SYS_SOCKET = 198
|
||||
SYS_SOCKETPAIR = 199
|
||||
SYS_BIND = 200
|
||||
SYS_LISTEN = 201
|
||||
SYS_ACCEPT = 202
|
||||
SYS_CONNECT = 203
|
||||
SYS_GETSOCKNAME = 204
|
||||
SYS_GETPEERNAME = 205
|
||||
SYS_SENDTO = 206
|
||||
SYS_RECVFROM = 207
|
||||
SYS_SETSOCKOPT = 208
|
||||
SYS_GETSOCKOPT = 209
|
||||
SYS_SHUTDOWN = 210
|
||||
SYS_SENDMSG = 211
|
||||
SYS_RECVMSG = 212
|
||||
SYS_READAHEAD = 213
|
||||
SYS_BRK = 214
|
||||
SYS_MUNMAP = 215
|
||||
SYS_MREMAP = 216
|
||||
SYS_ADD_KEY = 217
|
||||
SYS_REQUEST_KEY = 218
|
||||
SYS_KEYCTL = 219
|
||||
SYS_CLONE = 220
|
||||
SYS_EXECVE = 221
|
||||
SYS_MMAP = 222
|
||||
SYS_FADVISE64 = 223
|
||||
SYS_SWAPON = 224
|
||||
SYS_SWAPOFF = 225
|
||||
SYS_MPROTECT = 226
|
||||
SYS_MSYNC = 227
|
||||
SYS_MLOCK = 228
|
||||
SYS_MUNLOCK = 229
|
||||
SYS_MLOCKALL = 230
|
||||
SYS_MUNLOCKALL = 231
|
||||
SYS_MINCORE = 232
|
||||
SYS_MADVISE = 233
|
||||
SYS_REMAP_FILE_PAGES = 234
|
||||
SYS_MBIND = 235
|
||||
SYS_GET_MEMPOLICY = 236
|
||||
SYS_SET_MEMPOLICY = 237
|
||||
SYS_MIGRATE_PAGES = 238
|
||||
SYS_MOVE_PAGES = 239
|
||||
SYS_RT_TGSIGQUEUEINFO = 240
|
||||
SYS_PERF_EVENT_OPEN = 241
|
||||
SYS_ACCEPT4 = 242
|
||||
SYS_RECVMMSG = 243
|
||||
SYS_ARCH_SPECIFIC_SYSCALL = 244
|
||||
SYS_WAIT4 = 260
|
||||
SYS_PRLIMIT64 = 261
|
||||
SYS_FANOTIFY_INIT = 262
|
||||
SYS_FANOTIFY_MARK = 263
|
||||
SYS_NAME_TO_HANDLE_AT = 264
|
||||
SYS_OPEN_BY_HANDLE_AT = 265
|
||||
SYS_CLOCK_ADJTIME = 266
|
||||
SYS_SYNCFS = 267
|
||||
SYS_SETNS = 268
|
||||
SYS_SENDMMSG = 269
|
||||
SYS_PROCESS_VM_READV = 270
|
||||
SYS_PROCESS_VM_WRITEV = 271
|
||||
SYS_KCMP = 272
|
||||
SYS_FINIT_MODULE = 273
|
||||
SYS_SCHED_SETATTR = 274
|
||||
SYS_SCHED_GETATTR = 275
|
||||
SYS_RENAMEAT2 = 276
|
||||
SYS_SECCOMP = 277
|
||||
SYS_GETRANDOM = 278
|
||||
SYS_MEMFD_CREATE = 279
|
||||
SYS_BPF = 280
|
||||
SYS_EXECVEAT = 281
|
||||
SYS_USERFAULTFD = 282
|
||||
SYS_MEMBARRIER = 283
|
||||
SYS_MLOCK2 = 284
|
||||
SYS_COPY_FILE_RANGE = 285
|
||||
SYS_PREADV2 = 286
|
||||
SYS_PWRITEV2 = 287
|
||||
SYS_PKEY_MPROTECT = 288
|
||||
SYS_PKEY_ALLOC = 289
|
||||
SYS_PKEY_FREE = 290
|
||||
SYS_STATX = 291
|
||||
SYS_IO_PGETEVENTS = 292
|
||||
SYS_RSEQ = 293
|
||||
SYS_KEXEC_FILE_LOAD = 294
|
||||
SYS_PIDFD_SEND_SIGNAL = 424
|
||||
SYS_IO_URING_SETUP = 425
|
||||
SYS_IO_URING_ENTER = 426
|
||||
SYS_IO_URING_REGISTER = 427
|
||||
SYS_OPEN_TREE = 428
|
||||
SYS_MOVE_MOUNT = 429
|
||||
SYS_FSOPEN = 430
|
||||
SYS_FSCONFIG = 431
|
||||
SYS_FSMOUNT = 432
|
||||
SYS_FSPICK = 433
|
||||
SYS_PIDFD_OPEN = 434
|
||||
SYS_CLONE3 = 435
|
||||
SYS_CLOSE_RANGE = 436
|
||||
SYS_OPENAT2 = 437
|
||||
SYS_PIDFD_GETFD = 438
|
||||
SYS_FACCESSAT2 = 439
|
||||
SYS_PROCESS_MADVISE = 440
|
||||
SYS_EPOLL_PWAIT2 = 441
|
||||
SYS_MOUNT_SETATTR = 442
|
||||
SYS_QUOTACTL_FD = 443
|
||||
SYS_LANDLOCK_CREATE_RULESET = 444
|
||||
SYS_LANDLOCK_ADD_RULE = 445
|
||||
SYS_LANDLOCK_RESTRICT_SELF = 446
|
||||
SYS_PROCESS_MRELEASE = 448
|
||||
SYS_FUTEX_WAITV = 449
|
||||
SYS_SET_MEMPOLICY_HOME_NODE = 450
|
||||
)
|
||||
+679
@@ -0,0 +1,679 @@
|
||||
// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go
|
||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||
|
||||
//go:build loong64 && linux
|
||||
// +build loong64,linux
|
||||
|
||||
package unix
|
||||
|
||||
const (
|
||||
SizeofPtr = 0x8
|
||||
SizeofLong = 0x8
|
||||
)
|
||||
|
||||
type (
|
||||
_C_long int64
|
||||
)
|
||||
|
||||
type Timespec struct {
|
||||
Sec int64
|
||||
Nsec int64
|
||||
}
|
||||
|
||||
type Timeval struct {
|
||||
Sec int64
|
||||
Usec int64
|
||||
}
|
||||
|
||||
type Timex struct {
|
||||
Modes uint32
|
||||
Offset int64
|
||||
Freq int64
|
||||
Maxerror int64
|
||||
Esterror int64
|
||||
Status int32
|
||||
Constant int64
|
||||
Precision int64
|
||||
Tolerance int64
|
||||
Time Timeval
|
||||
Tick int64
|
||||
Ppsfreq int64
|
||||
Jitter int64
|
||||
Shift int32
|
||||
Stabil int64
|
||||
Jitcnt int64
|
||||
Calcnt int64
|
||||
Errcnt int64
|
||||
Stbcnt int64
|
||||
Tai int32
|
||||
_ [44]byte
|
||||
}
|
||||
|
||||
type Time_t int64
|
||||
|
||||
type Tms struct {
|
||||
Utime int64
|
||||
Stime int64
|
||||
Cutime int64
|
||||
Cstime int64
|
||||
}
|
||||
|
||||
type Utimbuf struct {
|
||||
Actime int64
|
||||
Modtime int64
|
||||
}
|
||||
|
||||
type Rusage struct {
|
||||
Utime Timeval
|
||||
Stime Timeval
|
||||
Maxrss int64
|
||||
Ixrss int64
|
||||
Idrss int64
|
||||
Isrss int64
|
||||
Minflt int64
|
||||
Majflt int64
|
||||
Nswap int64
|
||||
Inblock int64
|
||||
Oublock int64
|
||||
Msgsnd int64
|
||||
Msgrcv int64
|
||||
Nsignals int64
|
||||
Nvcsw int64
|
||||
Nivcsw int64
|
||||
}
|
||||
|
||||
type Stat_t struct {
|
||||
Dev uint64
|
||||
Ino uint64
|
||||
Mode uint32
|
||||
Nlink uint32
|
||||
Uid uint32
|
||||
Gid uint32
|
||||
Rdev uint64
|
||||
_ uint64
|
||||
Size int64
|
||||
Blksize int32
|
||||
_ int32
|
||||
Blocks int64
|
||||
Atim Timespec
|
||||
Mtim Timespec
|
||||
Ctim Timespec
|
||||
_ [2]int32
|
||||
}
|
||||
|
||||
type Dirent struct {
|
||||
Ino uint64
|
||||
Off int64
|
||||
Reclen uint16
|
||||
Type uint8
|
||||
Name [256]int8
|
||||
_ [5]byte
|
||||
}
|
||||
|
||||
type Flock_t struct {
|
||||
Type int16
|
||||
Whence int16
|
||||
Start int64
|
||||
Len int64
|
||||
Pid int32
|
||||
_ [4]byte
|
||||
}
|
||||
|
||||
type DmNameList struct {
|
||||
Dev uint64
|
||||
Next uint32
|
||||
Name [0]byte
|
||||
_ [4]byte
|
||||
}
|
||||
|
||||
const (
|
||||
FADV_DONTNEED = 0x4
|
||||
FADV_NOREUSE = 0x5
|
||||
)
|
||||
|
||||
type RawSockaddrNFCLLCP struct {
|
||||
Sa_family uint16
|
||||
Dev_idx uint32
|
||||
Target_idx uint32
|
||||
Nfc_protocol uint32
|
||||
Dsap uint8
|
||||
Ssap uint8
|
||||
Service_name [63]uint8
|
||||
Service_name_len uint64
|
||||
}
|
||||
|
||||
type RawSockaddr struct {
|
||||
Family uint16
|
||||
Data [14]int8
|
||||
}
|
||||
|
||||
type RawSockaddrAny struct {
|
||||
Addr RawSockaddr
|
||||
Pad [96]int8
|
||||
}
|
||||
|
||||
type Iovec struct {
|
||||
Base *byte
|
||||
Len uint64
|
||||
}
|
||||
|
||||
type Msghdr struct {
|
||||
Name *byte
|
||||
Namelen uint32
|
||||
Iov *Iovec
|
||||
Iovlen uint64
|
||||
Control *byte
|
||||
Controllen uint64
|
||||
Flags int32
|
||||
_ [4]byte
|
||||
}
|
||||
|
||||
type Cmsghdr struct {
|
||||
Len uint64
|
||||
Level int32
|
||||
Type int32
|
||||
}
|
||||
|
||||
type ifreq struct {
|
||||
Ifrn [16]byte
|
||||
Ifru [24]byte
|
||||
}
|
||||
|
||||
const (
|
||||
SizeofSockaddrNFCLLCP = 0x60
|
||||
SizeofIovec = 0x10
|
||||
SizeofMsghdr = 0x38
|
||||
SizeofCmsghdr = 0x10
|
||||
)
|
||||
|
||||
const (
|
||||
SizeofSockFprog = 0x10
|
||||
)
|
||||
|
||||
type PtraceRegs struct {
|
||||
Regs [32]uint64
|
||||
Orig_a0 uint64
|
||||
Era uint64
|
||||
Badv uint64
|
||||
Reserved [10]uint64
|
||||
}
|
||||
|
||||
type FdSet struct {
|
||||
Bits [16]int64
|
||||
}
|
||||
|
||||
type Sysinfo_t struct {
|
||||
Uptime int64
|
||||
Loads [3]uint64
|
||||
Totalram uint64
|
||||
Freeram uint64
|
||||
Sharedram uint64
|
||||
Bufferram uint64
|
||||
Totalswap uint64
|
||||
Freeswap uint64
|
||||
Procs uint16
|
||||
Pad uint16
|
||||
Totalhigh uint64
|
||||
Freehigh uint64
|
||||
Unit uint32
|
||||
_ [0]int8
|
||||
_ [4]byte
|
||||
}
|
||||
|
||||
type Ustat_t struct {
|
||||
Tfree int32
|
||||
Tinode uint64
|
||||
Fname [6]int8
|
||||
Fpack [6]int8
|
||||
_ [4]byte
|
||||
}
|
||||
|
||||
type EpollEvent struct {
|
||||
Events uint32
|
||||
_ int32
|
||||
Fd int32
|
||||
Pad int32
|
||||
}
|
||||
|
||||
const (
|
||||
OPEN_TREE_CLOEXEC = 0x80000
|
||||
)
|
||||
|
||||
const (
|
||||
POLLRDHUP = 0x2000
|
||||
)
|
||||
|
||||
type Sigset_t struct {
|
||||
Val [16]uint64
|
||||
}
|
||||
|
||||
const _C__NSIG = 0x41
|
||||
|
||||
type Siginfo struct {
|
||||
Signo int32
|
||||
Errno int32
|
||||
Code int32
|
||||
_ int32
|
||||
_ [112]byte
|
||||
}
|
||||
|
||||
type Termios struct {
|
||||
Iflag uint32
|
||||
Oflag uint32
|
||||
Cflag uint32
|
||||
Lflag uint32
|
||||
Line uint8
|
||||
Cc [19]uint8
|
||||
Ispeed uint32
|
||||
Ospeed uint32
|
||||
}
|
||||
|
||||
type Taskstats struct {
|
||||
Version uint16
|
||||
Ac_exitcode uint32
|
||||
Ac_flag uint8
|
||||
Ac_nice uint8
|
||||
Cpu_count uint64
|
||||
Cpu_delay_total uint64
|
||||
Blkio_count uint64
|
||||
Blkio_delay_total uint64
|
||||
Swapin_count uint64
|
||||
Swapin_delay_total uint64
|
||||
Cpu_run_real_total uint64
|
||||
Cpu_run_virtual_total uint64
|
||||
Ac_comm [32]int8
|
||||
Ac_sched uint8
|
||||
Ac_pad [3]uint8
|
||||
_ [4]byte
|
||||
Ac_uid uint32
|
||||
Ac_gid uint32
|
||||
Ac_pid uint32
|
||||
Ac_ppid uint32
|
||||
Ac_btime uint32
|
||||
Ac_etime uint64
|
||||
Ac_utime uint64
|
||||
Ac_stime uint64
|
||||
Ac_minflt uint64
|
||||
Ac_majflt uint64
|
||||
Coremem uint64
|
||||
Virtmem uint64
|
||||
Hiwater_rss uint64
|
||||
Hiwater_vm uint64
|
||||
Read_char uint64
|
||||
Write_char uint64
|
||||
Read_syscalls uint64
|
||||
Write_syscalls uint64
|
||||
Read_bytes uint64
|
||||
Write_bytes uint64
|
||||
Cancelled_write_bytes uint64
|
||||
Nvcsw uint64
|
||||
Nivcsw uint64
|
||||
Ac_utimescaled uint64
|
||||
Ac_stimescaled uint64
|
||||
Cpu_scaled_run_real_total uint64
|
||||
Freepages_count uint64
|
||||
Freepages_delay_total uint64
|
||||
Thrashing_count uint64
|
||||
Thrashing_delay_total uint64
|
||||
Ac_btime64 uint64
|
||||
Compact_count uint64
|
||||
Compact_delay_total uint64
|
||||
}
|
||||
|
||||
type cpuMask uint64
|
||||
|
||||
const (
|
||||
_NCPUBITS = 0x40
|
||||
)
|
||||
|
||||
const (
|
||||
CBitFieldMaskBit0 = 0x1
|
||||
CBitFieldMaskBit1 = 0x2
|
||||
CBitFieldMaskBit2 = 0x4
|
||||
CBitFieldMaskBit3 = 0x8
|
||||
CBitFieldMaskBit4 = 0x10
|
||||
CBitFieldMaskBit5 = 0x20
|
||||
CBitFieldMaskBit6 = 0x40
|
||||
CBitFieldMaskBit7 = 0x80
|
||||
CBitFieldMaskBit8 = 0x100
|
||||
CBitFieldMaskBit9 = 0x200
|
||||
CBitFieldMaskBit10 = 0x400
|
||||
CBitFieldMaskBit11 = 0x800
|
||||
CBitFieldMaskBit12 = 0x1000
|
||||
CBitFieldMaskBit13 = 0x2000
|
||||
CBitFieldMaskBit14 = 0x4000
|
||||
CBitFieldMaskBit15 = 0x8000
|
||||
CBitFieldMaskBit16 = 0x10000
|
||||
CBitFieldMaskBit17 = 0x20000
|
||||
CBitFieldMaskBit18 = 0x40000
|
||||
CBitFieldMaskBit19 = 0x80000
|
||||
CBitFieldMaskBit20 = 0x100000
|
||||
CBitFieldMaskBit21 = 0x200000
|
||||
CBitFieldMaskBit22 = 0x400000
|
||||
CBitFieldMaskBit23 = 0x800000
|
||||
CBitFieldMaskBit24 = 0x1000000
|
||||
CBitFieldMaskBit25 = 0x2000000
|
||||
CBitFieldMaskBit26 = 0x4000000
|
||||
CBitFieldMaskBit27 = 0x8000000
|
||||
CBitFieldMaskBit28 = 0x10000000
|
||||
CBitFieldMaskBit29 = 0x20000000
|
||||
CBitFieldMaskBit30 = 0x40000000
|
||||
CBitFieldMaskBit31 = 0x80000000
|
||||
CBitFieldMaskBit32 = 0x100000000
|
||||
CBitFieldMaskBit33 = 0x200000000
|
||||
CBitFieldMaskBit34 = 0x400000000
|
||||
CBitFieldMaskBit35 = 0x800000000
|
||||
CBitFieldMaskBit36 = 0x1000000000
|
||||
CBitFieldMaskBit37 = 0x2000000000
|
||||
CBitFieldMaskBit38 = 0x4000000000
|
||||
CBitFieldMaskBit39 = 0x8000000000
|
||||
CBitFieldMaskBit40 = 0x10000000000
|
||||
CBitFieldMaskBit41 = 0x20000000000
|
||||
CBitFieldMaskBit42 = 0x40000000000
|
||||
CBitFieldMaskBit43 = 0x80000000000
|
||||
CBitFieldMaskBit44 = 0x100000000000
|
||||
CBitFieldMaskBit45 = 0x200000000000
|
||||
CBitFieldMaskBit46 = 0x400000000000
|
||||
CBitFieldMaskBit47 = 0x800000000000
|
||||
CBitFieldMaskBit48 = 0x1000000000000
|
||||
CBitFieldMaskBit49 = 0x2000000000000
|
||||
CBitFieldMaskBit50 = 0x4000000000000
|
||||
CBitFieldMaskBit51 = 0x8000000000000
|
||||
CBitFieldMaskBit52 = 0x10000000000000
|
||||
CBitFieldMaskBit53 = 0x20000000000000
|
||||
CBitFieldMaskBit54 = 0x40000000000000
|
||||
CBitFieldMaskBit55 = 0x80000000000000
|
||||
CBitFieldMaskBit56 = 0x100000000000000
|
||||
CBitFieldMaskBit57 = 0x200000000000000
|
||||
CBitFieldMaskBit58 = 0x400000000000000
|
||||
CBitFieldMaskBit59 = 0x800000000000000
|
||||
CBitFieldMaskBit60 = 0x1000000000000000
|
||||
CBitFieldMaskBit61 = 0x2000000000000000
|
||||
CBitFieldMaskBit62 = 0x4000000000000000
|
||||
CBitFieldMaskBit63 = 0x8000000000000000
|
||||
)
|
||||
|
||||
type SockaddrStorage struct {
|
||||
Family uint16
|
||||
_ [118]int8
|
||||
_ uint64
|
||||
}
|
||||
|
||||
type HDGeometry struct {
|
||||
Heads uint8
|
||||
Sectors uint8
|
||||
Cylinders uint16
|
||||
Start uint64
|
||||
}
|
||||
|
||||
type Statfs_t struct {
|
||||
Type int64
|
||||
Bsize int64
|
||||
Blocks uint64
|
||||
Bfree uint64
|
||||
Bavail uint64
|
||||
Files uint64
|
||||
Ffree uint64
|
||||
Fsid Fsid
|
||||
Namelen int64
|
||||
Frsize int64
|
||||
Flags int64
|
||||
Spare [4]int64
|
||||
}
|
||||
|
||||
type TpacketHdr struct {
|
||||
Status uint64
|
||||
Len uint32
|
||||
Snaplen uint32
|
||||
Mac uint16
|
||||
Net uint16
|
||||
Sec uint32
|
||||
Usec uint32
|
||||
_ [4]byte
|
||||
}
|
||||
|
||||
const (
|
||||
SizeofTpacketHdr = 0x20
|
||||
)
|
||||
|
||||
type RTCPLLInfo struct {
|
||||
Ctrl int32
|
||||
Value int32
|
||||
Max int32
|
||||
Min int32
|
||||
Posmult int32
|
||||
Negmult int32
|
||||
Clock int64
|
||||
}
|
||||
|
||||
type BlkpgPartition struct {
|
||||
Start int64
|
||||
Length int64
|
||||
Pno int32
|
||||
Devname [64]uint8
|
||||
Volname [64]uint8
|
||||
_ [4]byte
|
||||
}
|
||||
|
||||
const (
|
||||
BLKPG = 0x1269
|
||||
)
|
||||
|
||||
type XDPUmemReg struct {
|
||||
Addr uint64
|
||||
Len uint64
|
||||
Size uint32
|
||||
Headroom uint32
|
||||
Flags uint32
|
||||
_ [4]byte
|
||||
}
|
||||
|
||||
type CryptoUserAlg struct {
|
||||
Name [64]int8
|
||||
Driver_name [64]int8
|
||||
Module_name [64]int8
|
||||
Type uint32
|
||||
Mask uint32
|
||||
Refcnt uint32
|
||||
Flags uint32
|
||||
}
|
||||
|
||||
type CryptoStatAEAD struct {
|
||||
Type [64]int8
|
||||
Encrypt_cnt uint64
|
||||
Encrypt_tlen uint64
|
||||
Decrypt_cnt uint64
|
||||
Decrypt_tlen uint64
|
||||
Err_cnt uint64
|
||||
}
|
||||
|
||||
type CryptoStatAKCipher struct {
|
||||
Type [64]int8
|
||||
Encrypt_cnt uint64
|
||||
Encrypt_tlen uint64
|
||||
Decrypt_cnt uint64
|
||||
Decrypt_tlen uint64
|
||||
Verify_cnt uint64
|
||||
Sign_cnt uint64
|
||||
Err_cnt uint64
|
||||
}
|
||||
|
||||
type CryptoStatCipher struct {
|
||||
Type [64]int8
|
||||
Encrypt_cnt uint64
|
||||
Encrypt_tlen uint64
|
||||
Decrypt_cnt uint64
|
||||
Decrypt_tlen uint64
|
||||
Err_cnt uint64
|
||||
}
|
||||
|
||||
type CryptoStatCompress struct {
|
||||
Type [64]int8
|
||||
Compress_cnt uint64
|
||||
Compress_tlen uint64
|
||||
Decompress_cnt uint64
|
||||
Decompress_tlen uint64
|
||||
Err_cnt uint64
|
||||
}
|
||||
|
||||
type CryptoStatHash struct {
|
||||
Type [64]int8
|
||||
Hash_cnt uint64
|
||||
Hash_tlen uint64
|
||||
Err_cnt uint64
|
||||
}
|
||||
|
||||
type CryptoStatKPP struct {
|
||||
Type [64]int8
|
||||
Setsecret_cnt uint64
|
||||
Generate_public_key_cnt uint64
|
||||
Compute_shared_secret_cnt uint64
|
||||
Err_cnt uint64
|
||||
}
|
||||
|
||||
type CryptoStatRNG struct {
|
||||
Type [64]int8
|
||||
Generate_cnt uint64
|
||||
Generate_tlen uint64
|
||||
Seed_cnt uint64
|
||||
Err_cnt uint64
|
||||
}
|
||||
|
||||
type CryptoStatLarval struct {
|
||||
Type [64]int8
|
||||
}
|
||||
|
||||
type CryptoReportLarval struct {
|
||||
Type [64]int8
|
||||
}
|
||||
|
||||
type CryptoReportHash struct {
|
||||
Type [64]int8
|
||||
Blocksize uint32
|
||||
Digestsize uint32
|
||||
}
|
||||
|
||||
type CryptoReportCipher struct {
|
||||
Type [64]int8
|
||||
Blocksize uint32
|
||||
Min_keysize uint32
|
||||
Max_keysize uint32
|
||||
}
|
||||
|
||||
type CryptoReportBlkCipher struct {
|
||||
Type [64]int8
|
||||
Geniv [64]int8
|
||||
Blocksize uint32
|
||||
Min_keysize uint32
|
||||
Max_keysize uint32
|
||||
Ivsize uint32
|
||||
}
|
||||
|
||||
type CryptoReportAEAD struct {
|
||||
Type [64]int8
|
||||
Geniv [64]int8
|
||||
Blocksize uint32
|
||||
Maxauthsize uint32
|
||||
Ivsize uint32
|
||||
}
|
||||
|
||||
type CryptoReportComp struct {
|
||||
Type [64]int8
|
||||
}
|
||||
|
||||
type CryptoReportRNG struct {
|
||||
Type [64]int8
|
||||
Seedsize uint32
|
||||
}
|
||||
|
||||
type CryptoReportAKCipher struct {
|
||||
Type [64]int8
|
||||
}
|
||||
|
||||
type CryptoReportKPP struct {
|
||||
Type [64]int8
|
||||
}
|
||||
|
||||
type CryptoReportAcomp struct {
|
||||
Type [64]int8
|
||||
}
|
||||
|
||||
type LoopInfo struct {
|
||||
Number int32
|
||||
Device uint32
|
||||
Inode uint64
|
||||
Rdevice uint32
|
||||
Offset int32
|
||||
Encrypt_type int32
|
||||
Encrypt_key_size int32
|
||||
Flags int32
|
||||
Name [64]int8
|
||||
Encrypt_key [32]uint8
|
||||
Init [2]uint64
|
||||
Reserved [4]int8
|
||||
_ [4]byte
|
||||
}
|
||||
|
||||
type TIPCSubscr struct {
|
||||
Seq TIPCServiceRange
|
||||
Timeout uint32
|
||||
Filter uint32
|
||||
Handle [8]int8
|
||||
}
|
||||
|
||||
type TIPCSIOCLNReq struct {
|
||||
Peer uint32
|
||||
Id uint32
|
||||
Linkname [68]int8
|
||||
}
|
||||
|
||||
type TIPCSIOCNodeIDReq struct {
|
||||
Peer uint32
|
||||
Id [16]int8
|
||||
}
|
||||
|
||||
type PPSKInfo struct {
|
||||
Assert_sequence uint32
|
||||
Clear_sequence uint32
|
||||
Assert_tu PPSKTime
|
||||
Clear_tu PPSKTime
|
||||
Current_mode int32
|
||||
_ [4]byte
|
||||
}
|
||||
|
||||
const (
|
||||
PPS_GETPARAMS = 0x800870a1
|
||||
PPS_SETPARAMS = 0x400870a2
|
||||
PPS_GETCAP = 0x800870a3
|
||||
PPS_FETCH = 0xc00870a4
|
||||
)
|
||||
|
||||
const (
|
||||
PIDFD_NONBLOCK = 0x800
|
||||
)
|
||||
|
||||
type SysvIpcPerm struct {
|
||||
Key int32
|
||||
Uid uint32
|
||||
Gid uint32
|
||||
Cuid uint32
|
||||
Cgid uint32
|
||||
Mode uint32
|
||||
_ [0]uint8
|
||||
Seq uint16
|
||||
_ uint16
|
||||
_ uint64
|
||||
_ uint64
|
||||
}
|
||||
type SysvShmDesc struct {
|
||||
Perm SysvIpcPerm
|
||||
Segsz uint64
|
||||
Atime int64
|
||||
Dtime int64
|
||||
Ctime int64
|
||||
Cpid int32
|
||||
Lpid int32
|
||||
Nattch uint64
|
||||
_ uint64
|
||||
_ uint64
|
||||
}
|
||||
Vendored
+6
-5
@@ -1,4 +1,4 @@
|
||||
# cloud.google.com/go/compute v1.6.0
|
||||
# cloud.google.com/go/compute v1.6.1
|
||||
## explicit; go 1.15
|
||||
cloud.google.com/go/compute/metadata
|
||||
# github.com/Depado/bfchroma v1.3.0
|
||||
@@ -86,7 +86,7 @@ github.com/go-chi/render
|
||||
github.com/go-oauth2/oauth2/v4
|
||||
github.com/go-oauth2/oauth2/v4/errors
|
||||
github.com/go-oauth2/oauth2/v4/server
|
||||
# github.com/go-pkgz/auth v1.19.0
|
||||
# github.com/go-pkgz/auth v1.19.1-0.20220605174438-06e72788bcbb
|
||||
## explicit; go 1.17
|
||||
github.com/go-pkgz/auth
|
||||
github.com/go-pkgz/auth/avatar
|
||||
@@ -173,11 +173,12 @@ github.com/hashicorp/golang-lru/simplelru
|
||||
# github.com/jessevdk/go-flags v1.5.0
|
||||
## explicit; go 1.15
|
||||
github.com/jessevdk/go-flags
|
||||
# github.com/klauspost/compress v1.15.1
|
||||
## explicit; go 1.15
|
||||
# github.com/klauspost/compress v1.15.2
|
||||
## explicit; go 1.16
|
||||
github.com/klauspost/compress
|
||||
github.com/klauspost/compress/fse
|
||||
github.com/klauspost/compress/huff0
|
||||
github.com/klauspost/compress/internal/cpuinfo
|
||||
github.com/klauspost/compress/internal/snapref
|
||||
github.com/klauspost/compress/zstd
|
||||
github.com/klauspost/compress/zstd/internal/xxhash
|
||||
@@ -317,7 +318,7 @@ golang.org/x/oauth2/yandex
|
||||
# golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||
## explicit
|
||||
golang.org/x/sync/errgroup
|
||||
# golang.org/x/sys v0.0.0-20220412211240-33da011f77ad
|
||||
# golang.org/x/sys v0.0.0-20220422013727-9388b58f7150
|
||||
## explicit; go 1.17
|
||||
golang.org/x/sys/internal/unsafeheader
|
||||
golang.org/x/sys/unix
|
||||
|
||||
Reference in New Issue
Block a user