vendor: update bbolt v1.3.4, zap v1.14.1
Signed-off-by: Gyuho Lee <leegyuho@amazon.com>release-3.5
parent
45a45d3c0a
commit
3ffb3aed3a
12
go.mod
12
go.mod
|
@ -1,11 +1,12 @@
|
||||||
module go.etcd.io/etcd
|
module go.etcd.io/etcd
|
||||||
|
|
||||||
|
go 1.14
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/bgentry/speakeasy v0.1.0
|
github.com/bgentry/speakeasy v0.1.0
|
||||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa
|
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa
|
||||||
github.com/coreos/go-semver v0.2.0
|
github.com/coreos/go-semver v0.2.0
|
||||||
github.com/coreos/go-systemd/v22 v22.0.0
|
github.com/coreos/go-systemd/v22 v22.0.0
|
||||||
github.com/coreos/license-bill-of-materials v0.0.0-20190913234955-13baff47494e // indirect
|
|
||||||
github.com/creack/pty v1.1.7
|
github.com/creack/pty v1.1.7
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4
|
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4
|
||||||
|
@ -36,18 +37,13 @@ require (
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8
|
||||||
github.com/urfave/cli v1.20.0
|
github.com/urfave/cli v1.20.0
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2
|
||||||
go.etcd.io/bbolt v1.3.3
|
go.etcd.io/bbolt v1.3.4
|
||||||
go.uber.org/atomic v1.3.2 // indirect
|
go.uber.org/zap v1.14.1
|
||||||
go.uber.org/multierr v1.1.0 // indirect
|
|
||||||
go.uber.org/zap v1.10.0
|
|
||||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc
|
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc
|
||||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7
|
||||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 // indirect
|
|
||||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2
|
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2
|
||||||
google.golang.org/grpc v1.26.0
|
google.golang.org/grpc v1.26.0
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.25
|
gopkg.in/cheggaaa/pb.v1 v1.0.25
|
||||||
gopkg.in/yaml.v2 v2.2.2
|
gopkg.in/yaml.v2 v2.2.2
|
||||||
sigs.k8s.io/yaml v1.1.0
|
sigs.k8s.io/yaml v1.1.0
|
||||||
)
|
)
|
||||||
|
|
||||||
go 1.13
|
|
||||||
|
|
44
go.sum
44
go.sum
|
@ -1,4 +1,5 @@
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
|
@ -16,8 +17,6 @@ github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazu
|
||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28=
|
github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28=
|
||||||
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
|
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
|
||||||
github.com/coreos/license-bill-of-materials v0.0.0-20190913234955-13baff47494e h1:vHRufSa2k8tfkcDdia1vJFa+oiBvvPxW94mg76PPAoA=
|
|
||||||
github.com/coreos/license-bill-of-materials v0.0.0-20190913234955-13baff47494e/go.mod h1:4xMOusJ7xxc84WclVxKT8+lNfGYDwojOUC2OQNCwcj4=
|
|
||||||
github.com/creack/pty v1.1.7 h1:6pwm8kMQKCmgUg0ZHTm5+/YvRK0s3THD/28+T6/kk4A=
|
github.com/creack/pty v1.1.7 h1:6pwm8kMQKCmgUg0ZHTm5+/YvRK0s3THD/28+T6/kk4A=
|
||||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
@ -56,6 +55,7 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
|
||||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=
|
github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=
|
||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c h1:Lh2aW+HnU2Nbe1gqD9SOJLJxW1jBMmQOktN2acDyJk8=
|
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c h1:Lh2aW+HnU2Nbe1gqD9SOJLJxW1jBMmQOktN2acDyJk8=
|
||||||
|
@ -104,6 +104,8 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 h1:58+kh9C6
|
||||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||||
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
|
@ -120,6 +122,7 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
|
||||||
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
|
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
|
||||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||||
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
|
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||||
|
@ -136,30 +139,38 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
||||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
|
go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
|
||||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||||
go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
|
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
|
||||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||||
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
|
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||||
go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
|
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||||
|
go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo=
|
||||||
|
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4=
|
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4=
|
||||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U=
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U=
|
||||||
|
@ -169,6 +180,7 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA=
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA=
|
||||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
@ -185,8 +197,8 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg=
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0=
|
||||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 h1:+DCIGbF/swA92ohVg0//6X2IVY3KZs6p9mix0ziNYJM=
|
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 h1:+DCIGbF/swA92ohVg0//6X2IVY3KZs6p9mix0ziNYJM=
|
||||||
|
@ -196,6 +208,11 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs=
|
||||||
|
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
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.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
||||||
|
@ -213,6 +230,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I=
|
gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I=
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||||
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
@ -220,5 +238,7 @@ gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
|
||||||
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
|
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
|
||||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||||
|
|
|
@ -13,8 +13,8 @@ if [ -d "gopath.proto" ]; then
|
||||||
exit 255
|
exit 255
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $(go version) != "go version go1.13"* ]]; then
|
if [[ $(go version) != "go version go1.14"* ]]; then
|
||||||
echo "expect Go 1.13+, got:" "$(go version)"
|
echo "expect Go 1.14+, got:" "$(go version)"
|
||||||
exit 255
|
exit 255
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,3 @@ const maxMapSize = 0x7FFFFFFF // 2GB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0xFFFFFFF
|
const maxAllocSize = 0xFFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned = false
|
|
||||||
|
|
|
@ -5,6 +5,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0x7FFFFFFF
|
const maxAllocSize = 0x7FFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned = false
|
|
||||||
|
|
|
@ -1,28 +1,7 @@
|
||||||
package bbolt
|
package bbolt
|
||||||
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
// maxMapSize represents the largest mmap size supported by Bolt.
|
// maxMapSize represents the largest mmap size supported by Bolt.
|
||||||
const maxMapSize = 0x7FFFFFFF // 2GB
|
const maxMapSize = 0x7FFFFFFF // 2GB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0xFFFFFFF
|
const maxAllocSize = 0xFFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned bool
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
// Simple check to see whether this arch handles unaligned load/stores
|
|
||||||
// correctly.
|
|
||||||
|
|
||||||
// ARM9 and older devices require load/stores to be from/to aligned
|
|
||||||
// addresses. If not, the lower 2 bits are cleared and that address is
|
|
||||||
// read in a jumbled up order.
|
|
||||||
|
|
||||||
// See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka15414.html
|
|
||||||
|
|
||||||
raw := [6]byte{0xfe, 0xef, 0x11, 0x22, 0x22, 0x11}
|
|
||||||
val := *(*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(&raw)) + 2))
|
|
||||||
|
|
||||||
brokenUnaligned = val != 0x11222211
|
|
||||||
}
|
|
||||||
|
|
|
@ -7,6 +7,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0x7FFFFFFF
|
const maxAllocSize = 0x7FFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned = false
|
|
||||||
|
|
|
@ -7,6 +7,3 @@ const maxMapSize = 0x8000000000 // 512GB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0x7FFFFFFF
|
const maxAllocSize = 0x7FFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned = false
|
|
||||||
|
|
|
@ -7,6 +7,3 @@ const maxMapSize = 0x40000000 // 1GB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0xFFFFFFF
|
const maxAllocSize = 0xFFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned = false
|
|
||||||
|
|
|
@ -7,6 +7,3 @@ const maxMapSize = 0x7FFFFFFF // 2GB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0xFFFFFFF
|
const maxAllocSize = 0xFFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned = false
|
|
||||||
|
|
|
@ -7,6 +7,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0x7FFFFFFF
|
const maxAllocSize = 0x7FFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned = false
|
|
||||||
|
|
|
@ -7,6 +7,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0x7FFFFFFF
|
const maxAllocSize = 0x7FFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned = false
|
|
||||||
|
|
|
@ -7,6 +7,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0x7FFFFFFF
|
const maxAllocSize = 0x7FFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned = true
|
|
||||||
|
|
|
@ -7,6 +7,3 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB
|
||||||
|
|
||||||
// maxAllocSize is the size used when creating array pointers.
|
// maxAllocSize is the size used when creating array pointers.
|
||||||
const maxAllocSize = 0x7FFFFFFF
|
const maxAllocSize = 0x7FFFFFFF
|
||||||
|
|
||||||
// Are unaligned load/stores broken on this arch?
|
|
||||||
var brokenUnaligned = false
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// +build !windows,!plan9,!solaris
|
// +build !windows,!plan9,!solaris,!aix
|
||||||
|
|
||||||
package bbolt
|
package bbolt
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
// +build aix
|
||||||
|
|
||||||
|
package bbolt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
// flock acquires an advisory lock on a file descriptor.
|
||||||
|
func flock(db *DB, exclusive bool, timeout time.Duration) error {
|
||||||
|
var t time.Time
|
||||||
|
if timeout != 0 {
|
||||||
|
t = time.Now()
|
||||||
|
}
|
||||||
|
fd := db.file.Fd()
|
||||||
|
var lockType int16
|
||||||
|
if exclusive {
|
||||||
|
lockType = syscall.F_WRLCK
|
||||||
|
} else {
|
||||||
|
lockType = syscall.F_RDLCK
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
// Attempt to obtain an exclusive lock.
|
||||||
|
lock := syscall.Flock_t{Type: lockType}
|
||||||
|
err := syscall.FcntlFlock(fd, syscall.F_SETLK, &lock)
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
} else if err != syscall.EAGAIN {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we timed out then return an error.
|
||||||
|
if timeout != 0 && time.Since(t) > timeout-flockRetryTimeout {
|
||||||
|
return ErrTimeout
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for a bit and try again.
|
||||||
|
time.Sleep(flockRetryTimeout)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// funlock releases an advisory lock on a file descriptor.
|
||||||
|
func funlock(db *DB) error {
|
||||||
|
var lock syscall.Flock_t
|
||||||
|
lock.Start = 0
|
||||||
|
lock.Len = 0
|
||||||
|
lock.Type = syscall.F_UNLCK
|
||||||
|
lock.Whence = 0
|
||||||
|
return syscall.FcntlFlock(uintptr(db.file.Fd()), syscall.F_SETLK, &lock)
|
||||||
|
}
|
||||||
|
|
||||||
|
// mmap memory maps a DB's data file.
|
||||||
|
func mmap(db *DB, sz int) error {
|
||||||
|
// Map the data file to memory.
|
||||||
|
b, err := unix.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED|db.MmapFlags)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Advise the kernel that the mmap is accessed randomly.
|
||||||
|
if err := unix.Madvise(b, syscall.MADV_RANDOM); err != nil {
|
||||||
|
return fmt.Errorf("madvise: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the original byte slice and convert to a byte array pointer.
|
||||||
|
db.dataref = b
|
||||||
|
db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))
|
||||||
|
db.datasz = sz
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// munmap unmaps a DB's data file from memory.
|
||||||
|
func munmap(db *DB) error {
|
||||||
|
// Ignore the unmap if we have no mapped data.
|
||||||
|
if db.dataref == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unmap using the original byte slice.
|
||||||
|
err := unix.Munmap(db.dataref)
|
||||||
|
db.dataref = nil
|
||||||
|
db.data = nil
|
||||||
|
db.datasz = 0
|
||||||
|
return err
|
||||||
|
}
|
|
@ -123,10 +123,12 @@ func (b *Bucket) Bucket(name []byte) *Bucket {
|
||||||
func (b *Bucket) openBucket(value []byte) *Bucket {
|
func (b *Bucket) openBucket(value []byte) *Bucket {
|
||||||
var child = newBucket(b.tx)
|
var child = newBucket(b.tx)
|
||||||
|
|
||||||
// If unaligned load/stores are broken on this arch and value is
|
// Unaligned access requires a copy to be made.
|
||||||
// unaligned simply clone to an aligned byte array.
|
const unalignedMask = unsafe.Alignof(struct {
|
||||||
unaligned := brokenUnaligned && uintptr(unsafe.Pointer(&value[0]))&3 != 0
|
bucket
|
||||||
|
page
|
||||||
|
}{}) - 1
|
||||||
|
unaligned := uintptr(unsafe.Pointer(&value[0]))&unalignedMask != 0
|
||||||
if unaligned {
|
if unaligned {
|
||||||
value = cloneBytes(value)
|
value = cloneBytes(value)
|
||||||
}
|
}
|
||||||
|
@ -206,7 +208,7 @@ func (b *Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteBucket deletes a bucket at the given key.
|
// DeleteBucket deletes a bucket at the given key.
|
||||||
// Returns an error if the bucket does not exists, or if the key represents a non-bucket value.
|
// Returns an error if the bucket does not exist, or if the key represents a non-bucket value.
|
||||||
func (b *Bucket) DeleteBucket(key []byte) error {
|
func (b *Bucket) DeleteBucket(key []byte) error {
|
||||||
if b.tx.db == nil {
|
if b.tx.db == nil {
|
||||||
return ErrTxClosed
|
return ErrTxClosed
|
||||||
|
@ -228,7 +230,7 @@ func (b *Bucket) DeleteBucket(key []byte) error {
|
||||||
// Recursively delete all child buckets.
|
// Recursively delete all child buckets.
|
||||||
child := b.Bucket(key)
|
child := b.Bucket(key)
|
||||||
err := child.ForEach(func(k, v []byte) error {
|
err := child.ForEach(func(k, v []byte) error {
|
||||||
if v == nil {
|
if _, _, childFlags := child.Cursor().seek(k); (childFlags & bucketLeafFlag) != 0 {
|
||||||
if err := child.DeleteBucket(k); err != nil {
|
if err := child.DeleteBucket(k); err != nil {
|
||||||
return fmt.Errorf("delete bucket: %s", err)
|
return fmt.Errorf("delete bucket: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -409,7 +411,7 @@ func (b *Bucket) Stats() BucketStats {
|
||||||
|
|
||||||
if p.count != 0 {
|
if p.count != 0 {
|
||||||
// If page has any elements, add all element headers.
|
// If page has any elements, add all element headers.
|
||||||
used += leafPageElementSize * int(p.count-1)
|
used += leafPageElementSize * uintptr(p.count-1)
|
||||||
|
|
||||||
// Add all element key, value sizes.
|
// Add all element key, value sizes.
|
||||||
// The computation takes advantage of the fact that the position
|
// The computation takes advantage of the fact that the position
|
||||||
|
@ -417,16 +419,16 @@ func (b *Bucket) Stats() BucketStats {
|
||||||
// of all previous elements' keys and values.
|
// of all previous elements' keys and values.
|
||||||
// It also includes the last element's header.
|
// It also includes the last element's header.
|
||||||
lastElement := p.leafPageElement(p.count - 1)
|
lastElement := p.leafPageElement(p.count - 1)
|
||||||
used += int(lastElement.pos + lastElement.ksize + lastElement.vsize)
|
used += uintptr(lastElement.pos + lastElement.ksize + lastElement.vsize)
|
||||||
}
|
}
|
||||||
|
|
||||||
if b.root == 0 {
|
if b.root == 0 {
|
||||||
// For inlined bucket just update the inline stats
|
// For inlined bucket just update the inline stats
|
||||||
s.InlineBucketInuse += used
|
s.InlineBucketInuse += int(used)
|
||||||
} else {
|
} else {
|
||||||
// For non-inlined bucket update all the leaf stats
|
// For non-inlined bucket update all the leaf stats
|
||||||
s.LeafPageN++
|
s.LeafPageN++
|
||||||
s.LeafInuse += used
|
s.LeafInuse += int(used)
|
||||||
s.LeafOverflowN += int(p.overflow)
|
s.LeafOverflowN += int(p.overflow)
|
||||||
|
|
||||||
// Collect stats from sub-buckets.
|
// Collect stats from sub-buckets.
|
||||||
|
@ -447,13 +449,13 @@ func (b *Bucket) Stats() BucketStats {
|
||||||
|
|
||||||
// used totals the used bytes for the page
|
// used totals the used bytes for the page
|
||||||
// Add header and all element headers.
|
// Add header and all element headers.
|
||||||
used := pageHeaderSize + (branchPageElementSize * int(p.count-1))
|
used := pageHeaderSize + (branchPageElementSize * uintptr(p.count-1))
|
||||||
|
|
||||||
// Add size of all keys and values.
|
// Add size of all keys and values.
|
||||||
// Again, use the fact that last element's position equals to
|
// Again, use the fact that last element's position equals to
|
||||||
// the total of key, value sizes of all previous elements.
|
// the total of key, value sizes of all previous elements.
|
||||||
used += int(lastElement.pos + lastElement.ksize)
|
used += uintptr(lastElement.pos + lastElement.ksize)
|
||||||
s.BranchInuse += used
|
s.BranchInuse += int(used)
|
||||||
s.BranchOverflowN += int(p.overflow)
|
s.BranchOverflowN += int(p.overflow)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -593,7 +595,7 @@ func (b *Bucket) inlineable() bool {
|
||||||
// our threshold for inline bucket size.
|
// our threshold for inline bucket size.
|
||||||
var size = pageHeaderSize
|
var size = pageHeaderSize
|
||||||
for _, inode := range n.inodes {
|
for _, inode := range n.inodes {
|
||||||
size += leafPageElementSize + len(inode.key) + len(inode.value)
|
size += leafPageElementSize + uintptr(len(inode.key)) + uintptr(len(inode.value))
|
||||||
|
|
||||||
if inode.flags&bucketLeafFlag != 0 {
|
if inode.flags&bucketLeafFlag != 0 {
|
||||||
return false
|
return false
|
||||||
|
@ -606,8 +608,8 @@ func (b *Bucket) inlineable() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the maximum total size of a bucket to make it a candidate for inlining.
|
// Returns the maximum total size of a bucket to make it a candidate for inlining.
|
||||||
func (b *Bucket) maxInlineBucketSize() int {
|
func (b *Bucket) maxInlineBucketSize() uintptr {
|
||||||
return b.tx.db.pageSize / 4
|
return uintptr(b.tx.db.pageSize / 4)
|
||||||
}
|
}
|
||||||
|
|
||||||
// write allocates and writes a bucket to a byte slice.
|
// write allocates and writes a bucket to a byte slice.
|
||||||
|
|
|
@ -366,7 +366,7 @@ func (c *Cursor) node() *node {
|
||||||
}
|
}
|
||||||
for _, ref := range c.stack[:len(c.stack)-1] {
|
for _, ref := range c.stack[:len(c.stack)-1] {
|
||||||
_assert(!n.isLeaf, "expected branch node")
|
_assert(!n.isLeaf, "expected branch node")
|
||||||
n = n.childAt(int(ref.index))
|
n = n.childAt(ref.index)
|
||||||
}
|
}
|
||||||
_assert(n.isLeaf, "expected leaf node")
|
_assert(n.isLeaf, "expected leaf node")
|
||||||
return n
|
return n
|
||||||
|
|
|
@ -206,12 +206,12 @@ func Open(path string, mode os.FileMode, options *Options) (*DB, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open data file and separate sync handler for metadata writes.
|
// Open data file and separate sync handler for metadata writes.
|
||||||
db.path = path
|
|
||||||
var err error
|
var err error
|
||||||
if db.file, err = db.openFile(db.path, flag|os.O_CREATE, mode); err != nil {
|
if db.file, err = db.openFile(path, flag|os.O_CREATE, mode); err != nil {
|
||||||
_ = db.close()
|
_ = db.close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
db.path = db.file.Name()
|
||||||
|
|
||||||
// Lock file so that other processes using Bolt in read-write mode cannot
|
// Lock file so that other processes using Bolt in read-write mode cannot
|
||||||
// use the database at the same time. This would cause corruption since
|
// use the database at the same time. This would cause corruption since
|
||||||
|
|
|
@ -2,6 +2,7 @@ package bbolt
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
@ -71,7 +72,7 @@ func (f *freelist) size() int {
|
||||||
// The first element will be used to store the count. See freelist.write.
|
// The first element will be used to store the count. See freelist.write.
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * n)
|
return int(pageHeaderSize) + (int(unsafe.Sizeof(pgid(0))) * n)
|
||||||
}
|
}
|
||||||
|
|
||||||
// count returns count of pages on the freelist
|
// count returns count of pages on the freelist
|
||||||
|
@ -93,8 +94,24 @@ func (f *freelist) pending_count() int {
|
||||||
return count
|
return count
|
||||||
}
|
}
|
||||||
|
|
||||||
// copyall copies into dst a list of all free ids and all pending ids in one sorted list.
|
// copyallunsafe copies a list of all free ids and all pending ids in one sorted list.
|
||||||
// f.count returns the minimum length required for dst.
|
// f.count returns the minimum length required for dst.
|
||||||
|
func (f *freelist) copyallunsafe(dstptr unsafe.Pointer) { // dstptr is []pgid data pointer
|
||||||
|
m := make(pgids, 0, f.pending_count())
|
||||||
|
for _, txp := range f.pending {
|
||||||
|
m = append(m, txp.ids...)
|
||||||
|
}
|
||||||
|
sort.Sort(m)
|
||||||
|
fpgids := f.getFreePageIDs()
|
||||||
|
sz := len(fpgids) + len(m)
|
||||||
|
dst := *(*[]pgid)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
|
Data: uintptr(dstptr),
|
||||||
|
Len: sz,
|
||||||
|
Cap: sz,
|
||||||
|
}))
|
||||||
|
mergepgids(dst, fpgids, m)
|
||||||
|
}
|
||||||
|
|
||||||
func (f *freelist) copyall(dst []pgid) {
|
func (f *freelist) copyall(dst []pgid) {
|
||||||
m := make(pgids, 0, f.pending_count())
|
m := make(pgids, 0, f.pending_count())
|
||||||
for _, txp := range f.pending {
|
for _, txp := range f.pending {
|
||||||
|
@ -267,17 +284,21 @@ func (f *freelist) read(p *page) {
|
||||||
}
|
}
|
||||||
// If the page.count is at the max uint16 value (64k) then it's considered
|
// If the page.count is at the max uint16 value (64k) then it's considered
|
||||||
// an overflow and the size of the freelist is stored as the first element.
|
// an overflow and the size of the freelist is stored as the first element.
|
||||||
idx, count := 0, int(p.count)
|
var idx, count uintptr = 0, uintptr(p.count)
|
||||||
if count == 0xFFFF {
|
if count == 0xFFFF {
|
||||||
idx = 1
|
idx = 1
|
||||||
count = int(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0])
|
count = uintptr(*(*pgid)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p))))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy the list of page ids from the freelist.
|
// Copy the list of page ids from the freelist.
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
f.ids = nil
|
f.ids = nil
|
||||||
} else {
|
} else {
|
||||||
ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx : idx+count]
|
ids := *(*[]pgid)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
|
Data: uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p) + idx*unsafe.Sizeof(pgid(0)),
|
||||||
|
Len: int(count),
|
||||||
|
Cap: int(count),
|
||||||
|
}))
|
||||||
|
|
||||||
// copy the ids, so we don't modify on the freelist page directly
|
// copy the ids, so we don't modify on the freelist page directly
|
||||||
idsCopy := make([]pgid, count)
|
idsCopy := make([]pgid, count)
|
||||||
|
@ -315,11 +336,11 @@ func (f *freelist) write(p *page) error {
|
||||||
p.count = uint16(lenids)
|
p.count = uint16(lenids)
|
||||||
} else if lenids < 0xFFFF {
|
} else if lenids < 0xFFFF {
|
||||||
p.count = uint16(lenids)
|
p.count = uint16(lenids)
|
||||||
f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:])
|
f.copyallunsafe(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p)))
|
||||||
} else {
|
} else {
|
||||||
p.count = 0xFFFF
|
p.count = 0xFFFF
|
||||||
((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0] = pgid(lenids)
|
*(*pgid)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p))) = pgid(lenids)
|
||||||
f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[1:])
|
f.copyallunsafe(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p) + unsafe.Sizeof(pgid(0))))
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -27,7 +27,7 @@ func (f *freelist) hashmapAllocate(txid txid, n int) pgid {
|
||||||
f.allocs[pid] = txid
|
f.allocs[pid] = txid
|
||||||
|
|
||||||
for i := pgid(0); i < pgid(n); i++ {
|
for i := pgid(0); i < pgid(n); i++ {
|
||||||
delete(f.cache, pid+pgid(i))
|
delete(f.cache, pid+i)
|
||||||
}
|
}
|
||||||
return pid
|
return pid
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package bbolt
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
@ -41,19 +42,19 @@ func (n *node) size() int {
|
||||||
sz, elsz := pageHeaderSize, n.pageElementSize()
|
sz, elsz := pageHeaderSize, n.pageElementSize()
|
||||||
for i := 0; i < len(n.inodes); i++ {
|
for i := 0; i < len(n.inodes); i++ {
|
||||||
item := &n.inodes[i]
|
item := &n.inodes[i]
|
||||||
sz += elsz + len(item.key) + len(item.value)
|
sz += elsz + uintptr(len(item.key)) + uintptr(len(item.value))
|
||||||
}
|
}
|
||||||
return sz
|
return int(sz)
|
||||||
}
|
}
|
||||||
|
|
||||||
// sizeLessThan returns true if the node is less than a given size.
|
// sizeLessThan returns true if the node is less than a given size.
|
||||||
// This is an optimization to avoid calculating a large node when we only need
|
// This is an optimization to avoid calculating a large node when we only need
|
||||||
// to know if it fits inside a certain page size.
|
// to know if it fits inside a certain page size.
|
||||||
func (n *node) sizeLessThan(v int) bool {
|
func (n *node) sizeLessThan(v uintptr) bool {
|
||||||
sz, elsz := pageHeaderSize, n.pageElementSize()
|
sz, elsz := pageHeaderSize, n.pageElementSize()
|
||||||
for i := 0; i < len(n.inodes); i++ {
|
for i := 0; i < len(n.inodes); i++ {
|
||||||
item := &n.inodes[i]
|
item := &n.inodes[i]
|
||||||
sz += elsz + len(item.key) + len(item.value)
|
sz += elsz + uintptr(len(item.key)) + uintptr(len(item.value))
|
||||||
if sz >= v {
|
if sz >= v {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -62,7 +63,7 @@ func (n *node) sizeLessThan(v int) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// pageElementSize returns the size of each page element based on the type of node.
|
// pageElementSize returns the size of each page element based on the type of node.
|
||||||
func (n *node) pageElementSize() int {
|
func (n *node) pageElementSize() uintptr {
|
||||||
if n.isLeaf {
|
if n.isLeaf {
|
||||||
return leafPageElementSize
|
return leafPageElementSize
|
||||||
}
|
}
|
||||||
|
@ -207,39 +208,39 @@ func (n *node) write(p *page) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop over each item and write it to the page.
|
// Loop over each item and write it to the page.
|
||||||
b := (*[maxAllocSize]byte)(unsafe.Pointer(&p.ptr))[n.pageElementSize()*len(n.inodes):]
|
bp := uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p) + n.pageElementSize()*uintptr(len(n.inodes))
|
||||||
for i, item := range n.inodes {
|
for i, item := range n.inodes {
|
||||||
_assert(len(item.key) > 0, "write: zero-length inode key")
|
_assert(len(item.key) > 0, "write: zero-length inode key")
|
||||||
|
|
||||||
// Write the page element.
|
// Write the page element.
|
||||||
if n.isLeaf {
|
if n.isLeaf {
|
||||||
elem := p.leafPageElement(uint16(i))
|
elem := p.leafPageElement(uint16(i))
|
||||||
elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem)))
|
elem.pos = uint32(bp - uintptr(unsafe.Pointer(elem)))
|
||||||
elem.flags = item.flags
|
elem.flags = item.flags
|
||||||
elem.ksize = uint32(len(item.key))
|
elem.ksize = uint32(len(item.key))
|
||||||
elem.vsize = uint32(len(item.value))
|
elem.vsize = uint32(len(item.value))
|
||||||
} else {
|
} else {
|
||||||
elem := p.branchPageElement(uint16(i))
|
elem := p.branchPageElement(uint16(i))
|
||||||
elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem)))
|
elem.pos = uint32(bp - uintptr(unsafe.Pointer(elem)))
|
||||||
elem.ksize = uint32(len(item.key))
|
elem.ksize = uint32(len(item.key))
|
||||||
elem.pgid = item.pgid
|
elem.pgid = item.pgid
|
||||||
_assert(elem.pgid != p.id, "write: circular dependency occurred")
|
_assert(elem.pgid != p.id, "write: circular dependency occurred")
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the length of key+value is larger than the max allocation size
|
// Create a slice to write into of needed size and advance
|
||||||
// then we need to reallocate the byte array pointer.
|
// byte pointer for next iteration.
|
||||||
//
|
|
||||||
// See: https://github.com/boltdb/bolt/pull/335
|
|
||||||
klen, vlen := len(item.key), len(item.value)
|
klen, vlen := len(item.key), len(item.value)
|
||||||
if len(b) < klen+vlen {
|
sz := klen + vlen
|
||||||
b = (*[maxAllocSize]byte)(unsafe.Pointer(&b[0]))[:]
|
b := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
}
|
Data: bp,
|
||||||
|
Len: sz,
|
||||||
|
Cap: sz,
|
||||||
|
}))
|
||||||
|
bp += uintptr(sz)
|
||||||
|
|
||||||
// Write data for the element to the end of the page.
|
// Write data for the element to the end of the page.
|
||||||
copy(b[0:], item.key)
|
l := copy(b, item.key)
|
||||||
b = b[klen:]
|
copy(b[l:], item.value)
|
||||||
copy(b[0:], item.value)
|
|
||||||
b = b[vlen:]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEBUG ONLY: n.dump()
|
// DEBUG ONLY: n.dump()
|
||||||
|
@ -247,7 +248,7 @@ func (n *node) write(p *page) {
|
||||||
|
|
||||||
// split breaks up a node into multiple smaller nodes, if appropriate.
|
// split breaks up a node into multiple smaller nodes, if appropriate.
|
||||||
// This should only be called from the spill() function.
|
// This should only be called from the spill() function.
|
||||||
func (n *node) split(pageSize int) []*node {
|
func (n *node) split(pageSize uintptr) []*node {
|
||||||
var nodes []*node
|
var nodes []*node
|
||||||
|
|
||||||
node := n
|
node := n
|
||||||
|
@ -270,7 +271,7 @@ func (n *node) split(pageSize int) []*node {
|
||||||
|
|
||||||
// splitTwo breaks up a node into two smaller nodes, if appropriate.
|
// splitTwo breaks up a node into two smaller nodes, if appropriate.
|
||||||
// This should only be called from the split() function.
|
// This should only be called from the split() function.
|
||||||
func (n *node) splitTwo(pageSize int) (*node, *node) {
|
func (n *node) splitTwo(pageSize uintptr) (*node, *node) {
|
||||||
// Ignore the split if the page doesn't have at least enough nodes for
|
// Ignore the split if the page doesn't have at least enough nodes for
|
||||||
// two pages or if the nodes can fit in a single page.
|
// two pages or if the nodes can fit in a single page.
|
||||||
if len(n.inodes) <= (minKeysPerPage*2) || n.sizeLessThan(pageSize) {
|
if len(n.inodes) <= (minKeysPerPage*2) || n.sizeLessThan(pageSize) {
|
||||||
|
@ -312,18 +313,18 @@ func (n *node) splitTwo(pageSize int) (*node, *node) {
|
||||||
// splitIndex finds the position where a page will fill a given threshold.
|
// splitIndex finds the position where a page will fill a given threshold.
|
||||||
// It returns the index as well as the size of the first page.
|
// It returns the index as well as the size of the first page.
|
||||||
// This is only be called from split().
|
// This is only be called from split().
|
||||||
func (n *node) splitIndex(threshold int) (index, sz int) {
|
func (n *node) splitIndex(threshold int) (index, sz uintptr) {
|
||||||
sz = pageHeaderSize
|
sz = pageHeaderSize
|
||||||
|
|
||||||
// Loop until we only have the minimum number of keys required for the second page.
|
// Loop until we only have the minimum number of keys required for the second page.
|
||||||
for i := 0; i < len(n.inodes)-minKeysPerPage; i++ {
|
for i := 0; i < len(n.inodes)-minKeysPerPage; i++ {
|
||||||
index = i
|
index = uintptr(i)
|
||||||
inode := n.inodes[i]
|
inode := n.inodes[i]
|
||||||
elsize := n.pageElementSize() + len(inode.key) + len(inode.value)
|
elsize := n.pageElementSize() + uintptr(len(inode.key)) + uintptr(len(inode.value))
|
||||||
|
|
||||||
// If we have at least the minimum number of keys and adding another
|
// If we have at least the minimum number of keys and adding another
|
||||||
// node would put us over the threshold then exit and return.
|
// node would put us over the threshold then exit and return.
|
||||||
if i >= minKeysPerPage && sz+elsize > threshold {
|
if index >= minKeysPerPage && sz+elsize > uintptr(threshold) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,7 +357,7 @@ func (n *node) spill() error {
|
||||||
n.children = nil
|
n.children = nil
|
||||||
|
|
||||||
// Split nodes into appropriate sizes. The first node will always be n.
|
// Split nodes into appropriate sizes. The first node will always be n.
|
||||||
var nodes = n.split(tx.db.pageSize)
|
var nodes = n.split(uintptr(tx.db.pageSize))
|
||||||
for _, node := range nodes {
|
for _, node := range nodes {
|
||||||
// Add node's page to the freelist if it's not new.
|
// Add node's page to the freelist if it's not new.
|
||||||
if node.pgid > 0 {
|
if node.pgid > 0 {
|
||||||
|
@ -589,7 +590,9 @@ type nodes []*node
|
||||||
|
|
||||||
func (s nodes) Len() int { return len(s) }
|
func (s nodes) Len() int { return len(s) }
|
||||||
func (s nodes) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
func (s nodes) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||||
func (s nodes) Less(i, j int) bool { return bytes.Compare(s[i].inodes[0].key, s[j].inodes[0].key) == -1 }
|
func (s nodes) Less(i, j int) bool {
|
||||||
|
return bytes.Compare(s[i].inodes[0].key, s[j].inodes[0].key) == -1
|
||||||
|
}
|
||||||
|
|
||||||
// inode represents an internal node inside of a node.
|
// inode represents an internal node inside of a node.
|
||||||
// It can be used to point to elements in a page or point
|
// It can be used to point to elements in a page or point
|
||||||
|
|
|
@ -3,16 +3,17 @@ package bbolt
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
const pageHeaderSize = int(unsafe.Offsetof(((*page)(nil)).ptr))
|
const pageHeaderSize = unsafe.Sizeof(page{})
|
||||||
|
|
||||||
const minKeysPerPage = 2
|
const minKeysPerPage = 2
|
||||||
|
|
||||||
const branchPageElementSize = int(unsafe.Sizeof(branchPageElement{}))
|
const branchPageElementSize = unsafe.Sizeof(branchPageElement{})
|
||||||
const leafPageElementSize = int(unsafe.Sizeof(leafPageElement{}))
|
const leafPageElementSize = unsafe.Sizeof(leafPageElement{})
|
||||||
|
|
||||||
const (
|
const (
|
||||||
branchPageFlag = 0x01
|
branchPageFlag = 0x01
|
||||||
|
@ -32,7 +33,6 @@ type page struct {
|
||||||
flags uint16
|
flags uint16
|
||||||
count uint16
|
count uint16
|
||||||
overflow uint32
|
overflow uint32
|
||||||
ptr uintptr
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// typ returns a human readable page type string used for debugging.
|
// typ returns a human readable page type string used for debugging.
|
||||||
|
@ -51,13 +51,13 @@ func (p *page) typ() string {
|
||||||
|
|
||||||
// meta returns a pointer to the metadata section of the page.
|
// meta returns a pointer to the metadata section of the page.
|
||||||
func (p *page) meta() *meta {
|
func (p *page) meta() *meta {
|
||||||
return (*meta)(unsafe.Pointer(&p.ptr))
|
return (*meta)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p)))
|
||||||
}
|
}
|
||||||
|
|
||||||
// leafPageElement retrieves the leaf node by index
|
// leafPageElement retrieves the leaf node by index
|
||||||
func (p *page) leafPageElement(index uint16) *leafPageElement {
|
func (p *page) leafPageElement(index uint16) *leafPageElement {
|
||||||
n := &((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[index]
|
off := uintptr(index) * unsafe.Sizeof(leafPageElement{})
|
||||||
return n
|
return (*leafPageElement)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p) + off))
|
||||||
}
|
}
|
||||||
|
|
||||||
// leafPageElements retrieves a list of leaf nodes.
|
// leafPageElements retrieves a list of leaf nodes.
|
||||||
|
@ -65,12 +65,17 @@ func (p *page) leafPageElements() []leafPageElement {
|
||||||
if p.count == 0 {
|
if p.count == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return ((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[:]
|
return *(*[]leafPageElement)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
|
Data: uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p),
|
||||||
|
Len: int(p.count),
|
||||||
|
Cap: int(p.count),
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// branchPageElement retrieves the branch node by index
|
// branchPageElement retrieves the branch node by index
|
||||||
func (p *page) branchPageElement(index uint16) *branchPageElement {
|
func (p *page) branchPageElement(index uint16) *branchPageElement {
|
||||||
return &((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[index]
|
off := uintptr(index) * unsafe.Sizeof(branchPageElement{})
|
||||||
|
return (*branchPageElement)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p) + off))
|
||||||
}
|
}
|
||||||
|
|
||||||
// branchPageElements retrieves a list of branch nodes.
|
// branchPageElements retrieves a list of branch nodes.
|
||||||
|
@ -78,12 +83,20 @@ func (p *page) branchPageElements() []branchPageElement {
|
||||||
if p.count == 0 {
|
if p.count == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return ((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[:]
|
return *(*[]branchPageElement)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
|
Data: uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p),
|
||||||
|
Len: int(p.count),
|
||||||
|
Cap: int(p.count),
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// dump writes n bytes of the page to STDERR as hex output.
|
// dump writes n bytes of the page to STDERR as hex output.
|
||||||
func (p *page) hexdump(n int) {
|
func (p *page) hexdump(n int) {
|
||||||
buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:n]
|
buf := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
|
Data: uintptr(unsafe.Pointer(p)),
|
||||||
|
Len: n,
|
||||||
|
Cap: n,
|
||||||
|
}))
|
||||||
fmt.Fprintf(os.Stderr, "%x\n", buf)
|
fmt.Fprintf(os.Stderr, "%x\n", buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,8 +115,11 @@ type branchPageElement struct {
|
||||||
|
|
||||||
// key returns a byte slice of the node key.
|
// key returns a byte slice of the node key.
|
||||||
func (n *branchPageElement) key() []byte {
|
func (n *branchPageElement) key() []byte {
|
||||||
buf := (*[maxAllocSize]byte)(unsafe.Pointer(n))
|
return *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize]
|
Data: uintptr(unsafe.Pointer(n)) + uintptr(n.pos),
|
||||||
|
Len: int(n.ksize),
|
||||||
|
Cap: int(n.ksize),
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// leafPageElement represents a node on a leaf page.
|
// leafPageElement represents a node on a leaf page.
|
||||||
|
@ -116,14 +132,20 @@ type leafPageElement struct {
|
||||||
|
|
||||||
// key returns a byte slice of the node key.
|
// key returns a byte slice of the node key.
|
||||||
func (n *leafPageElement) key() []byte {
|
func (n *leafPageElement) key() []byte {
|
||||||
buf := (*[maxAllocSize]byte)(unsafe.Pointer(n))
|
return *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize:n.ksize]
|
Data: uintptr(unsafe.Pointer(n)) + uintptr(n.pos),
|
||||||
|
Len: int(n.ksize),
|
||||||
|
Cap: int(n.ksize),
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// value returns a byte slice of the node value.
|
// value returns a byte slice of the node value.
|
||||||
func (n *leafPageElement) value() []byte {
|
func (n *leafPageElement) value() []byte {
|
||||||
buf := (*[maxAllocSize]byte)(unsafe.Pointer(n))
|
return *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos+n.ksize]))[:n.vsize:n.vsize]
|
Data: uintptr(unsafe.Pointer(n)) + uintptr(n.pos) + uintptr(n.ksize),
|
||||||
|
Len: int(n.vsize),
|
||||||
|
Cap: int(n.vsize),
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// PageInfo represents human readable information about a page.
|
// PageInfo represents human readable information about a page.
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -527,7 +528,7 @@ func (tx *Tx) write() error {
|
||||||
offset := int64(p.id) * int64(tx.db.pageSize)
|
offset := int64(p.id) * int64(tx.db.pageSize)
|
||||||
|
|
||||||
// Write out page in "max allocation" sized chunks.
|
// Write out page in "max allocation" sized chunks.
|
||||||
ptr := (*[maxAllocSize]byte)(unsafe.Pointer(p))
|
ptr := uintptr(unsafe.Pointer(p))
|
||||||
for {
|
for {
|
||||||
// Limit our write to our max allocation size.
|
// Limit our write to our max allocation size.
|
||||||
sz := size
|
sz := size
|
||||||
|
@ -536,7 +537,11 @@ func (tx *Tx) write() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write chunk to disk.
|
// Write chunk to disk.
|
||||||
buf := ptr[:sz]
|
buf := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
|
Data: ptr,
|
||||||
|
Len: sz,
|
||||||
|
Cap: sz,
|
||||||
|
}))
|
||||||
if _, err := tx.db.ops.writeAt(buf, offset); err != nil {
|
if _, err := tx.db.ops.writeAt(buf, offset); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -552,7 +557,7 @@ func (tx *Tx) write() error {
|
||||||
|
|
||||||
// Otherwise move offset forward and move pointer to next chunk.
|
// Otherwise move offset forward and move pointer to next chunk.
|
||||||
offset += int64(sz)
|
offset += int64(sz)
|
||||||
ptr = (*[maxAllocSize]byte)(unsafe.Pointer(&ptr[sz]))
|
ptr += uintptr(sz)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,7 +576,11 @@ func (tx *Tx) write() error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:tx.db.pageSize]
|
buf := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
|
||||||
|
Data: uintptr(unsafe.Pointer(p)),
|
||||||
|
Len: tx.db.pageSize,
|
||||||
|
Cap: tx.db.pageSize,
|
||||||
|
}))
|
||||||
|
|
||||||
// See https://go.googlesource.com/go/+/f03c9202c43e0abb130669852082117ca50aa9b1
|
// See https://go.googlesource.com/go/+/f03c9202c43e0abb130669852082117ca50aa9b1
|
||||||
for i := range buf {
|
for i := range buf {
|
||||||
|
|
|
@ -250,11 +250,16 @@ func (b *Bool) Swap(new bool) bool {
|
||||||
|
|
||||||
// Toggle atomically negates the Boolean and returns the previous value.
|
// Toggle atomically negates the Boolean and returns the previous value.
|
||||||
func (b *Bool) Toggle() bool {
|
func (b *Bool) Toggle() bool {
|
||||||
return truthy(atomic.AddUint32(&b.v, 1) - 1)
|
for {
|
||||||
|
old := b.Load()
|
||||||
|
if b.CAS(old, !old) {
|
||||||
|
return old
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func truthy(n uint32) bool {
|
func truthy(n uint32) bool {
|
||||||
return n&1 == 1
|
return n == 1
|
||||||
}
|
}
|
||||||
|
|
||||||
func boolToInt(b bool) uint32 {
|
func boolToInt(b bool) uint32 {
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
// Copyright (c) 2016 Uber Technologies, Inc.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
package atomic
|
||||||
|
|
||||||
|
// Error is an atomic type-safe wrapper around Value for errors
|
||||||
|
type Error struct{ v Value }
|
||||||
|
|
||||||
|
// errorHolder is non-nil holder for error object.
|
||||||
|
// atomic.Value panics on saving nil object, so err object needs to be
|
||||||
|
// wrapped with valid object first.
|
||||||
|
type errorHolder struct{ err error }
|
||||||
|
|
||||||
|
// NewError creates new atomic error object
|
||||||
|
func NewError(err error) *Error {
|
||||||
|
e := &Error{}
|
||||||
|
if err != nil {
|
||||||
|
e.Store(err)
|
||||||
|
}
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load atomically loads the wrapped error
|
||||||
|
func (e *Error) Load() error {
|
||||||
|
v := e.v.Load()
|
||||||
|
if v == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
eh := v.(errorHolder)
|
||||||
|
return eh.err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store atomically stores error.
|
||||||
|
// NOTE: a holder object is allocated on each Store call.
|
||||||
|
func (e *Error) Store(err error) {
|
||||||
|
e.v.Store(errorHolder{err: err})
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) 2017 Uber Technologies, Inc.
|
// Copyright (c) 2019 Uber Technologies, Inc.
|
||||||
//
|
//
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
// If only two errors are being combined, the Append function may be used
|
// If only two errors are being combined, the Append function may be used
|
||||||
// instead.
|
// instead.
|
||||||
//
|
//
|
||||||
// err = multierr.Combine(reader.Close(), writer.Close())
|
// err = multierr.Append(reader.Close(), writer.Close())
|
||||||
//
|
//
|
||||||
// This makes it possible to record resource cleanup failures from deferred
|
// This makes it possible to record resource cleanup failures from deferred
|
||||||
// blocks with the help of named return values.
|
// blocks with the help of named return values.
|
||||||
|
@ -99,8 +99,6 @@ var (
|
||||||
// Separator for single-line error messages.
|
// Separator for single-line error messages.
|
||||||
_singlelineSeparator = []byte("; ")
|
_singlelineSeparator = []byte("; ")
|
||||||
|
|
||||||
_newline = []byte("\n")
|
|
||||||
|
|
||||||
// Prefix for multi-line messages
|
// Prefix for multi-line messages
|
||||||
_multilinePrefix = []byte("the following errors occurred:")
|
_multilinePrefix = []byte("the following errors occurred:")
|
||||||
|
|
||||||
|
@ -132,7 +130,7 @@ type errorGroup interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Errors returns a slice containing zero or more errors that the supplied
|
// Errors returns a slice containing zero or more errors that the supplied
|
||||||
// error is composed of. If the error is nil, the returned slice is empty.
|
// error is composed of. If the error is nil, a nil slice is returned.
|
||||||
//
|
//
|
||||||
// err := multierr.Append(r.Close(), w.Close())
|
// err := multierr.Append(r.Close(), w.Close())
|
||||||
// errors := multierr.Errors(err)
|
// errors := multierr.Errors(err)
|
||||||
|
@ -399,3 +397,53 @@ func Append(left error, right error) error {
|
||||||
errors := [2]error{left, right}
|
errors := [2]error{left, right}
|
||||||
return fromSlice(errors[0:])
|
return fromSlice(errors[0:])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AppendInto appends an error into the destination of an error pointer and
|
||||||
|
// returns whether the error being appended was non-nil.
|
||||||
|
//
|
||||||
|
// var err error
|
||||||
|
// multierr.AppendInto(&err, r.Close())
|
||||||
|
// multierr.AppendInto(&err, w.Close())
|
||||||
|
//
|
||||||
|
// The above is equivalent to,
|
||||||
|
//
|
||||||
|
// err := multierr.Append(r.Close(), w.Close())
|
||||||
|
//
|
||||||
|
// As AppendInto reports whether the provided error was non-nil, it may be
|
||||||
|
// used to build a multierr error in a loop more ergonomically. For example:
|
||||||
|
//
|
||||||
|
// var err error
|
||||||
|
// for line := range lines {
|
||||||
|
// var item Item
|
||||||
|
// if multierr.AppendInto(&err, parse(line, &item)) {
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// items = append(items, item)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Compare this with a verison that relies solely on Append:
|
||||||
|
//
|
||||||
|
// var err error
|
||||||
|
// for line := range lines {
|
||||||
|
// var item Item
|
||||||
|
// if parseErr := parse(line, &item); parseErr != nil {
|
||||||
|
// err = multierr.Append(err, parseErr)
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// items = append(items, item)
|
||||||
|
// }
|
||||||
|
func AppendInto(into *error, err error) (errored bool) {
|
||||||
|
if into == nil {
|
||||||
|
// We panic if 'into' is nil. This is not documented above
|
||||||
|
// because suggesting that the pointer must be non-nil may
|
||||||
|
// confuse users into thinking that the error that it points
|
||||||
|
// to must be non-nil.
|
||||||
|
panic("misuse of multierr.AppendInto: into pointer must not be nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
*into = Append(*into, err)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
// Copyright (c) 2019 Uber Technologies, Inc.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
// +build go1.13
|
||||||
|
|
||||||
|
package multierr
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
// As attempts to find the first error in the error list that matches the type
|
||||||
|
// of the value that target points to.
|
||||||
|
//
|
||||||
|
// This function allows errors.As to traverse the values stored on the
|
||||||
|
// multierr error.
|
||||||
|
func (merr *multiError) As(target interface{}) bool {
|
||||||
|
for _, err := range merr.Errors() {
|
||||||
|
if errors.As(err, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is attempts to match the provided error against errors in the error list.
|
||||||
|
//
|
||||||
|
// This function allows errors.Is to traverse the values stored on the
|
||||||
|
// multierr error.
|
||||||
|
func (merr *multiError) Is(target error) bool {
|
||||||
|
for _, err := range merr.Errors() {
|
||||||
|
if errors.Is(err, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
|
@ -23,7 +23,10 @@
|
||||||
// package's zero-allocation formatters.
|
// package's zero-allocation formatters.
|
||||||
package buffer // import "go.uber.org/zap/buffer"
|
package buffer // import "go.uber.org/zap/buffer"
|
||||||
|
|
||||||
import "strconv"
|
import (
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
const _size = 1024 // by default, create 1 KiB buffers
|
const _size = 1024 // by default, create 1 KiB buffers
|
||||||
|
|
||||||
|
@ -49,6 +52,11 @@ func (b *Buffer) AppendInt(i int64) {
|
||||||
b.bs = strconv.AppendInt(b.bs, i, 10)
|
b.bs = strconv.AppendInt(b.bs, i, 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AppendTime appends the time formatted using the specified layout.
|
||||||
|
func (b *Buffer) AppendTime(t time.Time, layout string) {
|
||||||
|
b.bs = t.AppendFormat(b.bs, layout)
|
||||||
|
}
|
||||||
|
|
||||||
// AppendUint appends an unsigned integer to the underlying buffer (assuming
|
// AppendUint appends an unsigned integer to the underlying buffer (assuming
|
||||||
// base 10).
|
// base 10).
|
||||||
func (b *Buffer) AppendUint(i uint64) {
|
func (b *Buffer) AppendUint(i uint64) {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
package zap
|
package zap
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -174,6 +175,10 @@ func (cfg Config) Build(opts ...Option) (*Logger, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cfg.Level == (AtomicLevel{}) {
|
||||||
|
return nil, fmt.Errorf("missing Level")
|
||||||
|
}
|
||||||
|
|
||||||
log := New(
|
log := New(
|
||||||
zapcore.NewCore(enc, sink, cfg.Level),
|
zapcore.NewCore(enc, sink, cfg.Level),
|
||||||
cfg.buildOptions(errSink)...,
|
cfg.buildOptions(errSink)...,
|
||||||
|
|
|
@ -62,6 +62,10 @@ func RegisterEncoder(name string, constructor func(zapcore.EncoderConfig) (zapco
|
||||||
}
|
}
|
||||||
|
|
||||||
func newEncoder(name string, encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) {
|
func newEncoder(name string, encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) {
|
||||||
|
if encoderConfig.TimeKey != "" && encoderConfig.EncodeTime == nil {
|
||||||
|
return nil, fmt.Errorf("missing EncodeTime in EncoderConfig")
|
||||||
|
}
|
||||||
|
|
||||||
_encoderMutex.RLock()
|
_encoderMutex.RLock()
|
||||||
defer _encoderMutex.RUnlock()
|
defer _encoderMutex.RUnlock()
|
||||||
if name == "" {
|
if name == "" {
|
||||||
|
|
|
@ -38,6 +38,12 @@ func Skip() Field {
|
||||||
return Field{Type: zapcore.SkipType}
|
return Field{Type: zapcore.SkipType}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nilField returns a field which will marshal explicitly as nil. See motivation
|
||||||
|
// in https://github.com/uber-go/zap/issues/753 . If we ever make breaking
|
||||||
|
// changes and add zapcore.NilType and zapcore.ObjectEncoder.AddNil, the
|
||||||
|
// implementation here should be changed to reflect that.
|
||||||
|
func nilField(key string) Field { return Reflect(key, nil) }
|
||||||
|
|
||||||
// Binary constructs a field that carries an opaque binary blob.
|
// Binary constructs a field that carries an opaque binary blob.
|
||||||
//
|
//
|
||||||
// Binary data is serialized in an encoding-appropriate format. For example,
|
// Binary data is serialized in an encoding-appropriate format. For example,
|
||||||
|
@ -56,6 +62,15 @@ func Bool(key string, val bool) Field {
|
||||||
return Field{Key: key, Type: zapcore.BoolType, Integer: ival}
|
return Field{Key: key, Type: zapcore.BoolType, Integer: ival}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Boolp constructs a field that carries a *bool. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Boolp(key string, val *bool) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Bool(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// ByteString constructs a field that carries UTF-8 encoded text as a []byte.
|
// ByteString constructs a field that carries UTF-8 encoded text as a []byte.
|
||||||
// To log opaque binary blobs (which aren't necessarily valid UTF-8), use
|
// To log opaque binary blobs (which aren't necessarily valid UTF-8), use
|
||||||
// Binary.
|
// Binary.
|
||||||
|
@ -70,6 +85,15 @@ func Complex128(key string, val complex128) Field {
|
||||||
return Field{Key: key, Type: zapcore.Complex128Type, Interface: val}
|
return Field{Key: key, Type: zapcore.Complex128Type, Interface: val}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Complex128p constructs a field that carries a *complex128. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Complex128p(key string, val *complex128) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Complex128(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Complex64 constructs a field that carries a complex number. Unlike most
|
// Complex64 constructs a field that carries a complex number. Unlike most
|
||||||
// numeric fields, this costs an allocation (to convert the complex64 to
|
// numeric fields, this costs an allocation (to convert the complex64 to
|
||||||
// interface{}).
|
// interface{}).
|
||||||
|
@ -77,6 +101,15 @@ func Complex64(key string, val complex64) Field {
|
||||||
return Field{Key: key, Type: zapcore.Complex64Type, Interface: val}
|
return Field{Key: key, Type: zapcore.Complex64Type, Interface: val}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Complex64p constructs a field that carries a *complex64. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Complex64p(key string, val *complex64) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Complex64(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Float64 constructs a field that carries a float64. The way the
|
// Float64 constructs a field that carries a float64. The way the
|
||||||
// floating-point value is represented is encoder-dependent, so marshaling is
|
// floating-point value is represented is encoder-dependent, so marshaling is
|
||||||
// necessarily lazy.
|
// necessarily lazy.
|
||||||
|
@ -84,6 +117,15 @@ func Float64(key string, val float64) Field {
|
||||||
return Field{Key: key, Type: zapcore.Float64Type, Integer: int64(math.Float64bits(val))}
|
return Field{Key: key, Type: zapcore.Float64Type, Integer: int64(math.Float64bits(val))}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Float64p constructs a field that carries a *float64. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Float64p(key string, val *float64) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Float64(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Float32 constructs a field that carries a float32. The way the
|
// Float32 constructs a field that carries a float32. The way the
|
||||||
// floating-point value is represented is encoder-dependent, so marshaling is
|
// floating-point value is represented is encoder-dependent, so marshaling is
|
||||||
// necessarily lazy.
|
// necessarily lazy.
|
||||||
|
@ -91,66 +133,183 @@ func Float32(key string, val float32) Field {
|
||||||
return Field{Key: key, Type: zapcore.Float32Type, Integer: int64(math.Float32bits(val))}
|
return Field{Key: key, Type: zapcore.Float32Type, Integer: int64(math.Float32bits(val))}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Float32p constructs a field that carries a *float32. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Float32p(key string, val *float32) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Float32(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Int constructs a field with the given key and value.
|
// Int constructs a field with the given key and value.
|
||||||
func Int(key string, val int) Field {
|
func Int(key string, val int) Field {
|
||||||
return Int64(key, int64(val))
|
return Int64(key, int64(val))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Intp constructs a field that carries a *int. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Intp(key string, val *int) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Int(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Int64 constructs a field with the given key and value.
|
// Int64 constructs a field with the given key and value.
|
||||||
func Int64(key string, val int64) Field {
|
func Int64(key string, val int64) Field {
|
||||||
return Field{Key: key, Type: zapcore.Int64Type, Integer: val}
|
return Field{Key: key, Type: zapcore.Int64Type, Integer: val}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Int64p constructs a field that carries a *int64. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Int64p(key string, val *int64) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Int64(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Int32 constructs a field with the given key and value.
|
// Int32 constructs a field with the given key and value.
|
||||||
func Int32(key string, val int32) Field {
|
func Int32(key string, val int32) Field {
|
||||||
return Field{Key: key, Type: zapcore.Int32Type, Integer: int64(val)}
|
return Field{Key: key, Type: zapcore.Int32Type, Integer: int64(val)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Int32p constructs a field that carries a *int32. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Int32p(key string, val *int32) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Int32(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Int16 constructs a field with the given key and value.
|
// Int16 constructs a field with the given key and value.
|
||||||
func Int16(key string, val int16) Field {
|
func Int16(key string, val int16) Field {
|
||||||
return Field{Key: key, Type: zapcore.Int16Type, Integer: int64(val)}
|
return Field{Key: key, Type: zapcore.Int16Type, Integer: int64(val)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Int16p constructs a field that carries a *int16. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Int16p(key string, val *int16) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Int16(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Int8 constructs a field with the given key and value.
|
// Int8 constructs a field with the given key and value.
|
||||||
func Int8(key string, val int8) Field {
|
func Int8(key string, val int8) Field {
|
||||||
return Field{Key: key, Type: zapcore.Int8Type, Integer: int64(val)}
|
return Field{Key: key, Type: zapcore.Int8Type, Integer: int64(val)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Int8p constructs a field that carries a *int8. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Int8p(key string, val *int8) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Int8(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// String constructs a field with the given key and value.
|
// String constructs a field with the given key and value.
|
||||||
func String(key string, val string) Field {
|
func String(key string, val string) Field {
|
||||||
return Field{Key: key, Type: zapcore.StringType, String: val}
|
return Field{Key: key, Type: zapcore.StringType, String: val}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stringp constructs a field that carries a *string. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Stringp(key string, val *string) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return String(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Uint constructs a field with the given key and value.
|
// Uint constructs a field with the given key and value.
|
||||||
func Uint(key string, val uint) Field {
|
func Uint(key string, val uint) Field {
|
||||||
return Uint64(key, uint64(val))
|
return Uint64(key, uint64(val))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Uintp constructs a field that carries a *uint. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Uintp(key string, val *uint) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Uint(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Uint64 constructs a field with the given key and value.
|
// Uint64 constructs a field with the given key and value.
|
||||||
func Uint64(key string, val uint64) Field {
|
func Uint64(key string, val uint64) Field {
|
||||||
return Field{Key: key, Type: zapcore.Uint64Type, Integer: int64(val)}
|
return Field{Key: key, Type: zapcore.Uint64Type, Integer: int64(val)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Uint64p constructs a field that carries a *uint64. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Uint64p(key string, val *uint64) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Uint64(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Uint32 constructs a field with the given key and value.
|
// Uint32 constructs a field with the given key and value.
|
||||||
func Uint32(key string, val uint32) Field {
|
func Uint32(key string, val uint32) Field {
|
||||||
return Field{Key: key, Type: zapcore.Uint32Type, Integer: int64(val)}
|
return Field{Key: key, Type: zapcore.Uint32Type, Integer: int64(val)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Uint32p constructs a field that carries a *uint32. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Uint32p(key string, val *uint32) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Uint32(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Uint16 constructs a field with the given key and value.
|
// Uint16 constructs a field with the given key and value.
|
||||||
func Uint16(key string, val uint16) Field {
|
func Uint16(key string, val uint16) Field {
|
||||||
return Field{Key: key, Type: zapcore.Uint16Type, Integer: int64(val)}
|
return Field{Key: key, Type: zapcore.Uint16Type, Integer: int64(val)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Uint16p constructs a field that carries a *uint16. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Uint16p(key string, val *uint16) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Uint16(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Uint8 constructs a field with the given key and value.
|
// Uint8 constructs a field with the given key and value.
|
||||||
func Uint8(key string, val uint8) Field {
|
func Uint8(key string, val uint8) Field {
|
||||||
return Field{Key: key, Type: zapcore.Uint8Type, Integer: int64(val)}
|
return Field{Key: key, Type: zapcore.Uint8Type, Integer: int64(val)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Uint8p constructs a field that carries a *uint8. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Uint8p(key string, val *uint8) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Uint8(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Uintptr constructs a field with the given key and value.
|
// Uintptr constructs a field with the given key and value.
|
||||||
func Uintptr(key string, val uintptr) Field {
|
func Uintptr(key string, val uintptr) Field {
|
||||||
return Field{Key: key, Type: zapcore.UintptrType, Integer: int64(val)}
|
return Field{Key: key, Type: zapcore.UintptrType, Integer: int64(val)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Uintptrp constructs a field that carries a *uintptr. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Uintptrp(key string, val *uintptr) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Uintptr(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Reflect constructs a field with the given key and an arbitrary object. It uses
|
// Reflect constructs a field with the given key and an arbitrary object. It uses
|
||||||
// an encoding-appropriate, reflection-based function to lazily serialize nearly
|
// an encoding-appropriate, reflection-based function to lazily serialize nearly
|
||||||
// any object into the logging context, but it's relatively slow and
|
// any object into the logging context, but it's relatively slow and
|
||||||
|
@ -183,6 +342,15 @@ func Time(key string, val time.Time) Field {
|
||||||
return Field{Key: key, Type: zapcore.TimeType, Integer: val.UnixNano(), Interface: val.Location()}
|
return Field{Key: key, Type: zapcore.TimeType, Integer: val.UnixNano(), Interface: val.Location()}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Timep constructs a field that carries a *time.Time. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Timep(key string, val *time.Time) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Time(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Stack constructs a field that stores a stacktrace of the current goroutine
|
// Stack constructs a field that stores a stacktrace of the current goroutine
|
||||||
// under provided key. Keep in mind that taking a stacktrace is eager and
|
// under provided key. Keep in mind that taking a stacktrace is eager and
|
||||||
// expensive (relatively speaking); this function both makes an allocation and
|
// expensive (relatively speaking); this function both makes an allocation and
|
||||||
|
@ -201,6 +369,15 @@ func Duration(key string, val time.Duration) Field {
|
||||||
return Field{Key: key, Type: zapcore.DurationType, Integer: int64(val)}
|
return Field{Key: key, Type: zapcore.DurationType, Integer: int64(val)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Durationp constructs a field that carries a *time.Duration. The returned Field will safely
|
||||||
|
// and explicitly represent `nil` when appropriate.
|
||||||
|
func Durationp(key string, val *time.Duration) Field {
|
||||||
|
if val == nil {
|
||||||
|
return nilField(key)
|
||||||
|
}
|
||||||
|
return Duration(key, *val)
|
||||||
|
}
|
||||||
|
|
||||||
// Object constructs a field with the given key and ObjectMarshaler. It
|
// Object constructs a field with the given key and ObjectMarshaler. It
|
||||||
// provides a flexible, but still type-safe and efficient, way to add map- or
|
// provides a flexible, but still type-safe and efficient, way to add map- or
|
||||||
// struct-like user-defined types to the logging context. The struct's
|
// struct-like user-defined types to the logging context. The struct's
|
||||||
|
@ -224,78 +401,116 @@ func Any(key string, value interface{}) Field {
|
||||||
return Array(key, val)
|
return Array(key, val)
|
||||||
case bool:
|
case bool:
|
||||||
return Bool(key, val)
|
return Bool(key, val)
|
||||||
|
case *bool:
|
||||||
|
return Boolp(key, val)
|
||||||
case []bool:
|
case []bool:
|
||||||
return Bools(key, val)
|
return Bools(key, val)
|
||||||
case complex128:
|
case complex128:
|
||||||
return Complex128(key, val)
|
return Complex128(key, val)
|
||||||
|
case *complex128:
|
||||||
|
return Complex128p(key, val)
|
||||||
case []complex128:
|
case []complex128:
|
||||||
return Complex128s(key, val)
|
return Complex128s(key, val)
|
||||||
case complex64:
|
case complex64:
|
||||||
return Complex64(key, val)
|
return Complex64(key, val)
|
||||||
|
case *complex64:
|
||||||
|
return Complex64p(key, val)
|
||||||
case []complex64:
|
case []complex64:
|
||||||
return Complex64s(key, val)
|
return Complex64s(key, val)
|
||||||
case float64:
|
case float64:
|
||||||
return Float64(key, val)
|
return Float64(key, val)
|
||||||
|
case *float64:
|
||||||
|
return Float64p(key, val)
|
||||||
case []float64:
|
case []float64:
|
||||||
return Float64s(key, val)
|
return Float64s(key, val)
|
||||||
case float32:
|
case float32:
|
||||||
return Float32(key, val)
|
return Float32(key, val)
|
||||||
|
case *float32:
|
||||||
|
return Float32p(key, val)
|
||||||
case []float32:
|
case []float32:
|
||||||
return Float32s(key, val)
|
return Float32s(key, val)
|
||||||
case int:
|
case int:
|
||||||
return Int(key, val)
|
return Int(key, val)
|
||||||
|
case *int:
|
||||||
|
return Intp(key, val)
|
||||||
case []int:
|
case []int:
|
||||||
return Ints(key, val)
|
return Ints(key, val)
|
||||||
case int64:
|
case int64:
|
||||||
return Int64(key, val)
|
return Int64(key, val)
|
||||||
|
case *int64:
|
||||||
|
return Int64p(key, val)
|
||||||
case []int64:
|
case []int64:
|
||||||
return Int64s(key, val)
|
return Int64s(key, val)
|
||||||
case int32:
|
case int32:
|
||||||
return Int32(key, val)
|
return Int32(key, val)
|
||||||
|
case *int32:
|
||||||
|
return Int32p(key, val)
|
||||||
case []int32:
|
case []int32:
|
||||||
return Int32s(key, val)
|
return Int32s(key, val)
|
||||||
case int16:
|
case int16:
|
||||||
return Int16(key, val)
|
return Int16(key, val)
|
||||||
|
case *int16:
|
||||||
|
return Int16p(key, val)
|
||||||
case []int16:
|
case []int16:
|
||||||
return Int16s(key, val)
|
return Int16s(key, val)
|
||||||
case int8:
|
case int8:
|
||||||
return Int8(key, val)
|
return Int8(key, val)
|
||||||
|
case *int8:
|
||||||
|
return Int8p(key, val)
|
||||||
case []int8:
|
case []int8:
|
||||||
return Int8s(key, val)
|
return Int8s(key, val)
|
||||||
case string:
|
case string:
|
||||||
return String(key, val)
|
return String(key, val)
|
||||||
|
case *string:
|
||||||
|
return Stringp(key, val)
|
||||||
case []string:
|
case []string:
|
||||||
return Strings(key, val)
|
return Strings(key, val)
|
||||||
case uint:
|
case uint:
|
||||||
return Uint(key, val)
|
return Uint(key, val)
|
||||||
|
case *uint:
|
||||||
|
return Uintp(key, val)
|
||||||
case []uint:
|
case []uint:
|
||||||
return Uints(key, val)
|
return Uints(key, val)
|
||||||
case uint64:
|
case uint64:
|
||||||
return Uint64(key, val)
|
return Uint64(key, val)
|
||||||
|
case *uint64:
|
||||||
|
return Uint64p(key, val)
|
||||||
case []uint64:
|
case []uint64:
|
||||||
return Uint64s(key, val)
|
return Uint64s(key, val)
|
||||||
case uint32:
|
case uint32:
|
||||||
return Uint32(key, val)
|
return Uint32(key, val)
|
||||||
|
case *uint32:
|
||||||
|
return Uint32p(key, val)
|
||||||
case []uint32:
|
case []uint32:
|
||||||
return Uint32s(key, val)
|
return Uint32s(key, val)
|
||||||
case uint16:
|
case uint16:
|
||||||
return Uint16(key, val)
|
return Uint16(key, val)
|
||||||
|
case *uint16:
|
||||||
|
return Uint16p(key, val)
|
||||||
case []uint16:
|
case []uint16:
|
||||||
return Uint16s(key, val)
|
return Uint16s(key, val)
|
||||||
case uint8:
|
case uint8:
|
||||||
return Uint8(key, val)
|
return Uint8(key, val)
|
||||||
|
case *uint8:
|
||||||
|
return Uint8p(key, val)
|
||||||
case []byte:
|
case []byte:
|
||||||
return Binary(key, val)
|
return Binary(key, val)
|
||||||
case uintptr:
|
case uintptr:
|
||||||
return Uintptr(key, val)
|
return Uintptr(key, val)
|
||||||
|
case *uintptr:
|
||||||
|
return Uintptrp(key, val)
|
||||||
case []uintptr:
|
case []uintptr:
|
||||||
return Uintptrs(key, val)
|
return Uintptrs(key, val)
|
||||||
case time.Time:
|
case time.Time:
|
||||||
return Time(key, val)
|
return Time(key, val)
|
||||||
|
case *time.Time:
|
||||||
|
return Timep(key, val)
|
||||||
case []time.Time:
|
case []time.Time:
|
||||||
return Times(key, val)
|
return Times(key, val)
|
||||||
case time.Duration:
|
case time.Duration:
|
||||||
return Duration(key, val)
|
return Duration(key, val)
|
||||||
|
case *time.Duration:
|
||||||
|
return Durationp(key, val)
|
||||||
case []time.Duration:
|
case []time.Duration:
|
||||||
return Durations(key, val)
|
return Durations(key, val)
|
||||||
case error:
|
case error:
|
||||||
|
|
|
@ -258,6 +258,12 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry {
|
||||||
// (e.g., Check, Info, Fatal).
|
// (e.g., Check, Info, Fatal).
|
||||||
const callerSkipOffset = 2
|
const callerSkipOffset = 2
|
||||||
|
|
||||||
|
// Check the level first to reduce the cost of disabled log calls.
|
||||||
|
// Since Panic and higher may exit, we skip the optimization for those levels.
|
||||||
|
if lvl < zapcore.DPanicLevel && !log.core.Enabled(lvl) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Create basic checked entry thru the core; this will be non-nil if the
|
// Create basic checked entry thru the core; this will be non-nil if the
|
||||||
// log message will actually be written somewhere.
|
// log message will actually be written somewhere.
|
||||||
ent := zapcore.Entry{
|
ent := zapcore.Entry{
|
||||||
|
|
|
@ -20,7 +20,11 @@
|
||||||
|
|
||||||
package zap
|
package zap
|
||||||
|
|
||||||
import "go.uber.org/zap/zapcore"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"go.uber.org/zap/zapcore"
|
||||||
|
)
|
||||||
|
|
||||||
// An Option configures a Logger.
|
// An Option configures a Logger.
|
||||||
type Option interface {
|
type Option interface {
|
||||||
|
@ -107,3 +111,16 @@ func AddStacktrace(lvl zapcore.LevelEnabler) Option {
|
||||||
log.addStack = lvl
|
log.addStack = lvl
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IncreaseLevel increase the level of the logger. It has no effect if
|
||||||
|
// the passed in level tries to decrease the level of the logger.
|
||||||
|
func IncreaseLevel(lvl zapcore.LevelEnabler) Option {
|
||||||
|
return optionFunc(func(log *Logger) {
|
||||||
|
core, err := zapcore.NewIncreaseLevelCore(log.core, lvl)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(log.errorOutput, "failed to IncreaseLevel: %v", err)
|
||||||
|
} else {
|
||||||
|
log.core = core
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -31,6 +31,9 @@ import (
|
||||||
// behavior.
|
// behavior.
|
||||||
const DefaultLineEnding = "\n"
|
const DefaultLineEnding = "\n"
|
||||||
|
|
||||||
|
// OmitKey defines the key to use when callers want to remove a key from log output.
|
||||||
|
const OmitKey = ""
|
||||||
|
|
||||||
// A LevelEncoder serializes a Level to a primitive type.
|
// A LevelEncoder serializes a Level to a primitive type.
|
||||||
type LevelEncoder func(Level, PrimitiveArrayEncoder)
|
type LevelEncoder func(Level, PrimitiveArrayEncoder)
|
||||||
|
|
||||||
|
@ -109,17 +112,58 @@ func EpochNanosTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
|
||||||
enc.AppendInt64(t.UnixNano())
|
enc.AppendInt64(t.UnixNano())
|
||||||
}
|
}
|
||||||
|
|
||||||
// ISO8601TimeEncoder serializes a time.Time to an ISO8601-formatted string
|
func encodeTimeLayout(t time.Time, layout string, enc PrimitiveArrayEncoder) {
|
||||||
// with millisecond precision.
|
type appendTimeEncoder interface {
|
||||||
func ISO8601TimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
|
AppendTimeLayout(time.Time, string)
|
||||||
enc.AppendString(t.Format("2006-01-02T15:04:05.000Z0700"))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalText unmarshals text to a TimeEncoder. "iso8601" and "ISO8601" are
|
if enc, ok := enc.(appendTimeEncoder); ok {
|
||||||
// unmarshaled to ISO8601TimeEncoder, "millis" is unmarshaled to
|
enc.AppendTimeLayout(t, layout)
|
||||||
// EpochMillisTimeEncoder, and anything else is unmarshaled to EpochTimeEncoder.
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
enc.AppendString(t.Format(layout))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ISO8601TimeEncoder serializes a time.Time to an ISO8601-formatted string
|
||||||
|
// with millisecond precision.
|
||||||
|
//
|
||||||
|
// If enc supports AppendTimeLayout(t time.Time,layout string), it's used
|
||||||
|
// instead of appending a pre-formatted string value.
|
||||||
|
func ISO8601TimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
|
||||||
|
encodeTimeLayout(t, "2006-01-02T15:04:05.000Z0700", enc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RFC3339TimeEncoder serializes a time.Time to an RFC3339-formatted string.
|
||||||
|
//
|
||||||
|
// If enc supports AppendTimeLayout(t time.Time,layout string), it's used
|
||||||
|
// instead of appending a pre-formatted string value.
|
||||||
|
func RFC3339TimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
|
||||||
|
encodeTimeLayout(t, time.RFC3339, enc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RFC3339NanoTimeEncoder serializes a time.Time to an RFC3339-formatted string
|
||||||
|
// with nanosecond precision.
|
||||||
|
//
|
||||||
|
// If enc supports AppendTimeLayout(t time.Time,layout string), it's used
|
||||||
|
// instead of appending a pre-formatted string value.
|
||||||
|
func RFC3339NanoTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) {
|
||||||
|
encodeTimeLayout(t, time.RFC3339Nano, enc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalText unmarshals text to a TimeEncoder.
|
||||||
|
// "rfc3339nano" and "RFC3339Nano" are unmarshaled to RFC3339NanoTimeEncoder.
|
||||||
|
// "rfc3339" and "RFC3339" are unmarshaled to RFC3339TimeEncoder.
|
||||||
|
// "iso8601" and "ISO8601" are unmarshaled to ISO8601TimeEncoder.
|
||||||
|
// "millis" is unmarshaled to EpochMillisTimeEncoder.
|
||||||
|
// "nanos" is unmarshaled to EpochNanosEncoder.
|
||||||
|
// Anything else is unmarshaled to EpochTimeEncoder.
|
||||||
func (e *TimeEncoder) UnmarshalText(text []byte) error {
|
func (e *TimeEncoder) UnmarshalText(text []byte) error {
|
||||||
switch string(text) {
|
switch string(text) {
|
||||||
|
case "rfc3339nano", "RFC3339Nano":
|
||||||
|
*e = RFC3339NanoTimeEncoder
|
||||||
|
case "rfc3339", "RFC3339":
|
||||||
|
*e = RFC3339TimeEncoder
|
||||||
case "iso8601", "ISO8601":
|
case "iso8601", "ISO8601":
|
||||||
*e = ISO8601TimeEncoder
|
*e = ISO8601TimeEncoder
|
||||||
case "millis":
|
case "millis":
|
||||||
|
@ -146,6 +190,12 @@ func NanosDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) {
|
||||||
enc.AppendInt64(int64(d))
|
enc.AppendInt64(int64(d))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MillisDurationEncoder serializes a time.Duration to an integer number of
|
||||||
|
// milliseconds elapsed.
|
||||||
|
func MillisDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) {
|
||||||
|
enc.AppendInt64(d.Nanoseconds() / 1e6)
|
||||||
|
}
|
||||||
|
|
||||||
// StringDurationEncoder serializes a time.Duration using its built-in String
|
// StringDurationEncoder serializes a time.Duration using its built-in String
|
||||||
// method.
|
// method.
|
||||||
func StringDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) {
|
func StringDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) {
|
||||||
|
@ -161,6 +211,8 @@ func (e *DurationEncoder) UnmarshalText(text []byte) error {
|
||||||
*e = StringDurationEncoder
|
*e = StringDurationEncoder
|
||||||
case "nanos":
|
case "nanos":
|
||||||
*e = NanosDurationEncoder
|
*e = NanosDurationEncoder
|
||||||
|
case "ms":
|
||||||
|
*e = MillisDurationEncoder
|
||||||
default:
|
default:
|
||||||
*e = SecondsDurationEncoder
|
*e = SecondsDurationEncoder
|
||||||
}
|
}
|
||||||
|
@ -272,8 +324,8 @@ type ObjectEncoder interface {
|
||||||
AddUint8(key string, value uint8)
|
AddUint8(key string, value uint8)
|
||||||
AddUintptr(key string, value uintptr)
|
AddUintptr(key string, value uintptr)
|
||||||
|
|
||||||
// AddReflected uses reflection to serialize arbitrary objects, so it's slow
|
// AddReflected uses reflection to serialize arbitrary objects, so it can be
|
||||||
// and allocation-heavy.
|
// slow and allocation-heavy.
|
||||||
AddReflected(key string, value interface{}) error
|
AddReflected(key string, value interface{}) error
|
||||||
// OpenNamespace opens an isolated namespace where all subsequent fields will
|
// OpenNamespace opens an isolated namespace where all subsequent fields will
|
||||||
// be added. Applications can use namespaces to prevent key collisions when
|
// be added. Applications can use namespaces to prevent key collisions when
|
||||||
|
@ -343,6 +395,7 @@ type Encoder interface {
|
||||||
Clone() Encoder
|
Clone() Encoder
|
||||||
|
|
||||||
// EncodeEntry encodes an entry and fields, along with any accumulated
|
// EncodeEntry encodes an entry and fields, along with any accumulated
|
||||||
// context, into a byte buffer and returns it.
|
// context, into a byte buffer and returns it. Any fields that are empty,
|
||||||
|
// including fields on the `Entry` type, should be omitted.
|
||||||
EncodeEntry(Entry, []Field) (*buffer.Buffer, error)
|
EncodeEntry(Entry, []Field) (*buffer.Buffer, error)
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,7 +136,8 @@ func (ec EntryCaller) TrimmedPath() string {
|
||||||
|
|
||||||
// An Entry represents a complete log message. The entry's structured context
|
// An Entry represents a complete log message. The entry's structured context
|
||||||
// is already serialized, but the log level, time, message, and call site
|
// is already serialized, but the log level, time, message, and call site
|
||||||
// information are available for inspection and modification.
|
// information are available for inspection and modification. Any fields left
|
||||||
|
// empty will be omitted when encoding.
|
||||||
//
|
//
|
||||||
// Entries are pooled, so any functions that accept them MUST be careful not to
|
// Entries are pooled, so any functions that accept them MUST be careful not to
|
||||||
// retain references to them.
|
// retain references to them.
|
||||||
|
|
|
@ -66,11 +66,6 @@ type errorGroup interface {
|
||||||
Errors() []error
|
Errors() []error
|
||||||
}
|
}
|
||||||
|
|
||||||
type causer interface {
|
|
||||||
// Provides access to the error that caused this error.
|
|
||||||
Cause() error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note that errArry and errArrayElem are very similar to the version
|
// Note that errArry and errArrayElem are very similar to the version
|
||||||
// implemented in the top-level error.go file. We can't re-use this because
|
// implemented in the top-level error.go file. We can't re-use this because
|
||||||
// that would require exporting errArray as part of the zapcore API.
|
// that would require exporting errArray as part of the zapcore API.
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
// Copyright (c) 2020 Uber Technologies, Inc.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in
|
||||||
|
// all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
package zapcore
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type levelFilterCore struct {
|
||||||
|
Core
|
||||||
|
|
||||||
|
level LevelEnabler
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewIncreaseLevelCore creates a core that can be used to increase the level of
|
||||||
|
// an existing Core. It cannot be used to decrease the logging level, as it acts
|
||||||
|
// as a filter before calling the underlying core. If level decreases the log level,
|
||||||
|
// an error is returned.
|
||||||
|
func NewIncreaseLevelCore(core Core, level LevelEnabler) (Core, error) {
|
||||||
|
for l := _maxLevel; l >= _minLevel; l-- {
|
||||||
|
if !core.Enabled(l) && level.Enabled(l) {
|
||||||
|
return nil, fmt.Errorf("invalid increase level, as level %q is allowed by increased level, but not by existing core", l)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &levelFilterCore{core, level}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *levelFilterCore) Enabled(lvl Level) bool {
|
||||||
|
return c.level.Enabled(lvl)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *levelFilterCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry {
|
||||||
|
if !c.Enabled(ent.Level) {
|
||||||
|
return ce
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Core.Check(ent, ce)
|
||||||
|
}
|
|
@ -145,15 +145,29 @@ func (enc *jsonEncoder) resetReflectBuf() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (enc *jsonEncoder) AddReflected(key string, obj interface{}) error {
|
var nullLiteralBytes = []byte("null")
|
||||||
|
|
||||||
|
// Only invoke the standard JSON encoder if there is actually something to
|
||||||
|
// encode; otherwise write JSON null literal directly.
|
||||||
|
func (enc *jsonEncoder) encodeReflected(obj interface{}) ([]byte, error) {
|
||||||
|
if obj == nil {
|
||||||
|
return nullLiteralBytes, nil
|
||||||
|
}
|
||||||
enc.resetReflectBuf()
|
enc.resetReflectBuf()
|
||||||
err := enc.reflectEnc.Encode(obj)
|
if err := enc.reflectEnc.Encode(obj); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
enc.reflectBuf.TrimNewline()
|
||||||
|
return enc.reflectBuf.Bytes(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (enc *jsonEncoder) AddReflected(key string, obj interface{}) error {
|
||||||
|
valueBytes, err := enc.encodeReflected(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
enc.reflectBuf.TrimNewline()
|
|
||||||
enc.addKey(key)
|
enc.addKey(key)
|
||||||
_, err = enc.buf.Write(enc.reflectBuf.Bytes())
|
_, err = enc.buf.Write(valueBytes)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,14 +250,12 @@ func (enc *jsonEncoder) AppendInt64(val int64) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (enc *jsonEncoder) AppendReflected(val interface{}) error {
|
func (enc *jsonEncoder) AppendReflected(val interface{}) error {
|
||||||
enc.resetReflectBuf()
|
valueBytes, err := enc.encodeReflected(val)
|
||||||
err := enc.reflectEnc.Encode(val)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
enc.reflectBuf.TrimNewline()
|
|
||||||
enc.addElementSeparator()
|
enc.addElementSeparator()
|
||||||
_, err = enc.buf.Write(enc.reflectBuf.Bytes())
|
_, err = enc.buf.Write(valueBytes)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,6 +266,13 @@ func (enc *jsonEncoder) AppendString(val string) {
|
||||||
enc.buf.AppendByte('"')
|
enc.buf.AppendByte('"')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (enc *jsonEncoder) AppendTimeLayout(time time.Time, layout string) {
|
||||||
|
enc.addElementSeparator()
|
||||||
|
enc.buf.AppendByte('"')
|
||||||
|
enc.buf.AppendTime(time, layout)
|
||||||
|
enc.buf.AppendByte('"')
|
||||||
|
}
|
||||||
|
|
||||||
func (enc *jsonEncoder) AppendTime(val time.Time) {
|
func (enc *jsonEncoder) AppendTime(val time.Time) {
|
||||||
cur := enc.buf.Len()
|
cur := enc.buf.Len()
|
||||||
enc.EncodeTime(val, enc)
|
enc.EncodeTime(val, enc)
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/bits"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -79,50 +80,7 @@ func (s *CPUSet) IsSet(cpu int) bool {
|
||||||
func (s *CPUSet) Count() int {
|
func (s *CPUSet) Count() int {
|
||||||
c := 0
|
c := 0
|
||||||
for _, b := range s {
|
for _, b := range s {
|
||||||
c += onesCount64(uint64(b))
|
c += bits.OnesCount64(uint64(b))
|
||||||
}
|
}
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
// onesCount64 is a copy of Go 1.9's math/bits.OnesCount64.
|
|
||||||
// Once this package can require Go 1.9, we can delete this
|
|
||||||
// and update the caller to use bits.OnesCount64.
|
|
||||||
func onesCount64(x uint64) int {
|
|
||||||
const m0 = 0x5555555555555555 // 01010101 ...
|
|
||||||
const m1 = 0x3333333333333333 // 00110011 ...
|
|
||||||
const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ...
|
|
||||||
|
|
||||||
// Unused in this function, but definitions preserved for
|
|
||||||
// documentation purposes:
|
|
||||||
//
|
|
||||||
// const m3 = 0x00ff00ff00ff00ff // etc.
|
|
||||||
// const m4 = 0x0000ffff0000ffff
|
|
||||||
//
|
|
||||||
// Implementation: Parallel summing of adjacent bits.
|
|
||||||
// See "Hacker's Delight", Chap. 5: Counting Bits.
|
|
||||||
// The following pattern shows the general approach:
|
|
||||||
//
|
|
||||||
// x = x>>1&(m0&m) + x&(m0&m)
|
|
||||||
// x = x>>2&(m1&m) + x&(m1&m)
|
|
||||||
// x = x>>4&(m2&m) + x&(m2&m)
|
|
||||||
// x = x>>8&(m3&m) + x&(m3&m)
|
|
||||||
// x = x>>16&(m4&m) + x&(m4&m)
|
|
||||||
// x = x>>32&(m5&m) + x&(m5&m)
|
|
||||||
// return int(x)
|
|
||||||
//
|
|
||||||
// Masking (& operations) can be left away when there's no
|
|
||||||
// danger that a field's sum will carry over into the next
|
|
||||||
// field: Since the result cannot be > 64, 8 bits is enough
|
|
||||||
// and we can ignore the masks for the shifts by 8 and up.
|
|
||||||
// Per "Hacker's Delight", the first line can be simplified
|
|
||||||
// more, but it saves at best one instruction, so we leave
|
|
||||||
// it alone for clarity.
|
|
||||||
const m = 1<<64 - 1
|
|
||||||
x = x>>1&(m0&m) + x&(m0&m)
|
|
||||||
x = x>>2&(m1&m) + x&(m1&m)
|
|
||||||
x = (x>>4 + x) & (m2 & m)
|
|
||||||
x += x >> 8
|
|
||||||
x += x >> 16
|
|
||||||
x += x >> 32
|
|
||||||
return int(x) & (1<<7 - 1)
|
|
||||||
}
|
|
||||||
|
|
|
@ -23,10 +23,6 @@ TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
||||||
MOV a1+8(FP), A0
|
MOV a1+8(FP), A0
|
||||||
MOV a2+16(FP), A1
|
MOV a2+16(FP), A1
|
||||||
MOV a3+24(FP), A2
|
MOV a3+24(FP), A2
|
||||||
MOV $0, A3
|
|
||||||
MOV $0, A4
|
|
||||||
MOV $0, A5
|
|
||||||
MOV $0, A6
|
|
||||||
MOV trap+0(FP), A7 // syscall entry
|
MOV trap+0(FP), A7 // syscall entry
|
||||||
ECALL
|
ECALL
|
||||||
MOV A0, r1+32(FP) // r1
|
MOV A0, r1+32(FP) // r1
|
||||||
|
@ -44,9 +40,6 @@ TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
||||||
MOV a1+8(FP), A0
|
MOV a1+8(FP), A0
|
||||||
MOV a2+16(FP), A1
|
MOV a2+16(FP), A1
|
||||||
MOV a3+24(FP), A2
|
MOV a3+24(FP), A2
|
||||||
MOV ZERO, A3
|
|
||||||
MOV ZERO, A4
|
|
||||||
MOV ZERO, A5
|
|
||||||
MOV trap+0(FP), A7 // syscall entry
|
MOV trap+0(FP), A7 // syscall entry
|
||||||
ECALL
|
ECALL
|
||||||
MOV A0, r1+32(FP)
|
MOV A0, r1+32(FP)
|
||||||
|
|
|
@ -23,6 +23,7 @@ const (
|
||||||
HCI_CHANNEL_USER = 1
|
HCI_CHANNEL_USER = 1
|
||||||
HCI_CHANNEL_MONITOR = 2
|
HCI_CHANNEL_MONITOR = 2
|
||||||
HCI_CHANNEL_CONTROL = 3
|
HCI_CHANNEL_CONTROL = 3
|
||||||
|
HCI_CHANNEL_LOGGING = 4
|
||||||
)
|
)
|
||||||
|
|
||||||
// Socketoption Level
|
// Socketoption Level
|
||||||
|
|
|
@ -9,12 +9,11 @@ package unix
|
||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux
|
// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux
|
||||||
// systems by flock_linux_32bit.go to be SYS_FCNTL64.
|
// systems by fcntl_linux_32bit.go to be SYS_FCNTL64.
|
||||||
var fcntl64Syscall uintptr = SYS_FCNTL
|
var fcntl64Syscall uintptr = SYS_FCNTL
|
||||||
|
|
||||||
// FcntlInt performs a fcntl syscall on fd with the provided command and argument.
|
func fcntl(fd int, cmd, arg int) (int, error) {
|
||||||
func FcntlInt(fd uintptr, cmd, arg int) (int, error) {
|
valptr, _, errno := Syscall(fcntl64Syscall, uintptr(fd), uintptr(cmd), uintptr(arg))
|
||||||
valptr, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(arg))
|
|
||||||
var err error
|
var err error
|
||||||
if errno != 0 {
|
if errno != 0 {
|
||||||
err = errno
|
err = errno
|
||||||
|
@ -22,6 +21,11 @@ func FcntlInt(fd uintptr, cmd, arg int) (int, error) {
|
||||||
return int(valptr), err
|
return int(valptr), err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FcntlInt performs a fcntl syscall on fd with the provided command and argument.
|
||||||
|
func FcntlInt(fd uintptr, cmd, arg int) (int, error) {
|
||||||
|
return fcntl(int(fd), cmd, arg)
|
||||||
|
}
|
||||||
|
|
||||||
// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.
|
// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.
|
||||||
func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error {
|
func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error {
|
||||||
_, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk)))
|
_, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk)))
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
// Set adds fd to the set fds.
|
||||||
|
func (fds *FdSet) Set(fd int) {
|
||||||
|
fds.Bits[fd/NFDBITS] |= (1 << (uintptr(fd) % NFDBITS))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear removes fd from the set fds.
|
||||||
|
func (fds *FdSet) Clear(fd int) {
|
||||||
|
fds.Bits[fd/NFDBITS] &^= (1 << (uintptr(fd) % NFDBITS))
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSet returns whether fd is in the set fds.
|
||||||
|
func (fds *FdSet) IsSet(fd int) bool {
|
||||||
|
return fds.Bits[fd/NFDBITS]&(1<<(uintptr(fd)%NFDBITS)) != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Zero clears the set fds.
|
||||||
|
func (fds *FdSet) Zero() {
|
||||||
|
for i := range fds.Bits {
|
||||||
|
fds.Bits[i] = 0
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,19 @@
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
import "runtime"
|
import (
|
||||||
|
"runtime"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ioctl itself should not be exposed directly, but additional get/set
|
||||||
|
// functions for specific types are permissible.
|
||||||
|
|
||||||
|
// IoctlSetInt performs an ioctl operation which sets an integer value
|
||||||
|
// on fd, using the specified request number.
|
||||||
|
func IoctlSetInt(fd int, req uint, value int) error {
|
||||||
|
return ioctl(fd, req, uintptr(value))
|
||||||
|
}
|
||||||
|
|
||||||
// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument.
|
// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument.
|
||||||
//
|
//
|
||||||
|
@ -14,7 +26,7 @@ import "runtime"
|
||||||
func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
|
func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
|
||||||
// TODO: if we get the chance, remove the req parameter and
|
// TODO: if we get the chance, remove the req parameter and
|
||||||
// hardcode TIOCSWINSZ.
|
// hardcode TIOCSWINSZ.
|
||||||
err := ioctlSetWinsize(fd, req, value)
|
err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
||||||
runtime.KeepAlive(value)
|
runtime.KeepAlive(value)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -24,7 +36,30 @@ func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
|
||||||
// The req value will usually be TCSETA or TIOCSETA.
|
// The req value will usually be TCSETA or TIOCSETA.
|
||||||
func IoctlSetTermios(fd int, req uint, value *Termios) error {
|
func IoctlSetTermios(fd int, req uint, value *Termios) error {
|
||||||
// TODO: if we get the chance, remove the req parameter.
|
// TODO: if we get the chance, remove the req parameter.
|
||||||
err := ioctlSetTermios(fd, req, value)
|
err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
||||||
runtime.KeepAlive(value)
|
runtime.KeepAlive(value)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IoctlGetInt performs an ioctl operation which gets an integer value
|
||||||
|
// from fd, using the specified request number.
|
||||||
|
//
|
||||||
|
// A few ioctl requests use the return value as an output parameter;
|
||||||
|
// for those, IoctlRetInt should be used instead of this function.
|
||||||
|
func IoctlGetInt(fd int, req uint) (int, error) {
|
||||||
|
var value int
|
||||||
|
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
||||||
|
return value, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
||||||
|
var value Winsize
|
||||||
|
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
||||||
|
return &value, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
||||||
|
var value Termios
|
||||||
|
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
||||||
|
return &value, err
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
// Round the length of a raw sockaddr up to align it properly.
|
||||||
|
func cmsgAlignOf(salen int) int {
|
||||||
|
salign := SizeofPtr
|
||||||
|
if SizeofPtr == 8 && !supportsABI(_dragonflyABIChangeVersion) {
|
||||||
|
// 64-bit Dragonfly before the September 2019 ABI changes still requires
|
||||||
|
// 32-bit aligned access to network subsystem.
|
||||||
|
salign = 4
|
||||||
|
}
|
||||||
|
return (salen + salign - 1) & ^(salign - 1)
|
||||||
|
}
|
|
@ -17,7 +17,7 @@ func UnixCredentials(ucred *Ucred) []byte {
|
||||||
h.Level = SOL_SOCKET
|
h.Level = SOL_SOCKET
|
||||||
h.Type = SCM_CREDENTIALS
|
h.Type = SCM_CREDENTIALS
|
||||||
h.SetLen(CmsgLen(SizeofUcred))
|
h.SetLen(CmsgLen(SizeofUcred))
|
||||||
*((*Ucred)(cmsgData(h))) = *ucred
|
*(*Ucred)(h.data(0)) = *ucred
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,35 +9,9 @@
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Round the length of a raw sockaddr up to align it properly.
|
|
||||||
func cmsgAlignOf(salen int) int {
|
|
||||||
salign := SizeofPtr
|
|
||||||
|
|
||||||
switch runtime.GOOS {
|
|
||||||
case "aix":
|
|
||||||
// There is no alignment on AIX.
|
|
||||||
salign = 1
|
|
||||||
case "darwin", "dragonfly", "solaris", "illumos":
|
|
||||||
// NOTE: It seems like 64-bit Darwin, DragonFly BSD,
|
|
||||||
// illumos, and Solaris kernels still require 32-bit
|
|
||||||
// aligned access to network subsystem.
|
|
||||||
if SizeofPtr == 8 {
|
|
||||||
salign = 4
|
|
||||||
}
|
|
||||||
case "netbsd", "openbsd":
|
|
||||||
// NetBSD and OpenBSD armv7 require 64-bit alignment.
|
|
||||||
if runtime.GOARCH == "arm" {
|
|
||||||
salign = 8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (salen + salign - 1) & ^(salign - 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CmsgLen returns the value to store in the Len field of the Cmsghdr
|
// CmsgLen returns the value to store in the Len field of the Cmsghdr
|
||||||
// structure, taking into account any necessary alignment.
|
// structure, taking into account any necessary alignment.
|
||||||
func CmsgLen(datalen int) int {
|
func CmsgLen(datalen int) int {
|
||||||
|
@ -50,8 +24,8 @@ func CmsgSpace(datalen int) int {
|
||||||
return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen)
|
return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen)
|
||||||
}
|
}
|
||||||
|
|
||||||
func cmsgData(h *Cmsghdr) unsafe.Pointer {
|
func (h *Cmsghdr) data(offset uintptr) unsafe.Pointer {
|
||||||
return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr)))
|
return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr)) + offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SocketControlMessage represents a socket control message.
|
// SocketControlMessage represents a socket control message.
|
||||||
|
@ -94,10 +68,8 @@ func UnixRights(fds ...int) []byte {
|
||||||
h.Level = SOL_SOCKET
|
h.Level = SOL_SOCKET
|
||||||
h.Type = SCM_RIGHTS
|
h.Type = SCM_RIGHTS
|
||||||
h.SetLen(CmsgLen(datalen))
|
h.SetLen(CmsgLen(datalen))
|
||||||
data := cmsgData(h)
|
for i, fd := range fds {
|
||||||
for _, fd := range fds {
|
*(*int32)(h.data(4 * uintptr(i))) = int32(fd)
|
||||||
*(*int32)(data) = int32(fd)
|
|
||||||
data = unsafe.Pointer(uintptr(data) + 4)
|
|
||||||
}
|
}
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build aix darwin freebsd linux netbsd openbsd solaris
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
import (
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Round the length of a raw sockaddr up to align it properly.
|
||||||
|
func cmsgAlignOf(salen int) int {
|
||||||
|
salign := SizeofPtr
|
||||||
|
|
||||||
|
// dragonfly needs to check ABI version at runtime, see cmsgAlignOf in
|
||||||
|
// sockcmsg_dragonfly.go
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "aix":
|
||||||
|
// There is no alignment on AIX.
|
||||||
|
salign = 1
|
||||||
|
case "darwin", "illumos", "solaris":
|
||||||
|
// NOTE: It seems like 64-bit Darwin, Illumos and Solaris
|
||||||
|
// kernels still require 32-bit aligned access to network
|
||||||
|
// subsystem.
|
||||||
|
if SizeofPtr == 8 {
|
||||||
|
salign = 4
|
||||||
|
}
|
||||||
|
case "netbsd", "openbsd":
|
||||||
|
// NetBSD and OpenBSD armv7 require 64-bit alignment.
|
||||||
|
if runtime.GOARCH == "arm" {
|
||||||
|
salign = 8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (salen + salign - 1) & ^(salign - 1)
|
||||||
|
}
|
|
@ -350,49 +350,12 @@ func (w WaitStatus) Signal() Signal {
|
||||||
|
|
||||||
func (w WaitStatus) Continued() bool { return w&0x01000000 != 0 }
|
func (w WaitStatus) Continued() bool { return w&0x01000000 != 0 }
|
||||||
|
|
||||||
func (w WaitStatus) CoreDump() bool { return w&0x200 != 0 }
|
func (w WaitStatus) CoreDump() bool { return w&0x80 == 0x80 }
|
||||||
|
|
||||||
func (w WaitStatus) TrapCause() int { return -1 }
|
func (w WaitStatus) TrapCause() int { return -1 }
|
||||||
|
|
||||||
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
||||||
|
|
||||||
// ioctl itself should not be exposed directly, but additional get/set
|
|
||||||
// functions for specific types are permissible.
|
|
||||||
|
|
||||||
// IoctlSetInt performs an ioctl operation which sets an integer value
|
|
||||||
// on fd, using the specified request number.
|
|
||||||
func IoctlSetInt(fd int, req uint, value int) error {
|
|
||||||
return ioctl(fd, req, uintptr(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetWinsize(fd int, req uint, value *Winsize) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetTermios(fd int, req uint, value *Termios) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// IoctlGetInt performs an ioctl operation which gets an integer value
|
|
||||||
// from fd, using the specified request number.
|
|
||||||
func IoctlGetInt(fd int, req uint) (int, error) {
|
|
||||||
var value int
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
|
||||||
var value Winsize
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|
||||||
var value Termios
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX
|
// fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX
|
||||||
// There is no way to create a custom fcntl and to keep //sys fcntl easily,
|
// There is no way to create a custom fcntl and to keep //sys fcntl easily,
|
||||||
// Therefore, the programmer must call dup2 instead of fcntl in this case.
|
// Therefore, the programmer must call dup2 instead of fcntl in this case.
|
||||||
|
|
|
@ -29,6 +29,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -237,7 +237,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
|
bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
|
||||||
sa.Name = string(bytes)
|
sa.Name = string(bytes)
|
||||||
return sa, nil
|
return sa, nil
|
||||||
|
|
||||||
|
@ -413,8 +413,6 @@ func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err e
|
||||||
return kevent(kq, change, len(changes), event, len(events), timeout)
|
return kevent(kq, change, len(changes), event, len(events), timeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
|
|
||||||
|
|
||||||
// sysctlmib translates name to mib number and appends any additional args.
|
// sysctlmib translates name to mib number and appends any additional args.
|
||||||
func sysctlmib(name string, args ...int) ([]_C_int, error) {
|
func sysctlmib(name string, args ...int) ([]_C_int, error) {
|
||||||
// Translate name to mib number.
|
// Translate name to mib number.
|
||||||
|
@ -512,6 +510,23 @@ func SysctlRaw(name string, args ...int) ([]byte, error) {
|
||||||
return buf[:n], nil
|
return buf[:n], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SysctlClockinfo(name string) (*Clockinfo, error) {
|
||||||
|
mib, err := sysctlmib(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
n := uintptr(SizeofClockinfo)
|
||||||
|
var ci Clockinfo
|
||||||
|
if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if n != SizeofClockinfo {
|
||||||
|
return nil, EIO
|
||||||
|
}
|
||||||
|
return &ci, nil
|
||||||
|
}
|
||||||
|
|
||||||
//sys utimes(path string, timeval *[2]Timeval) (err error)
|
//sys utimes(path string, timeval *[2]Timeval) (err error)
|
||||||
|
|
||||||
func Utimes(path string, tv []Timeval) error {
|
func Utimes(path string, tv []Timeval) error {
|
||||||
|
@ -579,8 +594,6 @@ func Futimes(fd int, tv []Timeval) error {
|
||||||
return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
|
return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
|
||||||
}
|
}
|
||||||
|
|
||||||
//sys fcntl(fd int, cmd int, arg int) (val int, err error)
|
|
||||||
|
|
||||||
//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
|
//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
|
||||||
|
|
||||||
func Poll(fds []PollFd, timeout int) (n int, err error) {
|
func Poll(fds []PollFd, timeout int) (n int, err error) {
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build darwin,go1.12,!go1.13
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
|
||||||
|
// To implement this using libSystem we'd need syscall_syscallPtr for
|
||||||
|
// fdopendir. However, syscallPtr was only added in Go 1.13, so we fall
|
||||||
|
// back to raw syscalls for this func on Go 1.12.
|
||||||
|
var p unsafe.Pointer
|
||||||
|
if len(buf) > 0 {
|
||||||
|
p = unsafe.Pointer(&buf[0])
|
||||||
|
} else {
|
||||||
|
p = unsafe.Pointer(&_zero)
|
||||||
|
}
|
||||||
|
r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(p), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)
|
||||||
|
n = int(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
return n, errnoErr(e1)
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build darwin,go1.13
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
import "unsafe"
|
||||||
|
|
||||||
|
//sys closedir(dir uintptr) (err error)
|
||||||
|
//sys readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno)
|
||||||
|
|
||||||
|
func fdopendir(fd int) (dir uintptr, err error) {
|
||||||
|
r0, _, e1 := syscall_syscallPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0)
|
||||||
|
dir = uintptr(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func libc_fdopendir_trampoline()
|
||||||
|
|
||||||
|
//go:linkname libc_fdopendir libc_fdopendir
|
||||||
|
//go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib"
|
||||||
|
|
||||||
|
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
|
||||||
|
// Simulate Getdirentries using fdopendir/readdir_r/closedir.
|
||||||
|
// We store the number of entries to skip in the seek
|
||||||
|
// offset of fd. See issue #31368.
|
||||||
|
// It's not the full required semantics, but should handle the case
|
||||||
|
// of calling Getdirentries or ReadDirent repeatedly.
|
||||||
|
// It won't handle assigning the results of lseek to *basep, or handle
|
||||||
|
// the directory being edited underfoot.
|
||||||
|
skip, err := Seek(fd, 0, 1 /* SEEK_CUR */)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// We need to duplicate the incoming file descriptor
|
||||||
|
// because the caller expects to retain control of it, but
|
||||||
|
// fdopendir expects to take control of its argument.
|
||||||
|
// Just Dup'ing the file descriptor is not enough, as the
|
||||||
|
// result shares underlying state. Use Openat to make a really
|
||||||
|
// new file descriptor referring to the same directory.
|
||||||
|
fd2, err := Openat(fd, ".", O_RDONLY, 0)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
d, err := fdopendir(fd2)
|
||||||
|
if err != nil {
|
||||||
|
Close(fd2)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
defer closedir(d)
|
||||||
|
|
||||||
|
var cnt int64
|
||||||
|
for {
|
||||||
|
var entry Dirent
|
||||||
|
var entryp *Dirent
|
||||||
|
e := readdir_r(d, &entry, &entryp)
|
||||||
|
if e != 0 {
|
||||||
|
return n, errnoErr(e)
|
||||||
|
}
|
||||||
|
if entryp == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if skip > 0 {
|
||||||
|
skip--
|
||||||
|
cnt++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
reclen := int(entry.Reclen)
|
||||||
|
if reclen > len(buf) {
|
||||||
|
// Not enough room. Return for now.
|
||||||
|
// The counter will let us know where we should start up again.
|
||||||
|
// Note: this strategy for suspending in the middle and
|
||||||
|
// restarting is O(n^2) in the length of the directory. Oh well.
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// Copy entry into return buffer.
|
||||||
|
s := struct {
|
||||||
|
ptr unsafe.Pointer
|
||||||
|
siz int
|
||||||
|
cap int
|
||||||
|
}{ptr: unsafe.Pointer(&entry), siz: reclen, cap: reclen}
|
||||||
|
copy(buf, *(*[]byte)(unsafe.Pointer(&s)))
|
||||||
|
buf = buf[reclen:]
|
||||||
|
n += reclen
|
||||||
|
cnt++
|
||||||
|
}
|
||||||
|
// Set the seek offset of the input fd to record
|
||||||
|
// how many files we've already returned.
|
||||||
|
_, err = Seek(fd, cnt, 0 /* SEEK_SET */)
|
||||||
|
if err != nil {
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return n, nil
|
||||||
|
}
|
|
@ -155,23 +155,6 @@ func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (
|
||||||
|
|
||||||
//sys getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error)
|
//sys getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error)
|
||||||
|
|
||||||
func SysctlClockinfo(name string) (*Clockinfo, error) {
|
|
||||||
mib, err := sysctlmib(name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
n := uintptr(SizeofClockinfo)
|
|
||||||
var ci Clockinfo
|
|
||||||
if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if n != SizeofClockinfo {
|
|
||||||
return nil, EIO
|
|
||||||
}
|
|
||||||
return &ci, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb pipe() (r int, w int, err error)
|
//sysnb pipe() (r int, w int, err error)
|
||||||
|
|
||||||
func Pipe(p []int) (err error) {
|
func Pipe(p []int) (err error) {
|
||||||
|
@ -333,48 +316,15 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error {
|
||||||
* Wrapped
|
* Wrapped
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//sys fcntl(fd int, cmd int, arg int) (val int, err error)
|
||||||
|
|
||||||
//sys kill(pid int, signum int, posix int) (err error)
|
//sys kill(pid int, signum int, posix int) (err error)
|
||||||
|
|
||||||
func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) }
|
func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) }
|
||||||
|
|
||||||
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
||||||
|
|
||||||
// ioctl itself should not be exposed directly, but additional get/set
|
//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS_SYSCTL
|
||||||
// functions for specific types are permissible.
|
|
||||||
|
|
||||||
// IoctlSetInt performs an ioctl operation which sets an integer value
|
|
||||||
// on fd, using the specified request number.
|
|
||||||
func IoctlSetInt(fd int, req uint, value int) error {
|
|
||||||
return ioctl(fd, req, uintptr(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetWinsize(fd int, req uint, value *Winsize) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetTermios(fd int, req uint, value *Termios) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// IoctlGetInt performs an ioctl operation which gets an integer value
|
|
||||||
// from fd, using the specified request number.
|
|
||||||
func IoctlGetInt(fd int, req uint) (int, error) {
|
|
||||||
var value int
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
|
||||||
var value Winsize
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|
||||||
var value Termios
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func Uname(uname *Utsname) error {
|
func Uname(uname *Utsname) error {
|
||||||
mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
||||||
|
@ -497,7 +447,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
//sys Revoke(path string) (err error)
|
//sys Revoke(path string) (err error)
|
||||||
//sys Rmdir(path string) (err error)
|
//sys Rmdir(path string) (err error)
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
||||||
//sys Setegid(egid int) (err error)
|
//sys Setegid(egid int) (err error)
|
||||||
//sysnb Seteuid(euid int) (err error)
|
//sysnb Seteuid(euid int) (err error)
|
||||||
//sysnb Setgid(gid int) (err error)
|
//sysnb Setgid(gid int) (err error)
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build darwin,386,!go1.12
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64
|
|
@ -45,6 +45,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
@ -58,7 +62,6 @@ const SYS___SYSCTL = SYS_SYSCTL
|
||||||
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
|
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
|
||||||
//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
|
//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
|
||||||
//sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64
|
//sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64
|
||||||
//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64
|
|
||||||
//sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64
|
//sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
|
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
|
||||||
//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
|
//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build darwin,amd64,!go1.12
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64
|
|
@ -45,6 +45,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
@ -58,7 +62,6 @@ const SYS___SYSCTL = SYS_SYSCTL
|
||||||
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
|
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
|
||||||
//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
|
//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
|
||||||
//sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64
|
//sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64
|
||||||
//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64
|
|
||||||
//sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64
|
//sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
|
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
|
||||||
//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
|
//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build darwin,arm,!go1.12
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
|
||||||
|
return 0, ENOSYS
|
||||||
|
}
|
|
@ -45,6 +45,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
@ -62,7 +66,3 @@ const SYS___SYSCTL = SYS_SYSCTL
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error)
|
//sys Lstat(path string, stat *Stat_t) (err error)
|
||||||
//sys Stat(path string, stat *Stat_t) (err error)
|
//sys Stat(path string, stat *Stat_t) (err error)
|
||||||
//sys Statfs(path string, stat *Statfs_t) (err error)
|
//sys Statfs(path string, stat *Statfs_t) (err error)
|
||||||
|
|
||||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
|
|
||||||
return 0, ENOSYS
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build darwin,arm64,!go1.12
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
|
||||||
|
return 0, ENOSYS
|
||||||
|
}
|
|
@ -47,6 +47,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
@ -64,7 +68,3 @@ const SYS___SYSCTL = SYS_SYSCTL
|
||||||
//sys Lstat(path string, stat *Stat_t) (err error)
|
//sys Lstat(path string, stat *Stat_t) (err error)
|
||||||
//sys Stat(path string, stat *Stat_t) (err error)
|
//sys Stat(path string, stat *Stat_t) (err error)
|
||||||
//sys Statfs(path string, stat *Statfs_t) (err error)
|
//sys Statfs(path string, stat *Statfs_t) (err error)
|
||||||
|
|
||||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
|
|
||||||
return 0, ENOSYS
|
|
||||||
}
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err
|
||||||
func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) // 32-bit only
|
func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) // 32-bit only
|
||||||
func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
|
func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
|
||||||
func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
|
func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
|
||||||
|
func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
|
||||||
|
|
||||||
//go:linkname syscall_syscall syscall.syscall
|
//go:linkname syscall_syscall syscall.syscall
|
||||||
//go:linkname syscall_syscall6 syscall.syscall6
|
//go:linkname syscall_syscall6 syscall.syscall6
|
||||||
|
@ -22,6 +23,7 @@ func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, er
|
||||||
//go:linkname syscall_syscall9 syscall.syscall9
|
//go:linkname syscall_syscall9 syscall.syscall9
|
||||||
//go:linkname syscall_rawSyscall syscall.rawSyscall
|
//go:linkname syscall_rawSyscall syscall.rawSyscall
|
||||||
//go:linkname syscall_rawSyscall6 syscall.rawSyscall6
|
//go:linkname syscall_rawSyscall6 syscall.rawSyscall6
|
||||||
|
//go:linkname syscall_syscallPtr syscall.syscallPtr
|
||||||
|
|
||||||
// Find the entry point for f. See comments in runtime/proc.go for the
|
// Find the entry point for f. See comments in runtime/proc.go for the
|
||||||
// function of the same name.
|
// function of the same name.
|
||||||
|
|
|
@ -12,7 +12,25 @@
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"sync"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// See version list in https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/sys/sys/param.h
|
||||||
|
var (
|
||||||
|
osreldateOnce sync.Once
|
||||||
|
osreldate uint32
|
||||||
|
)
|
||||||
|
|
||||||
|
// First __DragonFly_version after September 2019 ABI changes
|
||||||
|
// http://lists.dragonflybsd.org/pipermail/users/2019-September/358280.html
|
||||||
|
const _dragonflyABIChangeVersion = 500705
|
||||||
|
|
||||||
|
func supportsABI(ver uint32) bool {
|
||||||
|
osreldateOnce.Do(func() { osreldate, _ = SysctlUint32("kern.osreldate") })
|
||||||
|
return osreldate >= ver
|
||||||
|
}
|
||||||
|
|
||||||
// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
|
// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
|
||||||
type SockaddrDatalink struct {
|
type SockaddrDatalink struct {
|
||||||
|
@ -150,42 +168,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error {
|
||||||
|
|
||||||
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
||||||
|
|
||||||
// ioctl itself should not be exposed directly, but additional get/set
|
//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
|
||||||
// functions for specific types are permissible.
|
|
||||||
|
|
||||||
// IoctlSetInt performs an ioctl operation which sets an integer value
|
|
||||||
// on fd, using the specified request number.
|
|
||||||
func IoctlSetInt(fd int, req uint, value int) error {
|
|
||||||
return ioctl(fd, req, uintptr(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetWinsize(fd int, req uint, value *Winsize) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetTermios(fd int, req uint, value *Termios) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// IoctlGetInt performs an ioctl operation which gets an integer value
|
|
||||||
// from fd, using the specified request number.
|
|
||||||
func IoctlGetInt(fd int, req uint) (int, error) {
|
|
||||||
var value int
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
|
||||||
var value Winsize
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|
||||||
var value Termios
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error {
|
func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error {
|
||||||
err := sysctl(mib, old, oldlen, nil, 0)
|
err := sysctl(mib, old, oldlen, nil, 0)
|
||||||
|
@ -325,7 +308,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
//sys Revoke(path string) (err error)
|
//sys Revoke(path string) (err error)
|
||||||
//sys Rmdir(path string) (err error)
|
//sys Rmdir(path string) (err error)
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
||||||
//sysnb Setegid(egid int) (err error)
|
//sysnb Setegid(egid int) (err error)
|
||||||
//sysnb Seteuid(euid int) (err error)
|
//sysnb Seteuid(euid int) (err error)
|
||||||
//sysnb Setgid(gid int) (err error)
|
//sysnb Setgid(gid int) (err error)
|
||||||
|
|
|
@ -33,6 +33,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,42 +201,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error {
|
||||||
|
|
||||||
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
||||||
|
|
||||||
// ioctl itself should not be exposed directly, but additional get/set
|
//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
|
||||||
// functions for specific types are permissible.
|
|
||||||
|
|
||||||
// IoctlSetInt performs an ioctl operation which sets an integer value
|
|
||||||
// on fd, using the specified request number.
|
|
||||||
func IoctlSetInt(fd int, req uint, value int) error {
|
|
||||||
return ioctl(fd, req, uintptr(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetWinsize(fd int, req uint, value *Winsize) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetTermios(fd int, req uint, value *Termios) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// IoctlGetInt performs an ioctl operation which gets an integer value
|
|
||||||
// from fd, using the specified request number.
|
|
||||||
func IoctlGetInt(fd int, req uint) (int, error) {
|
|
||||||
var value int
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
|
||||||
var value Winsize
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|
||||||
var value Termios
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func Uname(uname *Utsname) error {
|
func Uname(uname *Utsname) error {
|
||||||
mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
mib := []_C_int{CTL_KERN, KERN_OSTYPE}
|
||||||
|
@ -497,8 +462,12 @@ func convertFromDirents11(buf []byte, old []byte) int {
|
||||||
dstPos := 0
|
dstPos := 0
|
||||||
srcPos := 0
|
srcPos := 0
|
||||||
for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) {
|
for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) {
|
||||||
dstDirent := (*Dirent)(unsafe.Pointer(&buf[dstPos]))
|
var dstDirent Dirent
|
||||||
srcDirent := (*dirent_freebsd11)(unsafe.Pointer(&old[srcPos]))
|
var srcDirent dirent_freebsd11
|
||||||
|
|
||||||
|
// If multiple direntries are written, sometimes when we reach the final one,
|
||||||
|
// we may have cap of old less than size of dirent_freebsd11.
|
||||||
|
copy((*[unsafe.Sizeof(srcDirent)]byte)(unsafe.Pointer(&srcDirent))[:], old[srcPos:])
|
||||||
|
|
||||||
reclen := roundup(fixedSize+int(srcDirent.Namlen)+1, 8)
|
reclen := roundup(fixedSize+int(srcDirent.Namlen)+1, 8)
|
||||||
if dstPos+reclen > len(buf) {
|
if dstPos+reclen > len(buf) {
|
||||||
|
@ -514,6 +483,7 @@ func convertFromDirents11(buf []byte, old []byte) int {
|
||||||
dstDirent.Pad1 = 0
|
dstDirent.Pad1 = 0
|
||||||
|
|
||||||
copy(dstDirent.Name[:], srcDirent.Name[:srcDirent.Namlen])
|
copy(dstDirent.Name[:], srcDirent.Name[:srcDirent.Namlen])
|
||||||
|
copy(buf[dstPos:], (*[unsafe.Sizeof(dstDirent)]byte)(unsafe.Pointer(&dstDirent))[:])
|
||||||
padding := buf[dstPos+fixedSize+int(dstDirent.Namlen) : dstPos+reclen]
|
padding := buf[dstPos+fixedSize+int(dstDirent.Namlen) : dstPos+reclen]
|
||||||
for i := range padding {
|
for i := range padding {
|
||||||
padding[i] = 0
|
padding[i] = 0
|
||||||
|
@ -559,12 +529,6 @@ func PtraceGetRegs(pid int, regsout *Reg) (err error) {
|
||||||
return ptrace(PTRACE_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0)
|
return ptrace(PTRACE_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
|
|
||||||
ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint(countin)}
|
|
||||||
err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
|
|
||||||
return int(ioDesc.Len), err
|
|
||||||
}
|
|
||||||
|
|
||||||
func PtraceLwpEvents(pid int, enable int) (err error) {
|
func PtraceLwpEvents(pid int, enable int) (err error) {
|
||||||
return ptrace(PTRACE_LWPEVENTS, pid, 0, enable)
|
return ptrace(PTRACE_LWPEVENTS, pid, 0, enable)
|
||||||
}
|
}
|
||||||
|
@ -688,7 +652,7 @@ func PtraceSingleStep(pid int) (err error) {
|
||||||
//sys Revoke(path string) (err error)
|
//sys Revoke(path string) (err error)
|
||||||
//sys Rmdir(path string) (err error)
|
//sys Rmdir(path string) (err error)
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
||||||
//sysnb Setegid(egid int) (err error)
|
//sysnb Setegid(egid int) (err error)
|
||||||
//sysnb Seteuid(euid int) (err error)
|
//sysnb Seteuid(euid int) (err error)
|
||||||
//sysnb Setgid(gid int) (err error)
|
//sysnb Setgid(gid int) (err error)
|
||||||
|
|
|
@ -33,6 +33,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
@ -50,3 +54,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
}
|
}
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||||
|
|
||||||
|
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
|
||||||
|
ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)}
|
||||||
|
err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
|
||||||
|
return int(ioDesc.Len), err
|
||||||
|
}
|
||||||
|
|
|
@ -33,6 +33,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
@ -50,3 +54,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
}
|
}
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||||
|
|
||||||
|
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
|
||||||
|
ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)}
|
||||||
|
err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
|
||||||
|
return int(ioDesc.Len), err
|
||||||
|
}
|
||||||
|
|
|
@ -33,6 +33,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
@ -50,3 +54,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
}
|
}
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||||
|
|
||||||
|
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
|
||||||
|
ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)}
|
||||||
|
err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
|
||||||
|
return int(ioDesc.Len), err
|
||||||
|
}
|
||||||
|
|
|
@ -33,6 +33,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
@ -50,3 +54,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
}
|
}
|
||||||
|
|
||||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
|
||||||
|
|
||||||
|
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
|
||||||
|
ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)}
|
||||||
|
err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
|
||||||
|
return int(ioDesc.Len), err
|
||||||
|
}
|
||||||
|
|
|
@ -71,6 +71,17 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {
|
||||||
// ioctl itself should not be exposed directly, but additional get/set
|
// ioctl itself should not be exposed directly, but additional get/set
|
||||||
// functions for specific types are permissible.
|
// functions for specific types are permissible.
|
||||||
|
|
||||||
|
// IoctlRetInt performs an ioctl operation specified by req on a device
|
||||||
|
// associated with opened file descriptor fd, and returns a non-negative
|
||||||
|
// integer that is returned by the ioctl syscall.
|
||||||
|
func IoctlRetInt(fd int, req uint) (int, error) {
|
||||||
|
ret, _, err := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), 0)
|
||||||
|
if err != 0 {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return int(ret), nil
|
||||||
|
}
|
||||||
|
|
||||||
// IoctlSetPointerInt performs an ioctl operation which sets an
|
// IoctlSetPointerInt performs an ioctl operation which sets an
|
||||||
// integer value on fd, using the specified request number. The ioctl
|
// integer value on fd, using the specified request number. The ioctl
|
||||||
// argument is called with a pointer to the integer value, rather than
|
// argument is called with a pointer to the integer value, rather than
|
||||||
|
@ -80,52 +91,18 @@ func IoctlSetPointerInt(fd int, req uint, value int) error {
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(&v)))
|
return ioctl(fd, req, uintptr(unsafe.Pointer(&v)))
|
||||||
}
|
}
|
||||||
|
|
||||||
// IoctlSetInt performs an ioctl operation which sets an integer value
|
|
||||||
// on fd, using the specified request number.
|
|
||||||
func IoctlSetInt(fd int, req uint, value int) error {
|
|
||||||
return ioctl(fd, req, uintptr(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetWinsize(fd int, req uint, value *Winsize) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetTermios(fd int, req uint, value *Termios) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlSetRTCTime(fd int, value *RTCTime) error {
|
func IoctlSetRTCTime(fd int, value *RTCTime) error {
|
||||||
err := ioctl(fd, RTC_SET_TIME, uintptr(unsafe.Pointer(value)))
|
err := ioctl(fd, RTC_SET_TIME, uintptr(unsafe.Pointer(value)))
|
||||||
runtime.KeepAlive(value)
|
runtime.KeepAlive(value)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// IoctlGetInt performs an ioctl operation which gets an integer value
|
|
||||||
// from fd, using the specified request number.
|
|
||||||
func IoctlGetInt(fd int, req uint) (int, error) {
|
|
||||||
var value int
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetUint32(fd int, req uint) (uint32, error) {
|
func IoctlGetUint32(fd int, req uint) (uint32, error) {
|
||||||
var value uint32
|
var value uint32
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
||||||
return value, err
|
return value, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
|
||||||
var value Winsize
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|
||||||
var value Termios
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetRTCTime(fd int) (*RTCTime, error) {
|
func IoctlGetRTCTime(fd int) (*RTCTime, error) {
|
||||||
var value RTCTime
|
var value RTCTime
|
||||||
err := ioctl(fd, RTC_RD_TIME, uintptr(unsafe.Pointer(&value)))
|
err := ioctl(fd, RTC_RD_TIME, uintptr(unsafe.Pointer(&value)))
|
||||||
|
@ -798,6 +775,70 @@ func (sa *SockaddrPPPoE) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
||||||
return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil
|
return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SockaddrTIPC implements the Sockaddr interface for AF_TIPC type sockets.
|
||||||
|
// For more information on TIPC, see: http://tipc.sourceforge.net/.
|
||||||
|
type SockaddrTIPC struct {
|
||||||
|
// Scope is the publication scopes when binding service/service range.
|
||||||
|
// Should be set to TIPC_CLUSTER_SCOPE or TIPC_NODE_SCOPE.
|
||||||
|
Scope int
|
||||||
|
|
||||||
|
// Addr is the type of address used to manipulate a socket. Addr must be
|
||||||
|
// one of:
|
||||||
|
// - *TIPCSocketAddr: "id" variant in the C addr union
|
||||||
|
// - *TIPCServiceRange: "nameseq" variant in the C addr union
|
||||||
|
// - *TIPCServiceName: "name" variant in the C addr union
|
||||||
|
//
|
||||||
|
// If nil, EINVAL will be returned when the structure is used.
|
||||||
|
Addr TIPCAddr
|
||||||
|
|
||||||
|
raw RawSockaddrTIPC
|
||||||
|
}
|
||||||
|
|
||||||
|
// TIPCAddr is implemented by types that can be used as an address for
|
||||||
|
// SockaddrTIPC. It is only implemented by *TIPCSocketAddr, *TIPCServiceRange,
|
||||||
|
// and *TIPCServiceName.
|
||||||
|
type TIPCAddr interface {
|
||||||
|
tipcAddrtype() uint8
|
||||||
|
tipcAddr() [12]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sa *TIPCSocketAddr) tipcAddr() [12]byte {
|
||||||
|
var out [12]byte
|
||||||
|
copy(out[:], (*(*[unsafe.Sizeof(TIPCSocketAddr{})]byte)(unsafe.Pointer(sa)))[:])
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sa *TIPCSocketAddr) tipcAddrtype() uint8 { return TIPC_SOCKET_ADDR }
|
||||||
|
|
||||||
|
func (sa *TIPCServiceRange) tipcAddr() [12]byte {
|
||||||
|
var out [12]byte
|
||||||
|
copy(out[:], (*(*[unsafe.Sizeof(TIPCServiceRange{})]byte)(unsafe.Pointer(sa)))[:])
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sa *TIPCServiceRange) tipcAddrtype() uint8 { return TIPC_SERVICE_RANGE }
|
||||||
|
|
||||||
|
func (sa *TIPCServiceName) tipcAddr() [12]byte {
|
||||||
|
var out [12]byte
|
||||||
|
copy(out[:], (*(*[unsafe.Sizeof(TIPCServiceName{})]byte)(unsafe.Pointer(sa)))[:])
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sa *TIPCServiceName) tipcAddrtype() uint8 { return TIPC_SERVICE_ADDR }
|
||||||
|
|
||||||
|
func (sa *SockaddrTIPC) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
||||||
|
if sa.Addr == nil {
|
||||||
|
return nil, 0, EINVAL
|
||||||
|
}
|
||||||
|
|
||||||
|
sa.raw.Family = AF_TIPC
|
||||||
|
sa.raw.Scope = int8(sa.Scope)
|
||||||
|
sa.raw.Addrtype = sa.Addr.tipcAddrtype()
|
||||||
|
sa.raw.Addr = sa.Addr.tipcAddr()
|
||||||
|
|
||||||
|
return unsafe.Pointer(&sa.raw), SizeofSockaddrTIPC, nil
|
||||||
|
}
|
||||||
|
|
||||||
func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
|
func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
|
||||||
switch rsa.Addr.Family {
|
switch rsa.Addr.Family {
|
||||||
case AF_NETLINK:
|
case AF_NETLINK:
|
||||||
|
@ -843,7 +884,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
|
||||||
for n < len(pp.Path) && pp.Path[n] != 0 {
|
for n < len(pp.Path) && pp.Path[n] != 0 {
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
|
bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
|
||||||
sa.Name = string(bytes)
|
sa.Name = string(bytes)
|
||||||
return sa, nil
|
return sa, nil
|
||||||
|
|
||||||
|
@ -923,6 +964,27 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return sa, nil
|
||||||
|
case AF_TIPC:
|
||||||
|
pp := (*RawSockaddrTIPC)(unsafe.Pointer(rsa))
|
||||||
|
|
||||||
|
sa := &SockaddrTIPC{
|
||||||
|
Scope: int(pp.Scope),
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine which union variant is present in pp.Addr by checking
|
||||||
|
// pp.Addrtype.
|
||||||
|
switch pp.Addrtype {
|
||||||
|
case TIPC_SERVICE_RANGE:
|
||||||
|
sa.Addr = (*TIPCServiceRange)(unsafe.Pointer(&pp.Addr))
|
||||||
|
case TIPC_SERVICE_ADDR:
|
||||||
|
sa.Addr = (*TIPCServiceName)(unsafe.Pointer(&pp.Addr))
|
||||||
|
case TIPC_SOCKET_ADDR:
|
||||||
|
sa.Addr = (*TIPCSocketAddr)(unsafe.Pointer(&pp.Addr))
|
||||||
|
default:
|
||||||
|
return nil, EINVAL
|
||||||
|
}
|
||||||
|
|
||||||
return sa, nil
|
return sa, nil
|
||||||
}
|
}
|
||||||
return nil, EAFNOSUPPORT
|
return nil, EAFNOSUPPORT
|
||||||
|
@ -1160,6 +1222,34 @@ func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error
|
||||||
return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer)
|
return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// KeyctlRestrictKeyring implements the KEYCTL_RESTRICT_KEYRING command. This
|
||||||
|
// command limits the set of keys that can be linked to the keyring, regardless
|
||||||
|
// of keyring permissions. The command requires the "setattr" permission.
|
||||||
|
//
|
||||||
|
// When called with an empty keyType the command locks the keyring, preventing
|
||||||
|
// any further keys from being linked to the keyring.
|
||||||
|
//
|
||||||
|
// The "asymmetric" keyType defines restrictions requiring key payloads to be
|
||||||
|
// DER encoded X.509 certificates signed by keys in another keyring. Restrictions
|
||||||
|
// for "asymmetric" include "builtin_trusted", "builtin_and_secondary_trusted",
|
||||||
|
// "key_or_keyring:<key>", and "key_or_keyring:<key>:chain".
|
||||||
|
//
|
||||||
|
// As of Linux 4.12, only the "asymmetric" keyType defines type-specific
|
||||||
|
// restrictions.
|
||||||
|
//
|
||||||
|
// See the full documentation at:
|
||||||
|
// http://man7.org/linux/man-pages/man3/keyctl_restrict_keyring.3.html
|
||||||
|
// http://man7.org/linux/man-pages/man2/keyctl.2.html
|
||||||
|
func KeyctlRestrictKeyring(ringid int, keyType string, restriction string) error {
|
||||||
|
if keyType == "" {
|
||||||
|
return keyctlRestrictKeyring(KEYCTL_RESTRICT_KEYRING, ringid)
|
||||||
|
}
|
||||||
|
return keyctlRestrictKeyringByType(KEYCTL_RESTRICT_KEYRING, ringid, keyType, restriction)
|
||||||
|
}
|
||||||
|
|
||||||
|
//sys keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) = SYS_KEYCTL
|
||||||
|
//sys keyctlRestrictKeyring(cmd int, arg2 int) (err error) = SYS_KEYCTL
|
||||||
|
|
||||||
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
|
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
|
||||||
var msg Msghdr
|
var msg Msghdr
|
||||||
var rsa RawSockaddrAny
|
var rsa RawSockaddrAny
|
||||||
|
@ -1403,8 +1493,12 @@ func PtraceSyscall(pid int, signal int) (err error) {
|
||||||
|
|
||||||
func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }
|
func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }
|
||||||
|
|
||||||
|
func PtraceInterrupt(pid int) (err error) { return ptrace(PTRACE_INTERRUPT, pid, 0, 0) }
|
||||||
|
|
||||||
func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }
|
func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }
|
||||||
|
|
||||||
|
func PtraceSeize(pid int) (err error) { return ptrace(PTRACE_SEIZE, pid, 0, 0) }
|
||||||
|
|
||||||
func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) }
|
func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) }
|
||||||
|
|
||||||
//sys reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error)
|
//sys reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error)
|
||||||
|
@ -1481,7 +1575,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
//sys Fchdir(fd int) (err error)
|
//sys Fchdir(fd int) (err error)
|
||||||
//sys Fchmod(fd int, mode uint32) (err error)
|
//sys Fchmod(fd int, mode uint32) (err error)
|
||||||
//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
|
//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
|
||||||
//sys fcntl(fd int, cmd int, arg int) (val int, err error)
|
|
||||||
//sys Fdatasync(fd int) (err error)
|
//sys Fdatasync(fd int) (err error)
|
||||||
//sys Fgetxattr(fd int, attr string, dest []byte) (sz int, err error)
|
//sys Fgetxattr(fd int, attr string, dest []byte) (sz int, err error)
|
||||||
//sys FinitModule(fd int, params string, flags int) (err error)
|
//sys FinitModule(fd int, params string, flags int) (err error)
|
||||||
|
@ -1537,6 +1630,17 @@ func Getpgrp() (pid int) {
|
||||||
//sysnb Settimeofday(tv *Timeval) (err error)
|
//sysnb Settimeofday(tv *Timeval) (err error)
|
||||||
//sys Setns(fd int, nstype int) (err error)
|
//sys Setns(fd int, nstype int) (err error)
|
||||||
|
|
||||||
|
// PrctlRetInt performs a prctl operation specified by option and further
|
||||||
|
// optional arguments arg2 through arg5 depending on option. It returns a
|
||||||
|
// non-negative integer that is returned by the prctl syscall.
|
||||||
|
func PrctlRetInt(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (int, error) {
|
||||||
|
ret, _, err := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)
|
||||||
|
if err != 0 {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return int(ret), nil
|
||||||
|
}
|
||||||
|
|
||||||
// issue 1435.
|
// issue 1435.
|
||||||
// On linux Setuid and Setgid only affects the current thread, not the process.
|
// On linux Setuid and Setgid only affects the current thread, not the process.
|
||||||
// This does not match what most callers expect so we must return an error
|
// This does not match what most callers expect so we must return an error
|
||||||
|
@ -1550,6 +1654,30 @@ func Setgid(uid int) (err error) {
|
||||||
return EOPNOTSUPP
|
return EOPNOTSUPP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetfsgidRetGid sets fsgid for current thread and returns previous fsgid set.
|
||||||
|
// setfsgid(2) will return a non-nil error only if its caller lacks CAP_SETUID capability.
|
||||||
|
// If the call fails due to other reasons, current fsgid will be returned.
|
||||||
|
func SetfsgidRetGid(gid int) (int, error) {
|
||||||
|
return setfsgid(gid)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetfsuidRetUid sets fsuid for current thread and returns previous fsuid set.
|
||||||
|
// setfsgid(2) will return a non-nil error only if its caller lacks CAP_SETUID capability
|
||||||
|
// If the call fails due to other reasons, current fsuid will be returned.
|
||||||
|
func SetfsuidRetUid(uid int) (int, error) {
|
||||||
|
return setfsuid(uid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Setfsgid(gid int) error {
|
||||||
|
_, err := setfsgid(gid)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func Setfsuid(uid int) error {
|
||||||
|
_, err := setfsuid(uid)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) {
|
func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) {
|
||||||
return signalfd(fd, sigmask, _C__NSIG/8, flags)
|
return signalfd(fd, sigmask, _C__NSIG/8, flags)
|
||||||
}
|
}
|
||||||
|
@ -1572,6 +1700,123 @@ func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) {
|
||||||
//sys exitThread(code int) (err error) = SYS_EXIT
|
//sys exitThread(code int) (err error) = SYS_EXIT
|
||||||
//sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ
|
//sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ
|
||||||
//sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE
|
//sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE
|
||||||
|
//sys readv(fd int, iovs []Iovec) (n int, err error) = SYS_READV
|
||||||
|
//sys writev(fd int, iovs []Iovec) (n int, err error) = SYS_WRITEV
|
||||||
|
//sys preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) = SYS_PREADV
|
||||||
|
//sys pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) = SYS_PWRITEV
|
||||||
|
//sys preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) = SYS_PREADV2
|
||||||
|
//sys pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) = SYS_PWRITEV2
|
||||||
|
|
||||||
|
func bytes2iovec(bs [][]byte) []Iovec {
|
||||||
|
iovecs := make([]Iovec, len(bs))
|
||||||
|
for i, b := range bs {
|
||||||
|
iovecs[i].SetLen(len(b))
|
||||||
|
if len(b) > 0 {
|
||||||
|
iovecs[i].Base = &b[0]
|
||||||
|
} else {
|
||||||
|
iovecs[i].Base = (*byte)(unsafe.Pointer(&_zero))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return iovecs
|
||||||
|
}
|
||||||
|
|
||||||
|
// offs2lohi splits offs into its lower and upper unsigned long. On 64-bit
|
||||||
|
// systems, hi will always be 0. On 32-bit systems, offs will be split in half.
|
||||||
|
// preadv/pwritev chose this calling convention so they don't need to add a
|
||||||
|
// padding-register for alignment on ARM.
|
||||||
|
func offs2lohi(offs int64) (lo, hi uintptr) {
|
||||||
|
return uintptr(offs), uintptr(uint64(offs) >> SizeofLong)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Readv(fd int, iovs [][]byte) (n int, err error) {
|
||||||
|
iovecs := bytes2iovec(iovs)
|
||||||
|
n, err = readv(fd, iovecs)
|
||||||
|
readvRacedetect(iovecs, n, err)
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func Preadv(fd int, iovs [][]byte, offset int64) (n int, err error) {
|
||||||
|
iovecs := bytes2iovec(iovs)
|
||||||
|
lo, hi := offs2lohi(offset)
|
||||||
|
n, err = preadv(fd, iovecs, lo, hi)
|
||||||
|
readvRacedetect(iovecs, n, err)
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func Preadv2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) {
|
||||||
|
iovecs := bytes2iovec(iovs)
|
||||||
|
lo, hi := offs2lohi(offset)
|
||||||
|
n, err = preadv2(fd, iovecs, lo, hi, flags)
|
||||||
|
readvRacedetect(iovecs, n, err)
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func readvRacedetect(iovecs []Iovec, n int, err error) {
|
||||||
|
if !raceenabled {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for i := 0; n > 0 && i < len(iovecs); i++ {
|
||||||
|
m := int(iovecs[i].Len)
|
||||||
|
if m > n {
|
||||||
|
m = n
|
||||||
|
}
|
||||||
|
n -= m
|
||||||
|
if m > 0 {
|
||||||
|
raceWriteRange(unsafe.Pointer(iovecs[i].Base), m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err == nil {
|
||||||
|
raceAcquire(unsafe.Pointer(&ioSync))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Writev(fd int, iovs [][]byte) (n int, err error) {
|
||||||
|
iovecs := bytes2iovec(iovs)
|
||||||
|
if raceenabled {
|
||||||
|
raceReleaseMerge(unsafe.Pointer(&ioSync))
|
||||||
|
}
|
||||||
|
n, err = writev(fd, iovecs)
|
||||||
|
writevRacedetect(iovecs, n)
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func Pwritev(fd int, iovs [][]byte, offset int64) (n int, err error) {
|
||||||
|
iovecs := bytes2iovec(iovs)
|
||||||
|
if raceenabled {
|
||||||
|
raceReleaseMerge(unsafe.Pointer(&ioSync))
|
||||||
|
}
|
||||||
|
lo, hi := offs2lohi(offset)
|
||||||
|
n, err = pwritev(fd, iovecs, lo, hi)
|
||||||
|
writevRacedetect(iovecs, n)
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func Pwritev2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) {
|
||||||
|
iovecs := bytes2iovec(iovs)
|
||||||
|
if raceenabled {
|
||||||
|
raceReleaseMerge(unsafe.Pointer(&ioSync))
|
||||||
|
}
|
||||||
|
lo, hi := offs2lohi(offset)
|
||||||
|
n, err = pwritev2(fd, iovecs, lo, hi, flags)
|
||||||
|
writevRacedetect(iovecs, n)
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func writevRacedetect(iovecs []Iovec, n int) {
|
||||||
|
if !raceenabled {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for i := 0; n > 0 && i < len(iovecs); i++ {
|
||||||
|
m := int(iovecs[i].Len)
|
||||||
|
if m > n {
|
||||||
|
m = n
|
||||||
|
}
|
||||||
|
n -= m
|
||||||
|
if m > 0 {
|
||||||
|
raceReadRange(unsafe.Pointer(iovecs[i].Base), m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// mmap varies by architecture; see syscall_linux_*.go.
|
// mmap varies by architecture; see syscall_linux_*.go.
|
||||||
//sys munmap(addr uintptr, length uintptr) (err error)
|
//sys munmap(addr uintptr, length uintptr) (err error)
|
||||||
|
@ -1761,6 +2006,17 @@ func OpenByHandleAt(mountFD int, handle FileHandle, flags int) (fd int, err erro
|
||||||
return openByHandleAt(mountFD, handle.fileHandle, flags)
|
return openByHandleAt(mountFD, handle.fileHandle, flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Klogset wraps the sys_syslog system call; it sets console_loglevel to
|
||||||
|
// the value specified by arg and passes a dummy pointer to bufp.
|
||||||
|
func Klogset(typ int, arg int) (err error) {
|
||||||
|
var p unsafe.Pointer
|
||||||
|
_, _, errno := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(p), uintptr(arg))
|
||||||
|
if errno != 0 {
|
||||||
|
return errnoErr(errno)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unimplemented
|
* Unimplemented
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -70,8 +70,8 @@ func Pipe2(p []int, flags int) (err error) {
|
||||||
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
|
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
|
||||||
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
|
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
|
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
|
||||||
//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32
|
//sys setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32
|
||||||
//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32
|
//sys setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32
|
||||||
//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
|
//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
|
//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
|
//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
|
||||||
|
@ -372,6 +372,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,8 +55,8 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
||||||
//sys Setfsgid(gid int) (err error)
|
//sys setfsgid(gid int) (prev int, err error)
|
||||||
//sys Setfsuid(uid int) (err error)
|
//sys setfsuid(uid int) (prev int, err error)
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
//sysnb Setregid(rgid int, egid int) (err error)
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
||||||
|
@ -163,6 +163,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint64(length)
|
msghdr.Controllen = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint64(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint64(length)
|
cmsg.Len = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,8 +98,8 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
|
||||||
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
|
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
|
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
|
||||||
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
|
||||||
//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32
|
//sys setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32
|
||||||
//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32
|
//sys setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32
|
||||||
//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
|
//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
|
//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
|
//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
|
||||||
|
@ -252,6 +252,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,8 +42,8 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
||||||
//sys Setfsgid(gid int) (err error)
|
//sys setfsgid(gid int) (prev int, err error)
|
||||||
//sys Setfsuid(uid int) (err error)
|
//sys setfsuid(uid int) (prev int, err error)
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
//sysnb Setregid(rgid int, egid int) (err error)
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
||||||
|
@ -180,6 +180,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint64(length)
|
msghdr.Controllen = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint64(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint64(length)
|
cmsg.Len = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,8 +36,8 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
||||||
//sys Setfsgid(gid int) (err error)
|
//sys setfsgid(gid int) (prev int, err error)
|
||||||
//sys Setfsuid(uid int) (err error)
|
//sys setfsuid(uid int) (prev int, err error)
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
//sysnb Setregid(rgid int, egid int) (err error)
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
||||||
|
@ -208,6 +208,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint64(length)
|
msghdr.Controllen = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint64(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint64(length)
|
cmsg.Len = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,8 +31,8 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr,
|
||||||
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
|
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
|
||||||
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
|
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
|
||||||
//sys Setfsgid(gid int) (err error)
|
//sys setfsgid(gid int) (prev int, err error)
|
||||||
//sys Setfsuid(uid int) (err error)
|
//sys setfsuid(uid int) (prev int, err error)
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
//sysnb Setregid(rgid int, egid int) (err error)
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
||||||
|
@ -220,6 +220,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,8 +34,8 @@ package unix
|
||||||
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
|
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
|
||||||
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
||||||
//sys Setfsgid(gid int) (err error)
|
//sys setfsgid(gid int) (prev int, err error)
|
||||||
//sys Setfsuid(uid int) (err error)
|
//sys setfsuid(uid int) (prev int, err error)
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
//sysnb Setregid(rgid int, egid int) (err error)
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
||||||
|
@ -91,6 +91,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint64(length)
|
msghdr.Controllen = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint64(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint64(length)
|
cmsg.Len = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,8 +41,8 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
||||||
//sys Setfsgid(gid int) (err error)
|
//sys setfsgid(gid int) (prev int, err error)
|
||||||
//sys Setfsuid(uid int) (err error)
|
//sys setfsuid(uid int) (prev int, err error)
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
//sysnb Setregid(rgid int, egid int) (err error)
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
||||||
|
@ -179,6 +179,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint64(length)
|
msghdr.Controllen = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint64(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint64(length)
|
cmsg.Len = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,8 +34,8 @@ import (
|
||||||
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
|
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
|
||||||
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
||||||
//sys Setfsgid(gid int) (err error)
|
//sys setfsgid(gid int) (prev int, err error)
|
||||||
//sys Setfsuid(uid int) (err error)
|
//sys setfsuid(uid int) (prev int, err error)
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
//sysnb Setregid(rgid int, egid int) (err error)
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
||||||
|
@ -120,6 +120,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint64(length)
|
msghdr.Controllen = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint64(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint64(length)
|
cmsg.Len = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,8 +30,8 @@ package unix
|
||||||
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
|
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
|
||||||
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
||||||
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
|
||||||
//sys Setfsgid(gid int) (err error)
|
//sys setfsgid(gid int) (prev int, err error)
|
||||||
//sys Setfsuid(uid int) (err error)
|
//sys setfsuid(uid int) (prev int, err error)
|
||||||
//sysnb Setregid(rgid int, egid int) (err error)
|
//sysnb Setregid(rgid int, egid int) (err error)
|
||||||
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
|
||||||
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
|
||||||
|
@ -107,6 +107,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint64(length)
|
msghdr.Controllen = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint64(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint64(length)
|
cmsg.Len = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,23 +106,6 @@ func direntNamlen(buf []byte) (uint64, bool) {
|
||||||
return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
|
||||||
}
|
}
|
||||||
|
|
||||||
func SysctlClockinfo(name string) (*Clockinfo, error) {
|
|
||||||
mib, err := sysctlmib(name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
n := uintptr(SizeofClockinfo)
|
|
||||||
var ci Clockinfo
|
|
||||||
if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if n != SizeofClockinfo {
|
|
||||||
return nil, EIO
|
|
||||||
}
|
|
||||||
return &ci, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
//sysnb pipe() (fd1 int, fd2 int, err error)
|
//sysnb pipe() (fd1 int, fd2 int, err error)
|
||||||
func Pipe(p []int) (err error) {
|
func Pipe(p []int) (err error) {
|
||||||
if len(p) != 2 {
|
if len(p) != 2 {
|
||||||
|
@ -187,42 +170,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error {
|
||||||
|
|
||||||
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
||||||
|
|
||||||
// ioctl itself should not be exposed directly, but additional get/set
|
//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
|
||||||
// functions for specific types are permissible.
|
|
||||||
|
|
||||||
// IoctlSetInt performs an ioctl operation which sets an integer value
|
|
||||||
// on fd, using the specified request number.
|
|
||||||
func IoctlSetInt(fd int, req uint, value int) error {
|
|
||||||
return ioctl(fd, req, uintptr(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetWinsize(fd int, req uint, value *Winsize) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetTermios(fd int, req uint, value *Termios) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// IoctlGetInt performs an ioctl operation which gets an integer value
|
|
||||||
// from fd, using the specified request number.
|
|
||||||
func IoctlGetInt(fd int, req uint) (int, error) {
|
|
||||||
var value int
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
|
||||||
var value Winsize
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|
||||||
var value Termios
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetPtmget(fd int, req uint) (*Ptmget, error) {
|
func IoctlGetPtmget(fd int, req uint) (*Ptmget, error) {
|
||||||
var value Ptmget
|
var value Ptmget
|
||||||
|
@ -284,6 +232,14 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
return sendfile(outfd, infd, offset, count)
|
return sendfile(outfd, infd, offset, count)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Fstatvfs(fd int, buf *Statvfs_t) (err error) {
|
||||||
|
return Fstatvfs1(fd, buf, ST_WAIT)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Statvfs(path string, buf *Statvfs_t) (err error) {
|
||||||
|
return Statvfs1(path, buf, ST_WAIT)
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exposed directly
|
* Exposed directly
|
||||||
*/
|
*/
|
||||||
|
@ -297,6 +253,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
//sys Close(fd int) (err error)
|
//sys Close(fd int) (err error)
|
||||||
//sys Dup(fd int) (nfd int, err error)
|
//sys Dup(fd int) (nfd int, err error)
|
||||||
//sys Dup2(from int, to int) (err error)
|
//sys Dup2(from int, to int) (err error)
|
||||||
|
//sys Dup3(from int, to int, flags int) (err error)
|
||||||
//sys Exit(code int)
|
//sys Exit(code int)
|
||||||
//sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
|
//sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
|
||||||
//sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
|
//sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
|
||||||
|
@ -322,6 +279,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
//sys Fpathconf(fd int, name int) (val int, err error)
|
//sys Fpathconf(fd int, name int) (val int, err error)
|
||||||
//sys Fstat(fd int, stat *Stat_t) (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 Fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
|
||||||
|
//sys Fstatvfs1(fd int, buf *Statvfs_t, flags int) (err error) = SYS_FSTATVFS1
|
||||||
//sys Fsync(fd int) (err error)
|
//sys Fsync(fd int) (err error)
|
||||||
//sys Ftruncate(fd int, length int64) (err error)
|
//sys Ftruncate(fd int, length int64) (err error)
|
||||||
//sysnb Getegid() (egid int)
|
//sysnb Getegid() (egid int)
|
||||||
|
@ -365,7 +323,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
//sys Revoke(path string) (err error)
|
//sys Revoke(path string) (err error)
|
||||||
//sys Rmdir(path string) (err error)
|
//sys Rmdir(path string) (err error)
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
||||||
//sysnb Setegid(egid int) (err error)
|
//sysnb Setegid(egid int) (err error)
|
||||||
//sysnb Seteuid(euid int) (err error)
|
//sysnb Seteuid(euid int) (err error)
|
||||||
//sysnb Setgid(gid int) (err error)
|
//sysnb Setgid(gid int) (err error)
|
||||||
|
@ -378,6 +336,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
//sysnb Settimeofday(tp *Timeval) (err error)
|
//sysnb Settimeofday(tp *Timeval) (err error)
|
||||||
//sysnb Setuid(uid int) (err error)
|
//sysnb Setuid(uid int) (err error)
|
||||||
//sys Stat(path string, stat *Stat_t) (err error)
|
//sys Stat(path string, stat *Stat_t) (err error)
|
||||||
|
//sys Statvfs1(path string, buf *Statvfs_t, flags int) (err error) = SYS_STATVFS1
|
||||||
//sys Symlink(path string, link string) (err error)
|
//sys Symlink(path string, link string) (err error)
|
||||||
//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error)
|
//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error)
|
||||||
//sys Sync() (err error)
|
//sys Sync() (err error)
|
||||||
|
|
|
@ -28,6 +28,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,23 +55,6 @@ func direntNamlen(buf []byte) (uint64, bool) {
|
||||||
return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
|
return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
|
||||||
}
|
}
|
||||||
|
|
||||||
func SysctlClockinfo(name string) (*Clockinfo, error) {
|
|
||||||
mib, err := sysctlmib(name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
n := uintptr(SizeofClockinfo)
|
|
||||||
var ci Clockinfo
|
|
||||||
if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if n != SizeofClockinfo {
|
|
||||||
return nil, EIO
|
|
||||||
}
|
|
||||||
return &ci, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func SysctlUvmexp(name string) (*Uvmexp, error) {
|
func SysctlUvmexp(name string) (*Uvmexp, error) {
|
||||||
mib, err := sysctlmib(name)
|
mib, err := sysctlmib(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -89,16 +72,20 @@ func SysctlUvmexp(name string) (*Uvmexp, error) {
|
||||||
return &u, nil
|
return &u, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//sysnb pipe(p *[2]_C_int) (err error)
|
|
||||||
func Pipe(p []int) (err error) {
|
func Pipe(p []int) (err error) {
|
||||||
|
return Pipe2(p, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
//sysnb pipe2(p *[2]_C_int, flags int) (err error)
|
||||||
|
func Pipe2(p []int, flags int) error {
|
||||||
if len(p) != 2 {
|
if len(p) != 2 {
|
||||||
return EINVAL
|
return EINVAL
|
||||||
}
|
}
|
||||||
var pp [2]_C_int
|
var pp [2]_C_int
|
||||||
err = pipe(&pp)
|
err := pipe2(&pp, flags)
|
||||||
p[0] = int(pp[0])
|
p[0] = int(pp[0])
|
||||||
p[1] = int(pp[1])
|
p[1] = int(pp[1])
|
||||||
return
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
//sys Getdents(fd int, buf []byte) (n int, err error)
|
//sys Getdents(fd int, buf []byte) (n int, err error)
|
||||||
|
@ -178,42 +165,7 @@ func setattrlistTimes(path string, times []Timespec, flags int) error {
|
||||||
|
|
||||||
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
||||||
|
|
||||||
// ioctl itself should not be exposed directly, but additional get/set
|
//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
|
||||||
// functions for specific types are permissible.
|
|
||||||
|
|
||||||
// IoctlSetInt performs an ioctl operation which sets an integer value
|
|
||||||
// on fd, using the specified request number.
|
|
||||||
func IoctlSetInt(fd int, req uint, value int) error {
|
|
||||||
return ioctl(fd, req, uintptr(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetWinsize(fd int, req uint, value *Winsize) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetTermios(fd int, req uint, value *Termios) error {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// IoctlGetInt performs an ioctl operation which gets an integer value
|
|
||||||
// from fd, using the specified request number.
|
|
||||||
func IoctlGetInt(fd int, req uint) (int, error) {
|
|
||||||
var value int
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
|
||||||
var value Winsize
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|
||||||
var value Termios
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
//sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error)
|
//sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error)
|
||||||
|
|
||||||
|
@ -283,6 +235,7 @@ func Uname(uname *Utsname) error {
|
||||||
//sys Close(fd int) (err error)
|
//sys Close(fd int) (err error)
|
||||||
//sys Dup(fd int) (nfd int, err error)
|
//sys Dup(fd int) (nfd int, err error)
|
||||||
//sys Dup2(from int, to int) (err error)
|
//sys Dup2(from int, to int) (err error)
|
||||||
|
//sys Dup3(from int, to int, flags int) (err error)
|
||||||
//sys Exit(code int)
|
//sys Exit(code int)
|
||||||
//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
|
//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
|
||||||
//sys Fchdir(fd int) (err error)
|
//sys Fchdir(fd int) (err error)
|
||||||
|
@ -340,7 +293,7 @@ func Uname(uname *Utsname) error {
|
||||||
//sys Revoke(path string) (err error)
|
//sys Revoke(path string) (err error)
|
||||||
//sys Rmdir(path string) (err error)
|
//sys Rmdir(path string) (err error)
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
||||||
//sysnb Setegid(egid int) (err error)
|
//sysnb Setegid(egid int) (err error)
|
||||||
//sysnb Seteuid(euid int) (err error)
|
//sysnb Seteuid(euid int) (err error)
|
||||||
//sysnb Setgid(gid int) (err error)
|
//sysnb Setgid(gid int) (err error)
|
||||||
|
@ -387,7 +340,6 @@ func Uname(uname *Utsname) error {
|
||||||
// clock_settime
|
// clock_settime
|
||||||
// closefrom
|
// closefrom
|
||||||
// execve
|
// execve
|
||||||
// fcntl
|
|
||||||
// fhopen
|
// fhopen
|
||||||
// fhstat
|
// fhstat
|
||||||
// fhstatfs
|
// fhstatfs
|
||||||
|
|
|
@ -28,6 +28,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,10 @@ func (msghdr *Msghdr) SetControllen(length int) {
|
||||||
msghdr.Controllen = uint32(length)
|
msghdr.Controllen = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = uint32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -391,7 +391,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
|
||||||
for n < len(pp.Path) && pp.Path[n] != 0 {
|
for n < len(pp.Path) && pp.Path[n] != 0 {
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
|
bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
|
||||||
sa.Name = string(bytes)
|
sa.Name = string(bytes)
|
||||||
return sa, nil
|
return sa, nil
|
||||||
|
|
||||||
|
@ -553,40 +553,10 @@ func Minor(dev uint64) uint32 {
|
||||||
|
|
||||||
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
//sys ioctl(fd int, req uint, arg uintptr) (err error)
|
||||||
|
|
||||||
func IoctlSetInt(fd int, req uint, value int) (err error) {
|
|
||||||
return ioctl(fd, req, uintptr(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetWinsize(fd int, req uint, value *Winsize) (err error) {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ioctlSetTermios(fd int, req uint, value *Termios) (err error) {
|
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlSetTermio(fd int, req uint, value *Termio) (err error) {
|
func IoctlSetTermio(fd int, req uint, value *Termio) (err error) {
|
||||||
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func IoctlGetInt(fd int, req uint) (int, error) {
|
|
||||||
var value int
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
|
|
||||||
var value Winsize
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetTermios(fd int, req uint) (*Termios, error) {
|
|
||||||
var value Termios
|
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
|
||||||
return &value, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func IoctlGetTermio(fd int, req uint) (*Termio, error) {
|
func IoctlGetTermio(fd int, req uint) (*Termio, error) {
|
||||||
var value Termio
|
var value Termio
|
||||||
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
|
||||||
|
@ -679,7 +649,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
|
||||||
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
|
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
|
||||||
//sys Rmdir(path string) (err error)
|
//sys Rmdir(path string) (err error)
|
||||||
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek
|
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek
|
||||||
//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
|
//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
|
||||||
//sysnb Setegid(egid int) (err error)
|
//sysnb Setegid(egid int) (err error)
|
||||||
//sysnb Seteuid(euid int) (err error)
|
//sysnb Seteuid(euid int) (err error)
|
||||||
//sysnb Setgid(gid int) (err error)
|
//sysnb Setgid(gid int) (err error)
|
||||||
|
|
|
@ -18,6 +18,10 @@ func (iov *Iovec) SetLen(length int) {
|
||||||
iov.Len = uint64(length)
|
iov.Len = uint64(length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msghdr *Msghdr) SetIovlen(length int) {
|
||||||
|
msghdr.Iovlen = int32(length)
|
||||||
|
}
|
||||||
|
|
||||||
func (cmsg *Cmsghdr) SetLen(length int) {
|
func (cmsg *Cmsghdr) SetLen(length int) {
|
||||||
cmsg.Len = uint32(length)
|
cmsg.Len = uint32(length)
|
||||||
}
|
}
|
||||||
|
|
|
@ -459,6 +459,15 @@ const (
|
||||||
MAP_SHARED = 0x1
|
MAP_SHARED = 0x1
|
||||||
MAP_TYPE = 0xf0
|
MAP_TYPE = 0xf0
|
||||||
MAP_VARIABLE = 0x0
|
MAP_VARIABLE = 0x0
|
||||||
|
MCAST_BLOCK_SOURCE = 0x40
|
||||||
|
MCAST_EXCLUDE = 0x2
|
||||||
|
MCAST_INCLUDE = 0x1
|
||||||
|
MCAST_JOIN_GROUP = 0x3e
|
||||||
|
MCAST_JOIN_SOURCE_GROUP = 0x42
|
||||||
|
MCAST_LEAVE_GROUP = 0x3f
|
||||||
|
MCAST_LEAVE_SOURCE_GROUP = 0x43
|
||||||
|
MCAST_SOURCE_FILTER = 0x49
|
||||||
|
MCAST_UNBLOCK_SOURCE = 0x41
|
||||||
MCL_CURRENT = 0x100
|
MCL_CURRENT = 0x100
|
||||||
MCL_FUTURE = 0x200
|
MCL_FUTURE = 0x200
|
||||||
MSG_ANY = 0x4
|
MSG_ANY = 0x4
|
||||||
|
@ -483,6 +492,7 @@ const (
|
||||||
MS_INVALIDATE = 0x40
|
MS_INVALIDATE = 0x40
|
||||||
MS_PER_SEC = 0x3e8
|
MS_PER_SEC = 0x3e8
|
||||||
MS_SYNC = 0x20
|
MS_SYNC = 0x20
|
||||||
|
NFDBITS = 0x20
|
||||||
NL0 = 0x0
|
NL0 = 0x0
|
||||||
NL1 = 0x4000
|
NL1 = 0x4000
|
||||||
NL2 = 0x8000
|
NL2 = 0x8000
|
||||||
|
@ -688,7 +698,7 @@ const (
|
||||||
SIOCGHIWAT = 0x40047301
|
SIOCGHIWAT = 0x40047301
|
||||||
SIOCGIFADDR = -0x3fd796df
|
SIOCGIFADDR = -0x3fd796df
|
||||||
SIOCGIFADDRS = 0x2000698c
|
SIOCGIFADDRS = 0x2000698c
|
||||||
SIOCGIFBAUDRATE = -0x3fd79693
|
SIOCGIFBAUDRATE = -0x3fdf9669
|
||||||
SIOCGIFBRDADDR = -0x3fd796dd
|
SIOCGIFBRDADDR = -0x3fd796dd
|
||||||
SIOCGIFCONF = -0x3ff796bb
|
SIOCGIFCONF = -0x3ff796bb
|
||||||
SIOCGIFCONFGLOB = -0x3ff79670
|
SIOCGIFCONFGLOB = -0x3ff79670
|
||||||
|
|
|
@ -459,6 +459,15 @@ const (
|
||||||
MAP_SHARED = 0x1
|
MAP_SHARED = 0x1
|
||||||
MAP_TYPE = 0xf0
|
MAP_TYPE = 0xf0
|
||||||
MAP_VARIABLE = 0x0
|
MAP_VARIABLE = 0x0
|
||||||
|
MCAST_BLOCK_SOURCE = 0x40
|
||||||
|
MCAST_EXCLUDE = 0x2
|
||||||
|
MCAST_INCLUDE = 0x1
|
||||||
|
MCAST_JOIN_GROUP = 0x3e
|
||||||
|
MCAST_JOIN_SOURCE_GROUP = 0x42
|
||||||
|
MCAST_LEAVE_GROUP = 0x3f
|
||||||
|
MCAST_LEAVE_SOURCE_GROUP = 0x43
|
||||||
|
MCAST_SOURCE_FILTER = 0x49
|
||||||
|
MCAST_UNBLOCK_SOURCE = 0x41
|
||||||
MCL_CURRENT = 0x100
|
MCL_CURRENT = 0x100
|
||||||
MCL_FUTURE = 0x200
|
MCL_FUTURE = 0x200
|
||||||
MSG_ANY = 0x4
|
MSG_ANY = 0x4
|
||||||
|
@ -483,6 +492,7 @@ const (
|
||||||
MS_INVALIDATE = 0x40
|
MS_INVALIDATE = 0x40
|
||||||
MS_PER_SEC = 0x3e8
|
MS_PER_SEC = 0x3e8
|
||||||
MS_SYNC = 0x20
|
MS_SYNC = 0x20
|
||||||
|
NFDBITS = 0x40
|
||||||
NL0 = 0x0
|
NL0 = 0x0
|
||||||
NL1 = 0x4000
|
NL1 = 0x4000
|
||||||
NL2 = 0x8000
|
NL2 = 0x8000
|
||||||
|
@ -688,7 +698,7 @@ const (
|
||||||
SIOCGHIWAT = 0x40047301
|
SIOCGHIWAT = 0x40047301
|
||||||
SIOCGIFADDR = -0x3fd796df
|
SIOCGIFADDR = -0x3fd796df
|
||||||
SIOCGIFADDRS = 0x2000698c
|
SIOCGIFADDRS = 0x2000698c
|
||||||
SIOCGIFBAUDRATE = -0x3fd79693
|
SIOCGIFBAUDRATE = -0x3fdf9669
|
||||||
SIOCGIFBRDADDR = -0x3fd796dd
|
SIOCGIFBRDADDR = -0x3fd796dd
|
||||||
SIOCGIFCONF = -0x3fef96bb
|
SIOCGIFCONF = -0x3fef96bb
|
||||||
SIOCGIFCONFGLOB = -0x3fef9670
|
SIOCGIFCONFGLOB = -0x3fef9670
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
// +build 386,darwin
|
// +build 386,darwin
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs -- -m32 _const.go
|
// cgo -godefs -- -m32 _const.go
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
@ -980,6 +980,7 @@ const (
|
||||||
NET_RT_MAXID = 0xa
|
NET_RT_MAXID = 0xa
|
||||||
NET_RT_STAT = 0x4
|
NET_RT_STAT = 0x4
|
||||||
NET_RT_TRASH = 0x5
|
NET_RT_TRASH = 0x5
|
||||||
|
NFDBITS = 0x20
|
||||||
NL0 = 0x0
|
NL0 = 0x0
|
||||||
NL1 = 0x100
|
NL1 = 0x100
|
||||||
NL2 = 0x200
|
NL2 = 0x200
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
// +build amd64,darwin
|
// +build amd64,darwin
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs -- -m64 _const.go
|
// cgo -godefs -- -m64 _const.go
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
@ -980,6 +980,7 @@ const (
|
||||||
NET_RT_MAXID = 0xa
|
NET_RT_MAXID = 0xa
|
||||||
NET_RT_STAT = 0x4
|
NET_RT_STAT = 0x4
|
||||||
NET_RT_TRASH = 0x5
|
NET_RT_TRASH = 0x5
|
||||||
|
NFDBITS = 0x20
|
||||||
NL0 = 0x0
|
NL0 = 0x0
|
||||||
NL1 = 0x100
|
NL1 = 0x100
|
||||||
NL2 = 0x200
|
NL2 = 0x200
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
// +build arm,darwin
|
// +build arm,darwin
|
||||||
|
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
|
||||||
// cgo -godefs -- _const.go
|
// cgo -godefs -- _const.go
|
||||||
|
|
||||||
package unix
|
package unix
|
||||||
|
@ -980,6 +980,7 @@ const (
|
||||||
NET_RT_MAXID = 0xa
|
NET_RT_MAXID = 0xa
|
||||||
NET_RT_STAT = 0x4
|
NET_RT_STAT = 0x4
|
||||||
NET_RT_TRASH = 0x5
|
NET_RT_TRASH = 0x5
|
||||||
|
NFDBITS = 0x20
|
||||||
NL0 = 0x0
|
NL0 = 0x0
|
||||||
NL1 = 0x100
|
NL1 = 0x100
|
||||||
NL2 = 0x200
|
NL2 = 0x200
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue