mirror of
				https://github.com/cheat/cheat.git
				synced 2025-11-04 07:45:28 +01:00 
			
		
		
		
	@@ -9,13 +9,13 @@ On Unix-like systems, you may simply paste the following snippet into your termi
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
cd /tmp \
 | 
			
		||||
  && wget https://github.com/cheat/cheat/releases/download/4.3.3/cheat-linux-amd64.gz \
 | 
			
		||||
  && wget https://github.com/cheat/cheat/releases/download/4.4.0/cheat-linux-amd64.gz \
 | 
			
		||||
  && gunzip cheat-linux-amd64.gz \
 | 
			
		||||
  && chmod +x cheat-linux-amd64 \
 | 
			
		||||
  && sudo mv cheat-linux-amd64 /usr/local/bin/cheat
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You may need to need to change the version number (`4.3.3`) and the archive
 | 
			
		||||
You may need to need to change the version number (`4.4.0`) and the archive
 | 
			
		||||
(`cheat-linux-amd64.gz`) depending on your platform.
 | 
			
		||||
 | 
			
		||||
See the [releases page][releases] for a list of supported platforms.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								Makefile
									
									
									
									
									
								
							@@ -35,13 +35,17 @@ releases :=                        \
 | 
			
		||||
	$(dist_dir)/cheat-linux-amd64  \
 | 
			
		||||
	$(dist_dir)/cheat-linux-arm5   \
 | 
			
		||||
	$(dist_dir)/cheat-linux-arm6   \
 | 
			
		||||
	$(dist_dir)/cheat-linux-arm7   \
 | 
			
		||||
	$(dist_dir)/cheat-linux-arm64  \
 | 
			
		||||
	$(dist_dir)/cheat-linux-arm7   \
 | 
			
		||||
	$(dist_dir)/cheat-netbsd-amd64  \
 | 
			
		||||
	$(dist_dir)/cheat-openbsd-amd64  \
 | 
			
		||||
	$(dist_dir)/cheat-plan9-amd64  \
 | 
			
		||||
	$(dist_dir)/cheat-solaris-amd64  \
 | 
			
		||||
	$(dist_dir)/cheat-windows-amd64.exe
 | 
			
		||||
 | 
			
		||||
## build: build an executable for your architecture
 | 
			
		||||
.PHONY: build
 | 
			
		||||
build: $(dist_dir) | clean generate fmt lint vet vendor man
 | 
			
		||||
build: | clean $(dist_dir) generate fmt lint vet vendor man
 | 
			
		||||
	$(GO) build $(BUILD_FLAGS) -o $(dist_dir)/cheat $(cmd_dir)
 | 
			
		||||
 | 
			
		||||
## build-release: build release executables
 | 
			
		||||
@@ -83,6 +87,26 @@ $(dist_dir)/cheat-linux-arm64: prepare
 | 
			
		||||
	GOARCH=arm64 GOOS=linux \
 | 
			
		||||
	$(GO) build $(BUILD_FLAGS) -o $@ $(cmd_dir) && $(GZIP) $@ && chmod -x $@.gz
 | 
			
		||||
 | 
			
		||||
# cheat-netbsd-amd64
 | 
			
		||||
$(dist_dir)/cheat-netbsd-amd64: prepare
 | 
			
		||||
	GOARCH=amd64 GOOS=netbsd \
 | 
			
		||||
	$(GO) build $(BUILD_FLAGS) -o $@ $(cmd_dir) && $(GZIP) $@ && chmod -x $@.gz
 | 
			
		||||
 | 
			
		||||
# cheat-openbsd-amd64
 | 
			
		||||
$(dist_dir)/cheat-openbsd-amd64: prepare
 | 
			
		||||
	GOARCH=amd64 GOOS=openbsd \
 | 
			
		||||
	$(GO) build $(BUILD_FLAGS) -o $@ $(cmd_dir) && $(GZIP) $@ && chmod -x $@.gz
 | 
			
		||||
 | 
			
		||||
# cheat-plan9-amd64
 | 
			
		||||
$(dist_dir)/cheat-plan9-amd64: prepare
 | 
			
		||||
	GOARCH=amd64 GOOS=plan9 \
 | 
			
		||||
	$(GO) build $(BUILD_FLAGS) -o $@ $(cmd_dir) && $(GZIP) $@ && chmod -x $@.gz
 | 
			
		||||
 | 
			
		||||
# cheat-solaris-amd64
 | 
			
		||||
$(dist_dir)/cheat-solaris-amd64: prepare
 | 
			
		||||
	GOARCH=amd64 GOOS=solaris \
 | 
			
		||||
	$(GO) build $(BUILD_FLAGS) -o $@ $(cmd_dir) && $(GZIP) $@ && chmod -x $@.gz
 | 
			
		||||
 | 
			
		||||
# cheat-windows-amd64
 | 
			
		||||
$(dist_dir)/cheat-windows-amd64.exe: prepare
 | 
			
		||||
	GOARCH=amd64 GOOS=windows \
 | 
			
		||||
@@ -103,7 +127,7 @@ install: build
 | 
			
		||||
 | 
			
		||||
## clean: remove compiled executables
 | 
			
		||||
.PHONY: clean
 | 
			
		||||
clean: $(dist_dir)
 | 
			
		||||
clean:
 | 
			
		||||
	$(RM) -f $(dist_dir)/* $(cmd_dir)/str_config.go $(cmd_dir)/str_usage.go
 | 
			
		||||
 | 
			
		||||
## distclean: remove the tags file
 | 
			
		||||
@@ -140,7 +164,7 @@ vendor:
 | 
			
		||||
 | 
			
		||||
## vendor-update: update vendored dependencies
 | 
			
		||||
vendor-update:
 | 
			
		||||
	$(GO) get -t -u ./... && $(GO) mod vendor
 | 
			
		||||
	$(GO) get -t -u ./... && $(GO) mod vendor && $(GO) mod tidy && $(GO) mod verify
 | 
			
		||||
 | 
			
		||||
## fmt: run go fmt
 | 
			
		||||
.PHONY: fmt
 | 
			
		||||
@@ -173,7 +197,7 @@ coverage:
 | 
			
		||||
check: | vendor fmt lint vet test
 | 
			
		||||
 | 
			
		||||
.PHONY: prepare
 | 
			
		||||
prepare: | $(dist_dir) clean generate vendor fmt lint vet test
 | 
			
		||||
prepare: | clean $(dist_dir) generate vendor fmt lint vet test
 | 
			
		||||
 | 
			
		||||
## docker-setup: create a docker image for use during development
 | 
			
		||||
.PHONY: docker-setup
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ import (
 | 
			
		||||
	"github.com/cheat/cheat/internal/installer"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const version = "4.3.3"
 | 
			
		||||
const version = "4.4.0"
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								go.mod
									
									
									
									
									
								
							@@ -9,13 +9,12 @@ require (
 | 
			
		||||
	github.com/go-git/go-git/v5 v5.4.2
 | 
			
		||||
	github.com/mattn/go-isatty v0.0.16
 | 
			
		||||
	github.com/mitchellh/go-homedir v1.1.0
 | 
			
		||||
	gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0
 | 
			
		||||
	gopkg.in/yaml.v2 v2.4.0
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/Microsoft/go-winio v0.5.2 // indirect
 | 
			
		||||
	github.com/ProtonMail/go-crypto v0.0.0-20220824120805-4b6e5c587895 // indirect
 | 
			
		||||
	github.com/Microsoft/go-winio v0.6.0 // indirect
 | 
			
		||||
	github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4 // indirect
 | 
			
		||||
	github.com/acomagu/bufpipe v1.0.3 // indirect
 | 
			
		||||
	github.com/cloudflare/circl v1.2.0 // indirect
 | 
			
		||||
	github.com/dlclark/regexp2 v1.7.0 // indirect
 | 
			
		||||
@@ -27,8 +26,10 @@ require (
 | 
			
		||||
	github.com/kevinburke/ssh_config v1.2.0 // indirect
 | 
			
		||||
	github.com/sergi/go-diff v1.2.0 // indirect
 | 
			
		||||
	github.com/xanzy/ssh-agent v0.3.2 // indirect
 | 
			
		||||
	golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d // indirect
 | 
			
		||||
	golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b // indirect
 | 
			
		||||
	golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64 // indirect
 | 
			
		||||
	golang.org/x/crypto v0.1.0 // indirect
 | 
			
		||||
	golang.org/x/mod v0.6.0 // indirect
 | 
			
		||||
	golang.org/x/net v0.1.0 // indirect
 | 
			
		||||
	golang.org/x/sys v0.1.0 // indirect
 | 
			
		||||
	golang.org/x/tools v0.2.0 // indirect
 | 
			
		||||
	gopkg.in/warnings.v0 v0.1.2 // indirect
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								go.sum
									
									
									
									
									
								
							@@ -1,10 +1,11 @@
 | 
			
		||||
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
 | 
			
		||||
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
 | 
			
		||||
github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA=
 | 
			
		||||
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
 | 
			
		||||
github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
 | 
			
		||||
github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
 | 
			
		||||
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo=
 | 
			
		||||
github.com/ProtonMail/go-crypto v0.0.0-20220824120805-4b6e5c587895 h1:NsReiLpErIPzRrnogAXYwSoU7txA977LjDGrbkewJbg=
 | 
			
		||||
github.com/ProtonMail/go-crypto v0.0.0-20220824120805-4b6e5c587895/go.mod h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8=
 | 
			
		||||
github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4 h1:ra2OtmuW0AE5csawV4YXMNGNQQXvLRps3z2Z59OPO+I=
 | 
			
		||||
github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4/go.mod h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8=
 | 
			
		||||
github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk=
 | 
			
		||||
github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
 | 
			
		||||
github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek=
 | 
			
		||||
@@ -93,13 +94,15 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d h1:3qF+Z8Hkrw9sOhrFHti9TlB1Hkac1x+DNRkv0XQiFjo=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 | 
			
		||||
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
 | 
			
		||||
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
 | 
			
		||||
golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
 | 
			
		||||
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
 | 
			
		||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
 | 
			
		||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY=
 | 
			
		||||
golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 | 
			
		||||
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
 | 
			
		||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
@@ -116,14 +119,16 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc
 | 
			
		||||
golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64 h1:UiNENfZ8gDvpiWw7IpOMQ27spWmThO1RwwdQVbJahJM=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
 | 
			
		||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
 | 
			
		||||
golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw=
 | 
			
		||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
 | 
			
		||||
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
 | 
			
		||||
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
@@ -131,8 +136,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
 | 
			
		||||
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
 | 
			
		||||
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 h1:POO/ycCATvegFmVuPpQzZFJ+pGZeX22Ufu6fibxDVjU=
 | 
			
		||||
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,10 @@ func Paths(
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch sys {
 | 
			
		||||
	case "android", "darwin", "linux", "freebsd":
 | 
			
		||||
 | 
			
		||||
	// darwin/linux/unix
 | 
			
		||||
	case "aix", "android", "darwin", "dragonfly", "freebsd", "illumos", "ios",
 | 
			
		||||
		"linux", "netbsd", "openbsd", "plan9", "solaris":
 | 
			
		||||
		paths := []string{}
 | 
			
		||||
 | 
			
		||||
		// don't include the `XDG_CONFIG_HOME` path if that envvar is not set
 | 
			
		||||
@@ -43,6 +46,8 @@ func Paths(
 | 
			
		||||
		}...)
 | 
			
		||||
 | 
			
		||||
		return paths, nil
 | 
			
		||||
 | 
			
		||||
	// windows
 | 
			
		||||
	case "windows":
 | 
			
		||||
		return []string{
 | 
			
		||||
			filepath.Join(envvars["APPDATA"], "cheat", "conf.yml"),
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ import (
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"gopkg.in/yaml.v1"
 | 
			
		||||
	"gopkg.in/yaml.v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Parse parses cheatsheet frontmatter
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/Microsoft/go-winio/.gitattributes
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/Microsoft/go-winio/.gitattributes
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
* text=auto eol=lf
 | 
			
		||||
							
								
								
									
										9
									
								
								vendor/github.com/Microsoft/go-winio/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/Microsoft/go-winio/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1 +1,10 @@
 | 
			
		||||
.vscode/
 | 
			
		||||
 | 
			
		||||
*.exe
 | 
			
		||||
 | 
			
		||||
# testing
 | 
			
		||||
testdata
 | 
			
		||||
 | 
			
		||||
# go workspaces
 | 
			
		||||
go.work
 | 
			
		||||
go.work.sum
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										144
									
								
								vendor/github.com/Microsoft/go-winio/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								vendor/github.com/Microsoft/go-winio/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,144 @@
 | 
			
		||||
run:
 | 
			
		||||
  skip-dirs:
 | 
			
		||||
    - pkg/etw/sample
 | 
			
		||||
 | 
			
		||||
linters:
 | 
			
		||||
  enable:
 | 
			
		||||
    # style
 | 
			
		||||
    - containedctx # struct contains a context
 | 
			
		||||
    - dupl # duplicate code
 | 
			
		||||
    - errname # erorrs are named correctly
 | 
			
		||||
    - goconst # strings that should be constants
 | 
			
		||||
    - godot # comments end in a period
 | 
			
		||||
    - misspell
 | 
			
		||||
    - nolintlint # "//nolint" directives are properly explained
 | 
			
		||||
    - revive # golint replacement
 | 
			
		||||
    - stylecheck # golint replacement, less configurable than revive
 | 
			
		||||
    - unconvert # unnecessary conversions
 | 
			
		||||
    - wastedassign
 | 
			
		||||
 | 
			
		||||
    # bugs, performance, unused, etc ...
 | 
			
		||||
    - contextcheck # function uses a non-inherited context
 | 
			
		||||
    - errorlint # errors not wrapped for 1.13
 | 
			
		||||
    - exhaustive # check exhaustiveness of enum switch statements
 | 
			
		||||
    - gofmt # files are gofmt'ed
 | 
			
		||||
    - gosec # security
 | 
			
		||||
    - nestif # deeply nested ifs
 | 
			
		||||
    - nilerr # returns nil even with non-nil error
 | 
			
		||||
    - prealloc # slices that can be pre-allocated
 | 
			
		||||
    - structcheck # unused struct fields
 | 
			
		||||
    - unparam # unused function params
 | 
			
		||||
 | 
			
		||||
issues:
 | 
			
		||||
  exclude-rules:
 | 
			
		||||
    # err is very often shadowed in nested scopes
 | 
			
		||||
    - linters:
 | 
			
		||||
        - govet
 | 
			
		||||
      text: '^shadow: declaration of "err" shadows declaration'
 | 
			
		||||
 | 
			
		||||
    # ignore long lines for skip autogen directives
 | 
			
		||||
    - linters:
 | 
			
		||||
        - revive
 | 
			
		||||
      text: "^line-length-limit: "
 | 
			
		||||
      source: "^//(go:generate|sys) "
 | 
			
		||||
 | 
			
		||||
    # allow unjustified ignores of error checks in defer statements
 | 
			
		||||
    - linters:
 | 
			
		||||
        - nolintlint
 | 
			
		||||
      text: "^directive `//nolint:errcheck` should provide explanation"
 | 
			
		||||
      source: '^\s*defer '
 | 
			
		||||
 | 
			
		||||
    # allow unjustified ignores of error lints for io.EOF
 | 
			
		||||
    - linters:
 | 
			
		||||
        - nolintlint
 | 
			
		||||
      text: "^directive `//nolint:errorlint` should provide explanation"
 | 
			
		||||
      source: '[=|!]= io.EOF'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
linters-settings:
 | 
			
		||||
  govet:
 | 
			
		||||
    enable-all: true
 | 
			
		||||
    disable:
 | 
			
		||||
      # struct order is often for Win32 compat
 | 
			
		||||
      # also, ignore pointer bytes/GC issues for now until performance becomes an issue
 | 
			
		||||
      - fieldalignment
 | 
			
		||||
    check-shadowing: true
 | 
			
		||||
  nolintlint:
 | 
			
		||||
    allow-leading-space: false
 | 
			
		||||
    require-explanation: true
 | 
			
		||||
    require-specific: true
 | 
			
		||||
  revive:
 | 
			
		||||
    # revive is more configurable than static check, so likely the preferred alternative to static-check
 | 
			
		||||
    # (once the perf issue is solved: https://github.com/golangci/golangci-lint/issues/2997)
 | 
			
		||||
    enable-all-rules:
 | 
			
		||||
      true
 | 
			
		||||
      # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md
 | 
			
		||||
    rules:
 | 
			
		||||
      # rules with required arguments
 | 
			
		||||
      - name: argument-limit
 | 
			
		||||
        disabled: true
 | 
			
		||||
      - name: banned-characters
 | 
			
		||||
        disabled: true
 | 
			
		||||
      - name: cognitive-complexity
 | 
			
		||||
        disabled: true
 | 
			
		||||
      - name: cyclomatic
 | 
			
		||||
        disabled: true
 | 
			
		||||
      - name: file-header
 | 
			
		||||
        disabled: true
 | 
			
		||||
      - name: function-length
 | 
			
		||||
        disabled: true
 | 
			
		||||
      - name: function-result-limit
 | 
			
		||||
        disabled: true
 | 
			
		||||
      - name: max-public-structs
 | 
			
		||||
        disabled: true
 | 
			
		||||
      # geneally annoying rules
 | 
			
		||||
      - name: add-constant # complains about any and all strings and integers
 | 
			
		||||
        disabled: true
 | 
			
		||||
      - name: confusing-naming # we frequently use "Foo()" and "foo()" together
 | 
			
		||||
        disabled: true
 | 
			
		||||
      - name: flag-parameter # excessive, and a common idiom we use
 | 
			
		||||
        disabled: true
 | 
			
		||||
      # general config
 | 
			
		||||
      - name: line-length-limit
 | 
			
		||||
        arguments:
 | 
			
		||||
          - 140
 | 
			
		||||
      - name: var-naming
 | 
			
		||||
        arguments:
 | 
			
		||||
          - []
 | 
			
		||||
          - - CID
 | 
			
		||||
            - CRI
 | 
			
		||||
            - CTRD
 | 
			
		||||
            - DACL
 | 
			
		||||
            - DLL
 | 
			
		||||
            - DOS
 | 
			
		||||
            - ETW
 | 
			
		||||
            - FSCTL
 | 
			
		||||
            - GCS
 | 
			
		||||
            - GMSA
 | 
			
		||||
            - HCS
 | 
			
		||||
            - HV
 | 
			
		||||
            - IO
 | 
			
		||||
            - LCOW
 | 
			
		||||
            - LDAP
 | 
			
		||||
            - LPAC
 | 
			
		||||
            - LTSC
 | 
			
		||||
            - MMIO
 | 
			
		||||
            - NT
 | 
			
		||||
            - OCI
 | 
			
		||||
            - PMEM
 | 
			
		||||
            - PWSH
 | 
			
		||||
            - RX
 | 
			
		||||
            - SACl
 | 
			
		||||
            - SID
 | 
			
		||||
            - SMB
 | 
			
		||||
            - TX
 | 
			
		||||
            - VHD
 | 
			
		||||
            - VHDX
 | 
			
		||||
            - VMID
 | 
			
		||||
            - VPCI
 | 
			
		||||
            - WCOW
 | 
			
		||||
            - WIM
 | 
			
		||||
  stylecheck:
 | 
			
		||||
    checks:
 | 
			
		||||
      - "all"
 | 
			
		||||
      - "-ST1003" # use revive's var naming
 | 
			
		||||
							
								
								
									
										74
									
								
								vendor/github.com/Microsoft/go-winio/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										74
									
								
								vendor/github.com/Microsoft/go-winio/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -13,16 +13,60 @@ Please see the LICENSE file for licensing information.
 | 
			
		||||
 | 
			
		||||
## Contributing
 | 
			
		||||
 | 
			
		||||
This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA)
 | 
			
		||||
declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com.
 | 
			
		||||
This project welcomes contributions and suggestions.
 | 
			
		||||
Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that
 | 
			
		||||
you have the right to, and actually do, grant us the rights to use your contribution.
 | 
			
		||||
For details, visit [Microsoft CLA](https://cla.microsoft.com).
 | 
			
		||||
 | 
			
		||||
When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR
 | 
			
		||||
appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.
 | 
			
		||||
When you submit a pull request, a CLA-bot will automatically determine whether you need to
 | 
			
		||||
provide a CLA and decorate the PR appropriately (e.g., label, comment).
 | 
			
		||||
Simply follow the instructions provided by the bot.
 | 
			
		||||
You will only need to do this once across all repos using our CLA.
 | 
			
		||||
 | 
			
		||||
We also require that contributors sign their commits using git commit -s or git commit --signoff to certify they either authored the work themselves
 | 
			
		||||
or otherwise have permission to use it in this project. Please see https://developercertificate.org/ for more info, as well as to make sure that you can
 | 
			
		||||
attest to the rules listed. Our CI uses the DCO Github app to ensure that all commits in a given PR are signed-off.
 | 
			
		||||
Additionally, the pull request pipeline requires the following steps to be performed before
 | 
			
		||||
mergining.
 | 
			
		||||
 | 
			
		||||
### Code Sign-Off
 | 
			
		||||
 | 
			
		||||
We require that contributors sign their commits using [`git commit --signoff`][git-commit-s]
 | 
			
		||||
to certify they either authored the work themselves or otherwise have permission to use it in this project.
 | 
			
		||||
 | 
			
		||||
A range of commits can be signed off using [`git rebase --signoff`][git-rebase-s].
 | 
			
		||||
 | 
			
		||||
Please see [the developer certificate](https://developercertificate.org) for more info,
 | 
			
		||||
as well as to make sure that you can attest to the rules listed.
 | 
			
		||||
Our CI uses the DCO Github app to ensure that all commits in a given PR are signed-off.
 | 
			
		||||
 | 
			
		||||
### Linting
 | 
			
		||||
 | 
			
		||||
Code must pass a linting stage, which uses [`golangci-lint`][lint].
 | 
			
		||||
The linting settings are stored in [`.golangci.yaml`](./.golangci.yaml), and can be run
 | 
			
		||||
automatically with VSCode by adding the following to your workspace or folder settings:
 | 
			
		||||
 | 
			
		||||
```json
 | 
			
		||||
    "go.lintTool": "golangci-lint",
 | 
			
		||||
    "go.lintOnSave": "package",
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Additional editor [integrations options are also available][lint-ide].
 | 
			
		||||
 | 
			
		||||
Alternatively, `golangci-lint` can be [installed locally][lint-install] and run from the repo root:
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
# use . or specify a path to only lint a package
 | 
			
		||||
# to show all lint errors, use flags "--max-issues-per-linter=0 --max-same-issues=0"
 | 
			
		||||
> golangci-lint run ./...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Go Generate
 | 
			
		||||
 | 
			
		||||
The pipeline checks that auto-generated code, via `go generate`, are up to date.
 | 
			
		||||
 | 
			
		||||
This can be done for the entire repo:
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
> go generate ./...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Code of Conduct
 | 
			
		||||
 | 
			
		||||
@@ -30,8 +74,16 @@ This project has adopted the [Microsoft Open Source Code of Conduct](https://ope
 | 
			
		||||
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
 | 
			
		||||
contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Special Thanks
 | 
			
		||||
Thanks to natefinch for the inspiration for this library. See https://github.com/natefinch/npipe
 | 
			
		||||
for another named pipe implementation.
 | 
			
		||||
 | 
			
		||||
Thanks to [natefinch][natefinch] for the inspiration for this library.
 | 
			
		||||
See [npipe](https://github.com/natefinch/npipe) for another named pipe implementation.
 | 
			
		||||
 | 
			
		||||
[lint]: https://golangci-lint.run/
 | 
			
		||||
[lint-ide]: https://golangci-lint.run/usage/integrations/#editor-integration
 | 
			
		||||
[lint-install]: https://golangci-lint.run/usage/install/#local-installation
 | 
			
		||||
 | 
			
		||||
[git-commit-s]: https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--s
 | 
			
		||||
[git-rebase-s]: https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---signoff
 | 
			
		||||
 | 
			
		||||
[natefinch]: https://github.com/natefinch
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										41
									
								
								vendor/github.com/Microsoft/go-winio/SECURITY.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/Microsoft/go-winio/SECURITY.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->
 | 
			
		||||
 | 
			
		||||
## Security
 | 
			
		||||
 | 
			
		||||
Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
 | 
			
		||||
 | 
			
		||||
If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.
 | 
			
		||||
 | 
			
		||||
## Reporting Security Issues
 | 
			
		||||
 | 
			
		||||
**Please do not report security vulnerabilities through public GitHub issues.**
 | 
			
		||||
 | 
			
		||||
Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).
 | 
			
		||||
 | 
			
		||||
If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).
 | 
			
		||||
 | 
			
		||||
You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). 
 | 
			
		||||
 | 
			
		||||
Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
 | 
			
		||||
 | 
			
		||||
  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
 | 
			
		||||
  * Full paths of source file(s) related to the manifestation of the issue
 | 
			
		||||
  * The location of the affected source code (tag/branch/commit or direct URL)
 | 
			
		||||
  * Any special configuration required to reproduce the issue
 | 
			
		||||
  * Step-by-step instructions to reproduce the issue
 | 
			
		||||
  * Proof-of-concept or exploit code (if possible)
 | 
			
		||||
  * Impact of the issue, including how an attacker might exploit the issue
 | 
			
		||||
 | 
			
		||||
This information will help us triage your report more quickly.
 | 
			
		||||
 | 
			
		||||
If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.
 | 
			
		||||
 | 
			
		||||
## Preferred Languages
 | 
			
		||||
 | 
			
		||||
We prefer all communications to be in English.
 | 
			
		||||
 | 
			
		||||
## Policy
 | 
			
		||||
 | 
			
		||||
Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).
 | 
			
		||||
 | 
			
		||||
<!-- END MICROSOFT SECURITY.MD BLOCK -->
 | 
			
		||||
							
								
								
									
										48
									
								
								vendor/github.com/Microsoft/go-winio/backup.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								vendor/github.com/Microsoft/go-winio/backup.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,4 @@
 | 
			
		||||
//go:build windows
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package winio
 | 
			
		||||
@@ -7,11 +8,12 @@ import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unicode/utf16"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/windows"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//sys backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupRead
 | 
			
		||||
@@ -24,7 +26,7 @@ const (
 | 
			
		||||
	BackupAlternateData
 | 
			
		||||
	BackupLink
 | 
			
		||||
	BackupPropertyData
 | 
			
		||||
	BackupObjectId
 | 
			
		||||
	BackupObjectId //revive:disable-line:var-naming ID, not Id
 | 
			
		||||
	BackupReparseData
 | 
			
		||||
	BackupSparseBlock
 | 
			
		||||
	BackupTxfsData
 | 
			
		||||
@@ -34,14 +36,16 @@ const (
 | 
			
		||||
	StreamSparseAttributes = uint32(8)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//nolint:revive // var-naming: ALL_CAPS
 | 
			
		||||
const (
 | 
			
		||||
	WRITE_DAC              = 0x40000
 | 
			
		||||
	WRITE_OWNER            = 0x80000
 | 
			
		||||
	ACCESS_SYSTEM_SECURITY = 0x1000000
 | 
			
		||||
	WRITE_DAC              = windows.WRITE_DAC
 | 
			
		||||
	WRITE_OWNER            = windows.WRITE_OWNER
 | 
			
		||||
	ACCESS_SYSTEM_SECURITY = windows.ACCESS_SYSTEM_SECURITY
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// BackupHeader represents a backup stream of a file.
 | 
			
		||||
type BackupHeader struct {
 | 
			
		||||
	//revive:disable-next-line:var-naming ID, not Id
 | 
			
		||||
	Id         uint32 // The backup stream ID
 | 
			
		||||
	Attributes uint32 // Stream attributes
 | 
			
		||||
	Size       int64  // The size of the stream in bytes
 | 
			
		||||
@@ -49,8 +53,8 @@ type BackupHeader struct {
 | 
			
		||||
	Offset     int64  // The offset of the stream in the file (for BackupSparseBlock only).
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type win32StreamId struct {
 | 
			
		||||
	StreamId   uint32
 | 
			
		||||
type win32StreamID struct {
 | 
			
		||||
	StreamID   uint32
 | 
			
		||||
	Attributes uint32
 | 
			
		||||
	Size       uint64
 | 
			
		||||
	NameSize   uint32
 | 
			
		||||
@@ -71,7 +75,7 @@ func NewBackupStreamReader(r io.Reader) *BackupStreamReader {
 | 
			
		||||
// Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if
 | 
			
		||||
// it was not completely read.
 | 
			
		||||
func (r *BackupStreamReader) Next() (*BackupHeader, error) {
 | 
			
		||||
	if r.bytesLeft > 0 {
 | 
			
		||||
	if r.bytesLeft > 0 { //nolint:nestif // todo: flatten this
 | 
			
		||||
		if s, ok := r.r.(io.Seeker); ok {
 | 
			
		||||
			// Make sure Seek on io.SeekCurrent sometimes succeeds
 | 
			
		||||
			// before trying the actual seek.
 | 
			
		||||
@@ -82,16 +86,16 @@ func (r *BackupStreamReader) Next() (*BackupHeader, error) {
 | 
			
		||||
				r.bytesLeft = 0
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if _, err := io.Copy(ioutil.Discard, r); err != nil {
 | 
			
		||||
		if _, err := io.Copy(io.Discard, r); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	var wsi win32StreamId
 | 
			
		||||
	var wsi win32StreamID
 | 
			
		||||
	if err := binary.Read(r.r, binary.LittleEndian, &wsi); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	hdr := &BackupHeader{
 | 
			
		||||
		Id:         wsi.StreamId,
 | 
			
		||||
		Id:         wsi.StreamID,
 | 
			
		||||
		Attributes: wsi.Attributes,
 | 
			
		||||
		Size:       int64(wsi.Size),
 | 
			
		||||
	}
 | 
			
		||||
@@ -102,7 +106,7 @@ func (r *BackupStreamReader) Next() (*BackupHeader, error) {
 | 
			
		||||
		}
 | 
			
		||||
		hdr.Name = syscall.UTF16ToString(name)
 | 
			
		||||
	}
 | 
			
		||||
	if wsi.StreamId == BackupSparseBlock {
 | 
			
		||||
	if wsi.StreamID == BackupSparseBlock {
 | 
			
		||||
		if err := binary.Read(r.r, binary.LittleEndian, &hdr.Offset); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
@@ -147,8 +151,8 @@ func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error {
 | 
			
		||||
		return fmt.Errorf("missing %d bytes", w.bytesLeft)
 | 
			
		||||
	}
 | 
			
		||||
	name := utf16.Encode([]rune(hdr.Name))
 | 
			
		||||
	wsi := win32StreamId{
 | 
			
		||||
		StreamId:   hdr.Id,
 | 
			
		||||
	wsi := win32StreamID{
 | 
			
		||||
		StreamID:   hdr.Id,
 | 
			
		||||
		Attributes: hdr.Attributes,
 | 
			
		||||
		Size:       uint64(hdr.Size),
 | 
			
		||||
		NameSize:   uint32(len(name) * 2),
 | 
			
		||||
@@ -203,7 +207,7 @@ func (r *BackupFileReader) Read(b []byte) (int, error) {
 | 
			
		||||
	var bytesRead uint32
 | 
			
		||||
	err := backupRead(syscall.Handle(r.f.Fd()), b, &bytesRead, false, r.includeSecurity, &r.ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, &os.PathError{"BackupRead", r.f.Name(), err}
 | 
			
		||||
		return 0, &os.PathError{Op: "BackupRead", Path: r.f.Name(), Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	runtime.KeepAlive(r.f)
 | 
			
		||||
	if bytesRead == 0 {
 | 
			
		||||
@@ -216,7 +220,7 @@ func (r *BackupFileReader) Read(b []byte) (int, error) {
 | 
			
		||||
// the underlying file.
 | 
			
		||||
func (r *BackupFileReader) Close() error {
 | 
			
		||||
	if r.ctx != 0 {
 | 
			
		||||
		backupRead(syscall.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx)
 | 
			
		||||
		_ = backupRead(syscall.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx)
 | 
			
		||||
		runtime.KeepAlive(r.f)
 | 
			
		||||
		r.ctx = 0
 | 
			
		||||
	}
 | 
			
		||||
@@ -242,7 +246,7 @@ func (w *BackupFileWriter) Write(b []byte) (int, error) {
 | 
			
		||||
	var bytesWritten uint32
 | 
			
		||||
	err := backupWrite(syscall.Handle(w.f.Fd()), b, &bytesWritten, false, w.includeSecurity, &w.ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, &os.PathError{"BackupWrite", w.f.Name(), err}
 | 
			
		||||
		return 0, &os.PathError{Op: "BackupWrite", Path: w.f.Name(), Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	runtime.KeepAlive(w.f)
 | 
			
		||||
	if int(bytesWritten) != len(b) {
 | 
			
		||||
@@ -255,7 +259,7 @@ func (w *BackupFileWriter) Write(b []byte) (int, error) {
 | 
			
		||||
// close the underlying file.
 | 
			
		||||
func (w *BackupFileWriter) Close() error {
 | 
			
		||||
	if w.ctx != 0 {
 | 
			
		||||
		backupWrite(syscall.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx)
 | 
			
		||||
		_ = backupWrite(syscall.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx)
 | 
			
		||||
		runtime.KeepAlive(w.f)
 | 
			
		||||
		w.ctx = 0
 | 
			
		||||
	}
 | 
			
		||||
@@ -271,7 +275,13 @@ func OpenForBackup(path string, access uint32, share uint32, createmode uint32)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	h, err := syscall.CreateFile(&winPath[0], access, share, nil, createmode, syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT, 0)
 | 
			
		||||
	h, err := syscall.CreateFile(&winPath[0],
 | 
			
		||||
		access,
 | 
			
		||||
		share,
 | 
			
		||||
		nil,
 | 
			
		||||
		createmode,
 | 
			
		||||
		syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT,
 | 
			
		||||
		0)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		err = &os.PathError{Op: "open", Path: path, Err: err}
 | 
			
		||||
		return nil, err
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/github.com/Microsoft/go-winio/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/Microsoft/go-winio/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
// This package provides utilities for efficiently performing Win32 IO operations in Go.
 | 
			
		||||
// Currently, this package is provides support for genreal IO and management of
 | 
			
		||||
//   - named pipes
 | 
			
		||||
//   - files
 | 
			
		||||
//   - [Hyper-V sockets]
 | 
			
		||||
//
 | 
			
		||||
// This code is similar to Go's [net] package, and uses IO completion ports to avoid
 | 
			
		||||
// blocking IO on system threads, allowing Go to reuse the thread to schedule other goroutines.
 | 
			
		||||
//
 | 
			
		||||
// This limits support to Windows Vista and newer operating systems.
 | 
			
		||||
//
 | 
			
		||||
// Additionally, this package provides support for:
 | 
			
		||||
//   - creating and managing GUIDs
 | 
			
		||||
//   - writing to [ETW]
 | 
			
		||||
//   - opening and manageing VHDs
 | 
			
		||||
//   - parsing [Windows Image files]
 | 
			
		||||
//   - auto-generating Win32 API code
 | 
			
		||||
//
 | 
			
		||||
// [Hyper-V sockets]: https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service
 | 
			
		||||
// [ETW]: https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/event-tracing-for-windows--etw-
 | 
			
		||||
// [Windows Image files]: https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/work-with-windows-images
 | 
			
		||||
package winio
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/Microsoft/go-winio/ea.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/Microsoft/go-winio/ea.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -33,7 +33,7 @@ func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) {
 | 
			
		||||
	err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &info)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		err = errInvalidEaBuffer
 | 
			
		||||
		return
 | 
			
		||||
		return ea, nb, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	nameOffset := fileFullEaInformationSize
 | 
			
		||||
@@ -43,7 +43,7 @@ func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) {
 | 
			
		||||
	nextOffset := int(info.NextEntryOffset)
 | 
			
		||||
	if valueLen+valueOffset > len(b) || nextOffset < 0 || nextOffset > len(b) {
 | 
			
		||||
		err = errInvalidEaBuffer
 | 
			
		||||
		return
 | 
			
		||||
		return ea, nb, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ea.Name = string(b[nameOffset : nameOffset+nameLen])
 | 
			
		||||
@@ -52,7 +52,7 @@ func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) {
 | 
			
		||||
	if info.NextEntryOffset != 0 {
 | 
			
		||||
		nb = b[info.NextEntryOffset:]
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
	return ea, nb, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION
 | 
			
		||||
@@ -67,7 +67,7 @@ func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error) {
 | 
			
		||||
		eas = append(eas, ea)
 | 
			
		||||
		b = nb
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
	return eas, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										66
									
								
								vendor/github.com/Microsoft/go-winio/file.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										66
									
								
								vendor/github.com/Microsoft/go-winio/file.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,6 +11,8 @@ import (
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/windows"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//sys cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) = CancelIoEx
 | 
			
		||||
@@ -24,6 +26,8 @@ type atomicBool int32
 | 
			
		||||
func (b *atomicBool) isSet() bool { return atomic.LoadInt32((*int32)(b)) != 0 }
 | 
			
		||||
func (b *atomicBool) setFalse()   { atomic.StoreInt32((*int32)(b), 0) }
 | 
			
		||||
func (b *atomicBool) setTrue()    { atomic.StoreInt32((*int32)(b), 1) }
 | 
			
		||||
 | 
			
		||||
//revive:disable-next-line:predeclared Keep "new" to maintain consistency with "atomic" pkg
 | 
			
		||||
func (b *atomicBool) swap(new bool) bool {
 | 
			
		||||
	var newInt int32
 | 
			
		||||
	if new {
 | 
			
		||||
@@ -32,11 +36,6 @@ func (b *atomicBool) swap(new bool) bool {
 | 
			
		||||
	return atomic.SwapInt32((*int32)(b), newInt) == 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
 | 
			
		||||
	cFILE_SKIP_SET_EVENT_ON_HANDLE        = 2
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrFileClosed = errors.New("file has already been closed")
 | 
			
		||||
	ErrTimeout    = &timeoutError{}
 | 
			
		||||
@@ -44,28 +43,28 @@ var (
 | 
			
		||||
 | 
			
		||||
type timeoutError struct{}
 | 
			
		||||
 | 
			
		||||
func (e *timeoutError) Error() string   { return "i/o timeout" }
 | 
			
		||||
func (e *timeoutError) Timeout() bool   { return true }
 | 
			
		||||
func (e *timeoutError) Temporary() bool { return true }
 | 
			
		||||
func (*timeoutError) Error() string   { return "i/o timeout" }
 | 
			
		||||
func (*timeoutError) Timeout() bool   { return true }
 | 
			
		||||
func (*timeoutError) Temporary() bool { return true }
 | 
			
		||||
 | 
			
		||||
type timeoutChan chan struct{}
 | 
			
		||||
 | 
			
		||||
var ioInitOnce sync.Once
 | 
			
		||||
var ioCompletionPort syscall.Handle
 | 
			
		||||
 | 
			
		||||
// ioResult contains the result of an asynchronous IO operation
 | 
			
		||||
// ioResult contains the result of an asynchronous IO operation.
 | 
			
		||||
type ioResult struct {
 | 
			
		||||
	bytes uint32
 | 
			
		||||
	err   error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ioOperation represents an outstanding asynchronous Win32 IO
 | 
			
		||||
// ioOperation represents an outstanding asynchronous Win32 IO.
 | 
			
		||||
type ioOperation struct {
 | 
			
		||||
	o  syscall.Overlapped
 | 
			
		||||
	ch chan ioResult
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func initIo() {
 | 
			
		||||
func initIO() {
 | 
			
		||||
	h, err := createIoCompletionPort(syscall.InvalidHandle, 0, 0, 0xffffffff)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
@@ -94,15 +93,15 @@ type deadlineHandler struct {
 | 
			
		||||
	timedout    atomicBool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// makeWin32File makes a new win32File from an existing file handle
 | 
			
		||||
// makeWin32File makes a new win32File from an existing file handle.
 | 
			
		||||
func makeWin32File(h syscall.Handle) (*win32File, error) {
 | 
			
		||||
	f := &win32File{handle: h}
 | 
			
		||||
	ioInitOnce.Do(initIo)
 | 
			
		||||
	ioInitOnce.Do(initIO)
 | 
			
		||||
	_, err := createIoCompletionPort(h, ioCompletionPort, 0, 0xffffffff)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	err = setFileCompletionNotificationModes(h, cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS|cFILE_SKIP_SET_EVENT_ON_HANDLE)
 | 
			
		||||
	err = setFileCompletionNotificationModes(h, windows.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS|windows.FILE_SKIP_SET_EVENT_ON_HANDLE)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -121,14 +120,14 @@ func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) {
 | 
			
		||||
	return f, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// closeHandle closes the resources associated with a Win32 handle
 | 
			
		||||
// closeHandle closes the resources associated with a Win32 handle.
 | 
			
		||||
func (f *win32File) closeHandle() {
 | 
			
		||||
	f.wgLock.Lock()
 | 
			
		||||
	// Atomically set that we are closing, releasing the resources only once.
 | 
			
		||||
	if !f.closing.swap(true) {
 | 
			
		||||
		f.wgLock.Unlock()
 | 
			
		||||
		// cancel all IO and wait for it to complete
 | 
			
		||||
		cancelIoEx(f.handle, nil)
 | 
			
		||||
		_ = cancelIoEx(f.handle, nil)
 | 
			
		||||
		f.wg.Wait()
 | 
			
		||||
		// at this point, no new IO can start
 | 
			
		||||
		syscall.Close(f.handle)
 | 
			
		||||
@@ -144,14 +143,14 @@ func (f *win32File) Close() error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsClosed checks if the file has been closed
 | 
			
		||||
// IsClosed checks if the file has been closed.
 | 
			
		||||
func (f *win32File) IsClosed() bool {
 | 
			
		||||
	return f.closing.isSet()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// prepareIo prepares for a new IO operation.
 | 
			
		||||
// prepareIO prepares for a new IO operation.
 | 
			
		||||
// The caller must call f.wg.Done() when the IO is finished, prior to Close() returning.
 | 
			
		||||
func (f *win32File) prepareIo() (*ioOperation, error) {
 | 
			
		||||
func (f *win32File) prepareIO() (*ioOperation, error) {
 | 
			
		||||
	f.wgLock.RLock()
 | 
			
		||||
	if f.closing.isSet() {
 | 
			
		||||
		f.wgLock.RUnlock()
 | 
			
		||||
@@ -164,7 +163,7 @@ func (f *win32File) prepareIo() (*ioOperation, error) {
 | 
			
		||||
	return c, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ioCompletionProcessor processes completed async IOs forever
 | 
			
		||||
// ioCompletionProcessor processes completed async IOs forever.
 | 
			
		||||
func ioCompletionProcessor(h syscall.Handle) {
 | 
			
		||||
	for {
 | 
			
		||||
		var bytes uint32
 | 
			
		||||
@@ -178,15 +177,17 @@ func ioCompletionProcessor(h syscall.Handle) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// asyncIo processes the return value from ReadFile or WriteFile, blocking until
 | 
			
		||||
// todo: helsaawy - create an asyncIO version that takes a context
 | 
			
		||||
 | 
			
		||||
// asyncIO processes the return value from ReadFile or WriteFile, blocking until
 | 
			
		||||
// the operation has actually completed.
 | 
			
		||||
func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) {
 | 
			
		||||
	if err != syscall.ERROR_IO_PENDING {
 | 
			
		||||
func (f *win32File) asyncIO(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) {
 | 
			
		||||
	if err != syscall.ERROR_IO_PENDING { //nolint:errorlint // err is Errno
 | 
			
		||||
		return int(bytes), err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if f.closing.isSet() {
 | 
			
		||||
		cancelIoEx(f.handle, &c.o)
 | 
			
		||||
		_ = cancelIoEx(f.handle, &c.o)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var timeout timeoutChan
 | 
			
		||||
@@ -200,7 +201,7 @@ func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, er
 | 
			
		||||
	select {
 | 
			
		||||
	case r = <-c.ch:
 | 
			
		||||
		err = r.err
 | 
			
		||||
		if err == syscall.ERROR_OPERATION_ABORTED {
 | 
			
		||||
		if err == syscall.ERROR_OPERATION_ABORTED { //nolint:errorlint // err is Errno
 | 
			
		||||
			if f.closing.isSet() {
 | 
			
		||||
				err = ErrFileClosed
 | 
			
		||||
			}
 | 
			
		||||
@@ -210,10 +211,10 @@ func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, er
 | 
			
		||||
			err = wsaGetOverlappedResult(f.handle, &c.o, &bytes, false, &flags)
 | 
			
		||||
		}
 | 
			
		||||
	case <-timeout:
 | 
			
		||||
		cancelIoEx(f.handle, &c.o)
 | 
			
		||||
		_ = cancelIoEx(f.handle, &c.o)
 | 
			
		||||
		r = <-c.ch
 | 
			
		||||
		err = r.err
 | 
			
		||||
		if err == syscall.ERROR_OPERATION_ABORTED {
 | 
			
		||||
		if err == syscall.ERROR_OPERATION_ABORTED { //nolint:errorlint // err is Errno
 | 
			
		||||
			err = ErrTimeout
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -221,13 +222,14 @@ func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, er
 | 
			
		||||
	// runtime.KeepAlive is needed, as c is passed via native
 | 
			
		||||
	// code to ioCompletionProcessor, c must remain alive
 | 
			
		||||
	// until the channel read is complete.
 | 
			
		||||
	// todo: (de)allocate *ioOperation via win32 heap functions, instead of needing to KeepAlive?
 | 
			
		||||
	runtime.KeepAlive(c)
 | 
			
		||||
	return int(r.bytes), err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Read reads from a file handle.
 | 
			
		||||
func (f *win32File) Read(b []byte) (int, error) {
 | 
			
		||||
	c, err := f.prepareIo()
 | 
			
		||||
	c, err := f.prepareIO()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -239,13 +241,13 @@ func (f *win32File) Read(b []byte) (int, error) {
 | 
			
		||||
 | 
			
		||||
	var bytes uint32
 | 
			
		||||
	err = syscall.ReadFile(f.handle, b, &bytes, &c.o)
 | 
			
		||||
	n, err := f.asyncIo(c, &f.readDeadline, bytes, err)
 | 
			
		||||
	n, err := f.asyncIO(c, &f.readDeadline, bytes, err)
 | 
			
		||||
	runtime.KeepAlive(b)
 | 
			
		||||
 | 
			
		||||
	// Handle EOF conditions.
 | 
			
		||||
	if err == nil && n == 0 && len(b) != 0 {
 | 
			
		||||
		return 0, io.EOF
 | 
			
		||||
	} else if err == syscall.ERROR_BROKEN_PIPE {
 | 
			
		||||
	} else if err == syscall.ERROR_BROKEN_PIPE { //nolint:errorlint // err is Errno
 | 
			
		||||
		return 0, io.EOF
 | 
			
		||||
	} else {
 | 
			
		||||
		return n, err
 | 
			
		||||
@@ -254,7 +256,7 @@ func (f *win32File) Read(b []byte) (int, error) {
 | 
			
		||||
 | 
			
		||||
// Write writes to a file handle.
 | 
			
		||||
func (f *win32File) Write(b []byte) (int, error) {
 | 
			
		||||
	c, err := f.prepareIo()
 | 
			
		||||
	c, err := f.prepareIO()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -266,7 +268,7 @@ func (f *win32File) Write(b []byte) (int, error) {
 | 
			
		||||
 | 
			
		||||
	var bytes uint32
 | 
			
		||||
	err = syscall.WriteFile(f.handle, b, &bytes, &c.o)
 | 
			
		||||
	n, err := f.asyncIo(c, &f.writeDeadline, bytes, err)
 | 
			
		||||
	n, err := f.asyncIO(c, &f.writeDeadline, bytes, err)
 | 
			
		||||
	runtime.KeepAlive(b)
 | 
			
		||||
	return n, err
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								vendor/github.com/Microsoft/go-winio/fileinfo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/Microsoft/go-winio/fileinfo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,4 @@
 | 
			
		||||
//go:build windows
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package winio
 | 
			
		||||
@@ -14,13 +15,18 @@ import (
 | 
			
		||||
type FileBasicInfo struct {
 | 
			
		||||
	CreationTime, LastAccessTime, LastWriteTime, ChangeTime windows.Filetime
 | 
			
		||||
	FileAttributes                                          uint32
 | 
			
		||||
	pad                                                     uint32 // padding
 | 
			
		||||
	_                                                       uint32 // padding
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetFileBasicInfo retrieves times and attributes for a file.
 | 
			
		||||
func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) {
 | 
			
		||||
	bi := &FileBasicInfo{}
 | 
			
		||||
	if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil {
 | 
			
		||||
	if err := windows.GetFileInformationByHandleEx(
 | 
			
		||||
		windows.Handle(f.Fd()),
 | 
			
		||||
		windows.FileBasicInfo,
 | 
			
		||||
		(*byte)(unsafe.Pointer(bi)),
 | 
			
		||||
		uint32(unsafe.Sizeof(*bi)),
 | 
			
		||||
	); err != nil {
 | 
			
		||||
		return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	runtime.KeepAlive(f)
 | 
			
		||||
@@ -29,7 +35,12 @@ func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) {
 | 
			
		||||
 | 
			
		||||
// SetFileBasicInfo sets times and attributes for a file.
 | 
			
		||||
func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error {
 | 
			
		||||
	if err := windows.SetFileInformationByHandle(windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil {
 | 
			
		||||
	if err := windows.SetFileInformationByHandle(
 | 
			
		||||
		windows.Handle(f.Fd()),
 | 
			
		||||
		windows.FileBasicInfo,
 | 
			
		||||
		(*byte)(unsafe.Pointer(bi)),
 | 
			
		||||
		uint32(unsafe.Sizeof(*bi)),
 | 
			
		||||
	); err != nil {
 | 
			
		||||
		return &os.PathError{Op: "SetFileInformationByHandle", Path: f.Name(), Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	runtime.KeepAlive(f)
 | 
			
		||||
@@ -48,7 +59,10 @@ type FileStandardInfo struct {
 | 
			
		||||
// GetFileStandardInfo retrieves ended information for the file.
 | 
			
		||||
func GetFileStandardInfo(f *os.File) (*FileStandardInfo, error) {
 | 
			
		||||
	si := &FileStandardInfo{}
 | 
			
		||||
	if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileStandardInfo, (*byte)(unsafe.Pointer(si)), uint32(unsafe.Sizeof(*si))); err != nil {
 | 
			
		||||
	if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()),
 | 
			
		||||
		windows.FileStandardInfo,
 | 
			
		||||
		(*byte)(unsafe.Pointer(si)),
 | 
			
		||||
		uint32(unsafe.Sizeof(*si))); err != nil {
 | 
			
		||||
		return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	runtime.KeepAlive(f)
 | 
			
		||||
@@ -65,7 +79,12 @@ type FileIDInfo struct {
 | 
			
		||||
// GetFileID retrieves the unique (volume, file ID) pair for a file.
 | 
			
		||||
func GetFileID(f *os.File) (*FileIDInfo, error) {
 | 
			
		||||
	fileID := &FileIDInfo{}
 | 
			
		||||
	if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileIdInfo, (*byte)(unsafe.Pointer(fileID)), uint32(unsafe.Sizeof(*fileID))); err != nil {
 | 
			
		||||
	if err := windows.GetFileInformationByHandleEx(
 | 
			
		||||
		windows.Handle(f.Fd()),
 | 
			
		||||
		windows.FileIdInfo,
 | 
			
		||||
		(*byte)(unsafe.Pointer(fileID)),
 | 
			
		||||
		uint32(unsafe.Sizeof(*fileID)),
 | 
			
		||||
	); err != nil {
 | 
			
		||||
		return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	runtime.KeepAlive(f)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										345
									
								
								vendor/github.com/Microsoft/go-winio/hvsock.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										345
									
								
								vendor/github.com/Microsoft/go-winio/hvsock.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,6 +4,8 @@
 | 
			
		||||
package winio
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net"
 | 
			
		||||
@@ -12,16 +14,87 @@ import (
 | 
			
		||||
	"time"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/windows"
 | 
			
		||||
 | 
			
		||||
	"github.com/Microsoft/go-winio/internal/socket"
 | 
			
		||||
	"github.com/Microsoft/go-winio/pkg/guid"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//sys bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind
 | 
			
		||||
const afHVSock = 34 // AF_HYPERV
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	afHvSock = 34 // AF_HYPERV
 | 
			
		||||
// Well known Service and VM IDs
 | 
			
		||||
//https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service#vmid-wildcards
 | 
			
		||||
 | 
			
		||||
	socketError = ^uintptr(0)
 | 
			
		||||
)
 | 
			
		||||
// HvsockGUIDWildcard is the wildcard VmId for accepting connections from all partitions.
 | 
			
		||||
func HvsockGUIDWildcard() guid.GUID { // 00000000-0000-0000-0000-000000000000
 | 
			
		||||
	return guid.GUID{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HvsockGUIDBroadcast is the wildcard VmId for broadcasting sends to all partitions.
 | 
			
		||||
func HvsockGUIDBroadcast() guid.GUID { //ffffffff-ffff-ffff-ffff-ffffffffffff
 | 
			
		||||
	return guid.GUID{
 | 
			
		||||
		Data1: 0xffffffff,
 | 
			
		||||
		Data2: 0xffff,
 | 
			
		||||
		Data3: 0xffff,
 | 
			
		||||
		Data4: [8]uint8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HvsockGUIDLoopback is the Loopback VmId for accepting connections to the same partition as the connector.
 | 
			
		||||
func HvsockGUIDLoopback() guid.GUID { // e0e16197-dd56-4a10-9195-5ee7a155a838
 | 
			
		||||
	return guid.GUID{
 | 
			
		||||
		Data1: 0xe0e16197,
 | 
			
		||||
		Data2: 0xdd56,
 | 
			
		||||
		Data3: 0x4a10,
 | 
			
		||||
		Data4: [8]uint8{0x91, 0x95, 0x5e, 0xe7, 0xa1, 0x55, 0xa8, 0x38},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HvsockGUIDSiloHost is the address of a silo's host partition:
 | 
			
		||||
//   - The silo host of a hosted silo is the utility VM.
 | 
			
		||||
//   - The silo host of a silo on a physical host is the physical host.
 | 
			
		||||
func HvsockGUIDSiloHost() guid.GUID { // 36bd0c5c-7276-4223-88ba-7d03b654c568
 | 
			
		||||
	return guid.GUID{
 | 
			
		||||
		Data1: 0x36bd0c5c,
 | 
			
		||||
		Data2: 0x7276,
 | 
			
		||||
		Data3: 0x4223,
 | 
			
		||||
		Data4: [8]byte{0x88, 0xba, 0x7d, 0x03, 0xb6, 0x54, 0xc5, 0x68},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HvsockGUIDChildren is the wildcard VmId for accepting connections from the connector's child partitions.
 | 
			
		||||
func HvsockGUIDChildren() guid.GUID { // 90db8b89-0d35-4f79-8ce9-49ea0ac8b7cd
 | 
			
		||||
	return guid.GUID{
 | 
			
		||||
		Data1: 0x90db8b89,
 | 
			
		||||
		Data2: 0xd35,
 | 
			
		||||
		Data3: 0x4f79,
 | 
			
		||||
		Data4: [8]uint8{0x8c, 0xe9, 0x49, 0xea, 0xa, 0xc8, 0xb7, 0xcd},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HvsockGUIDParent is the wildcard VmId for accepting connections from the connector's parent partition.
 | 
			
		||||
// Listening on this VmId accepts connection from:
 | 
			
		||||
//   - Inside silos: silo host partition.
 | 
			
		||||
//   - Inside hosted silo: host of the VM.
 | 
			
		||||
//   - Inside VM: VM host.
 | 
			
		||||
//   - Physical host: Not supported.
 | 
			
		||||
func HvsockGUIDParent() guid.GUID { // a42e7cda-d03f-480c-9cc2-a4de20abb878
 | 
			
		||||
	return guid.GUID{
 | 
			
		||||
		Data1: 0xa42e7cda,
 | 
			
		||||
		Data2: 0xd03f,
 | 
			
		||||
		Data3: 0x480c,
 | 
			
		||||
		Data4: [8]uint8{0x9c, 0xc2, 0xa4, 0xde, 0x20, 0xab, 0xb8, 0x78},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// hvsockVsockServiceTemplate is the Service GUID used for the VSOCK protocol.
 | 
			
		||||
func hvsockVsockServiceTemplate() guid.GUID { // 00000000-facb-11e6-bd58-64006a7986d3
 | 
			
		||||
	return guid.GUID{
 | 
			
		||||
		Data2: 0xfacb,
 | 
			
		||||
		Data3: 0x11e6,
 | 
			
		||||
		Data4: [8]uint8{0xbd, 0x58, 0x64, 0x00, 0x6a, 0x79, 0x86, 0xd3},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An HvsockAddr is an address for a AF_HYPERV socket.
 | 
			
		||||
type HvsockAddr struct {
 | 
			
		||||
@@ -36,8 +109,10 @@ type rawHvsockAddr struct {
 | 
			
		||||
	ServiceID guid.GUID
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ socket.RawSockaddr = &rawHvsockAddr{}
 | 
			
		||||
 | 
			
		||||
// Network returns the address's network name, "hvsock".
 | 
			
		||||
func (addr *HvsockAddr) Network() string {
 | 
			
		||||
func (*HvsockAddr) Network() string {
 | 
			
		||||
	return "hvsock"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -47,14 +122,14 @@ func (addr *HvsockAddr) String() string {
 | 
			
		||||
 | 
			
		||||
// VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port.
 | 
			
		||||
func VsockServiceID(port uint32) guid.GUID {
 | 
			
		||||
	g, _ := guid.FromString("00000000-facb-11e6-bd58-64006a7986d3")
 | 
			
		||||
	g := hvsockVsockServiceTemplate() // make a copy
 | 
			
		||||
	g.Data1 = port
 | 
			
		||||
	return g
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (addr *HvsockAddr) raw() rawHvsockAddr {
 | 
			
		||||
	return rawHvsockAddr{
 | 
			
		||||
		Family:    afHvSock,
 | 
			
		||||
		Family:    afHVSock,
 | 
			
		||||
		VMID:      addr.VMID,
 | 
			
		||||
		ServiceID: addr.ServiceID,
 | 
			
		||||
	}
 | 
			
		||||
@@ -65,20 +140,48 @@ func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) {
 | 
			
		||||
	addr.ServiceID = raw.ServiceID
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Sockaddr returns a pointer to and the size of this struct.
 | 
			
		||||
//
 | 
			
		||||
// Implements the [socket.RawSockaddr] interface, and allows use in
 | 
			
		||||
// [socket.Bind] and [socket.ConnectEx].
 | 
			
		||||
func (r *rawHvsockAddr) Sockaddr() (unsafe.Pointer, int32, error) {
 | 
			
		||||
	return unsafe.Pointer(r), int32(unsafe.Sizeof(rawHvsockAddr{})), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Sockaddr interface allows use with `sockets.Bind()` and `.ConnectEx()`.
 | 
			
		||||
func (r *rawHvsockAddr) FromBytes(b []byte) error {
 | 
			
		||||
	n := int(unsafe.Sizeof(rawHvsockAddr{}))
 | 
			
		||||
 | 
			
		||||
	if len(b) < n {
 | 
			
		||||
		return fmt.Errorf("got %d, want %d: %w", len(b), n, socket.ErrBufferSize)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	copy(unsafe.Slice((*byte)(unsafe.Pointer(r)), n), b[:n])
 | 
			
		||||
	if r.Family != afHVSock {
 | 
			
		||||
		return fmt.Errorf("got %d, want %d: %w", r.Family, afHVSock, socket.ErrAddrFamily)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HvsockListener is a socket listener for the AF_HYPERV address family.
 | 
			
		||||
type HvsockListener struct {
 | 
			
		||||
	sock *win32File
 | 
			
		||||
	addr HvsockAddr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ net.Listener = &HvsockListener{}
 | 
			
		||||
 | 
			
		||||
// HvsockConn is a connected socket of the AF_HYPERV address family.
 | 
			
		||||
type HvsockConn struct {
 | 
			
		||||
	sock          *win32File
 | 
			
		||||
	local, remote HvsockAddr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newHvSocket() (*win32File, error) {
 | 
			
		||||
	fd, err := syscall.Socket(afHvSock, syscall.SOCK_STREAM, 1)
 | 
			
		||||
var _ net.Conn = &HvsockConn{}
 | 
			
		||||
 | 
			
		||||
func newHVSocket() (*win32File, error) {
 | 
			
		||||
	fd, err := syscall.Socket(afHVSock, syscall.SOCK_STREAM, 1)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, os.NewSyscallError("socket", err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -94,12 +197,12 @@ func newHvSocket() (*win32File, error) {
 | 
			
		||||
// ListenHvsock listens for connections on the specified hvsock address.
 | 
			
		||||
func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) {
 | 
			
		||||
	l := &HvsockListener{addr: *addr}
 | 
			
		||||
	sock, err := newHvSocket()
 | 
			
		||||
	sock, err := newHVSocket()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, l.opErr("listen", err)
 | 
			
		||||
	}
 | 
			
		||||
	sa := addr.raw()
 | 
			
		||||
	err = bind(sock.handle, unsafe.Pointer(&sa), int32(unsafe.Sizeof(sa)))
 | 
			
		||||
	err = socket.Bind(windows.Handle(sock.handle), &sa)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, l.opErr("listen", os.NewSyscallError("socket", err))
 | 
			
		||||
	}
 | 
			
		||||
@@ -121,7 +224,7 @@ func (l *HvsockListener) Addr() net.Addr {
 | 
			
		||||
 | 
			
		||||
// Accept waits for the next connection and returns it.
 | 
			
		||||
func (l *HvsockListener) Accept() (_ net.Conn, err error) {
 | 
			
		||||
	sock, err := newHvSocket()
 | 
			
		||||
	sock, err := newHVSocket()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, l.opErr("accept", err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -130,27 +233,42 @@ func (l *HvsockListener) Accept() (_ net.Conn, err error) {
 | 
			
		||||
			sock.Close()
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	c, err := l.sock.prepareIo()
 | 
			
		||||
	c, err := l.sock.prepareIO()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, l.opErr("accept", err)
 | 
			
		||||
	}
 | 
			
		||||
	defer l.sock.wg.Done()
 | 
			
		||||
 | 
			
		||||
	// AcceptEx, per documentation, requires an extra 16 bytes per address.
 | 
			
		||||
	//
 | 
			
		||||
	// https://docs.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-acceptex
 | 
			
		||||
	const addrlen = uint32(16 + unsafe.Sizeof(rawHvsockAddr{}))
 | 
			
		||||
	var addrbuf [addrlen * 2]byte
 | 
			
		||||
 | 
			
		||||
	var bytes uint32
 | 
			
		||||
	err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0, addrlen, addrlen, &bytes, &c.o)
 | 
			
		||||
	_, err = l.sock.asyncIo(c, nil, bytes, err)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
	err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0 /*rxdatalen*/, addrlen, addrlen, &bytes, &c.o)
 | 
			
		||||
	if _, err = l.sock.asyncIO(c, nil, bytes, err); err != nil {
 | 
			
		||||
		return nil, l.opErr("accept", os.NewSyscallError("acceptex", err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	conn := &HvsockConn{
 | 
			
		||||
		sock: sock,
 | 
			
		||||
	}
 | 
			
		||||
	// The local address returned in the AcceptEx buffer is the same as the Listener socket's
 | 
			
		||||
	// address. However, the service GUID reported by GetSockName is different from the Listeners
 | 
			
		||||
	// socket, and is sometimes the same as the local address of the socket that dialed the
 | 
			
		||||
	// address, with the service GUID.Data1 incremented, but othertimes is different.
 | 
			
		||||
	// todo: does the local address matter? is the listener's address or the actual address appropriate?
 | 
			
		||||
	conn.local.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[0])))
 | 
			
		||||
	conn.remote.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[addrlen])))
 | 
			
		||||
 | 
			
		||||
	// initialize the accepted socket and update its properties with those of the listening socket
 | 
			
		||||
	if err = windows.Setsockopt(windows.Handle(sock.handle),
 | 
			
		||||
		windows.SOL_SOCKET, windows.SO_UPDATE_ACCEPT_CONTEXT,
 | 
			
		||||
		(*byte)(unsafe.Pointer(&l.sock.handle)), int32(unsafe.Sizeof(l.sock.handle))); err != nil {
 | 
			
		||||
		return nil, conn.opErr("accept", os.NewSyscallError("setsockopt", err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sock = nil
 | 
			
		||||
	return conn, nil
 | 
			
		||||
}
 | 
			
		||||
@@ -160,43 +278,171 @@ func (l *HvsockListener) Close() error {
 | 
			
		||||
	return l.sock.Close()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Need to finish ConnectEx handling
 | 
			
		||||
func DialHvsock(ctx context.Context, addr *HvsockAddr) (*HvsockConn, error) {
 | 
			
		||||
	sock, err := newHvSocket()
 | 
			
		||||
// HvsockDialer configures and dials a Hyper-V Socket (ie, [HvsockConn]).
 | 
			
		||||
type HvsockDialer struct {
 | 
			
		||||
	// Deadline is the time the Dial operation must connect before erroring.
 | 
			
		||||
	Deadline time.Time
 | 
			
		||||
 | 
			
		||||
	// Retries is the number of additional connects to try if the connection times out, is refused,
 | 
			
		||||
	// or the host is unreachable
 | 
			
		||||
	Retries uint
 | 
			
		||||
 | 
			
		||||
	// RetryWait is the time to wait after a connection error to retry
 | 
			
		||||
	RetryWait time.Duration
 | 
			
		||||
 | 
			
		||||
	rt *time.Timer // redial wait timer
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dial the Hyper-V socket at addr.
 | 
			
		||||
//
 | 
			
		||||
// See [HvsockDialer.Dial] for more information.
 | 
			
		||||
func Dial(ctx context.Context, addr *HvsockAddr) (conn *HvsockConn, err error) {
 | 
			
		||||
	return (&HvsockDialer{}).Dial(ctx, addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dial attempts to connect to the Hyper-V socket at addr, and returns a connection if successful.
 | 
			
		||||
// Will attempt (HvsockDialer).Retries if dialing fails, waiting (HvsockDialer).RetryWait between
 | 
			
		||||
// retries.
 | 
			
		||||
//
 | 
			
		||||
// Dialing can be cancelled either by providing (HvsockDialer).Deadline, or cancelling ctx.
 | 
			
		||||
func (d *HvsockDialer) Dial(ctx context.Context, addr *HvsockAddr) (conn *HvsockConn, err error) {
 | 
			
		||||
	op := "dial"
 | 
			
		||||
	// create the conn early to use opErr()
 | 
			
		||||
	conn = &HvsockConn{
 | 
			
		||||
		remote: *addr,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !d.Deadline.IsZero() {
 | 
			
		||||
		var cancel context.CancelFunc
 | 
			
		||||
		ctx, cancel = context.WithDeadline(ctx, d.Deadline)
 | 
			
		||||
		defer cancel()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// preemptive timeout/cancellation check
 | 
			
		||||
	if err = ctx.Err(); err != nil {
 | 
			
		||||
		return nil, conn.opErr(op, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sock, err := newHVSocket()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
		return nil, conn.opErr(op, err)
 | 
			
		||||
	}
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if sock != nil {
 | 
			
		||||
			sock.Close()
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	c, err := sock.prepareIo()
 | 
			
		||||
 | 
			
		||||
	sa := addr.raw()
 | 
			
		||||
	err = socket.Bind(windows.Handle(sock.handle), &sa)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
		return nil, conn.opErr(op, os.NewSyscallError("bind", err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c, err := sock.prepareIO()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, conn.opErr(op, err)
 | 
			
		||||
	}
 | 
			
		||||
	defer sock.wg.Done()
 | 
			
		||||
	var bytes uint32
 | 
			
		||||
	err = windows.ConnectEx(windows.Handle(sock.handle), sa, nil, 0, &bytes, &c.o)
 | 
			
		||||
	_, err = sock.asyncIo(ctx, c, nil, bytes, err)
 | 
			
		||||
	for i := uint(0); i <= d.Retries; i++ {
 | 
			
		||||
		err = socket.ConnectEx(
 | 
			
		||||
			windows.Handle(sock.handle),
 | 
			
		||||
			&sa,
 | 
			
		||||
			nil, // sendBuf
 | 
			
		||||
			0,   // sendDataLen
 | 
			
		||||
			&bytes,
 | 
			
		||||
			(*windows.Overlapped)(unsafe.Pointer(&c.o)))
 | 
			
		||||
		_, err = sock.asyncIO(c, nil, bytes, err)
 | 
			
		||||
		if i < d.Retries && canRedial(err) {
 | 
			
		||||
			if err = d.redialWait(ctx); err == nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		break
 | 
			
		||||
	}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
		return nil, conn.opErr(op, os.NewSyscallError("connectex", err))
 | 
			
		||||
	}
 | 
			
		||||
	conn := &HvsockConn{
 | 
			
		||||
		sock:   sock,
 | 
			
		||||
		remote: *addr,
 | 
			
		||||
 | 
			
		||||
	// update the connection properties, so shutdown can be used
 | 
			
		||||
	if err = windows.Setsockopt(
 | 
			
		||||
		windows.Handle(sock.handle),
 | 
			
		||||
		windows.SOL_SOCKET,
 | 
			
		||||
		windows.SO_UPDATE_CONNECT_CONTEXT,
 | 
			
		||||
		nil, // optvalue
 | 
			
		||||
		0,   // optlen
 | 
			
		||||
	); err != nil {
 | 
			
		||||
		return nil, conn.opErr(op, os.NewSyscallError("setsockopt", err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// get the local name
 | 
			
		||||
	var sal rawHvsockAddr
 | 
			
		||||
	err = socket.GetSockName(windows.Handle(sock.handle), &sal)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, conn.opErr(op, os.NewSyscallError("getsockname", err))
 | 
			
		||||
	}
 | 
			
		||||
	conn.local.fromRaw(&sal)
 | 
			
		||||
 | 
			
		||||
	// one last check for timeout, since asyncIO doesn't check the context
 | 
			
		||||
	if err = ctx.Err(); err != nil {
 | 
			
		||||
		return nil, conn.opErr(op, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	conn.sock = sock
 | 
			
		||||
	sock = nil
 | 
			
		||||
 | 
			
		||||
	return conn, nil
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// redialWait waits before attempting to redial, resetting the timer as appropriate.
 | 
			
		||||
func (d *HvsockDialer) redialWait(ctx context.Context) (err error) {
 | 
			
		||||
	if d.RetryWait == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if d.rt == nil {
 | 
			
		||||
		d.rt = time.NewTimer(d.RetryWait)
 | 
			
		||||
	} else {
 | 
			
		||||
		// should already be stopped and drained
 | 
			
		||||
		d.rt.Reset(d.RetryWait)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	select {
 | 
			
		||||
	case <-ctx.Done():
 | 
			
		||||
	case <-d.rt.C:
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// stop and drain the timer
 | 
			
		||||
	if !d.rt.Stop() {
 | 
			
		||||
		<-d.rt.C
 | 
			
		||||
	}
 | 
			
		||||
	return ctx.Err()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// assumes error is a plain, unwrapped syscall.Errno provided by direct syscall.
 | 
			
		||||
func canRedial(err error) bool {
 | 
			
		||||
	//nolint:errorlint // guaranteed to be an Errno
 | 
			
		||||
	switch err {
 | 
			
		||||
	case windows.WSAECONNREFUSED, windows.WSAENETUNREACH, windows.WSAETIMEDOUT,
 | 
			
		||||
		windows.ERROR_CONNECTION_REFUSED, windows.ERROR_CONNECTION_UNAVAIL:
 | 
			
		||||
		return true
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (conn *HvsockConn) opErr(op string, err error) error {
 | 
			
		||||
	// translate from "file closed" to "socket closed"
 | 
			
		||||
	if errors.Is(err, ErrFileClosed) {
 | 
			
		||||
		err = socket.ErrSocketClosed
 | 
			
		||||
	}
 | 
			
		||||
	return &net.OpError{Op: op, Net: "hvsock", Source: &conn.local, Addr: &conn.remote, Err: err}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (conn *HvsockConn) Read(b []byte) (int, error) {
 | 
			
		||||
	c, err := conn.sock.prepareIo()
 | 
			
		||||
	c, err := conn.sock.prepareIO()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, conn.opErr("read", err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -204,10 +450,11 @@ func (conn *HvsockConn) Read(b []byte) (int, error) {
 | 
			
		||||
	buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))}
 | 
			
		||||
	var flags, bytes uint32
 | 
			
		||||
	err = syscall.WSARecv(conn.sock.handle, &buf, 1, &bytes, &flags, &c.o, nil)
 | 
			
		||||
	n, err := conn.sock.asyncIo(c, &conn.sock.readDeadline, bytes, err)
 | 
			
		||||
	n, err := conn.sock.asyncIO(c, &conn.sock.readDeadline, bytes, err)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if _, ok := err.(syscall.Errno); ok {
 | 
			
		||||
			err = os.NewSyscallError("wsarecv", err)
 | 
			
		||||
		var eno windows.Errno
 | 
			
		||||
		if errors.As(err, &eno) {
 | 
			
		||||
			err = os.NewSyscallError("wsarecv", eno)
 | 
			
		||||
		}
 | 
			
		||||
		return 0, conn.opErr("read", err)
 | 
			
		||||
	} else if n == 0 {
 | 
			
		||||
@@ -230,7 +477,7 @@ func (conn *HvsockConn) Write(b []byte) (int, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (conn *HvsockConn) write(b []byte) (int, error) {
 | 
			
		||||
	c, err := conn.sock.prepareIo()
 | 
			
		||||
	c, err := conn.sock.prepareIO()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, conn.opErr("write", err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -238,10 +485,11 @@ func (conn *HvsockConn) write(b []byte) (int, error) {
 | 
			
		||||
	buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))}
 | 
			
		||||
	var bytes uint32
 | 
			
		||||
	err = syscall.WSASend(conn.sock.handle, &buf, 1, &bytes, 0, &c.o, nil)
 | 
			
		||||
	n, err := conn.sock.asyncIo(c, &conn.sock.writeDeadline, bytes, err)
 | 
			
		||||
	n, err := conn.sock.asyncIO(c, &conn.sock.writeDeadline, bytes, err)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if _, ok := err.(syscall.Errno); ok {
 | 
			
		||||
			err = os.NewSyscallError("wsasend", err)
 | 
			
		||||
		var eno windows.Errno
 | 
			
		||||
		if errors.As(err, &eno) {
 | 
			
		||||
			err = os.NewSyscallError("wsasend", eno)
 | 
			
		||||
		}
 | 
			
		||||
		return 0, conn.opErr("write", err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -257,13 +505,19 @@ func (conn *HvsockConn) IsClosed() bool {
 | 
			
		||||
	return conn.sock.IsClosed()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// shutdown disables sending or receiving on a socket.
 | 
			
		||||
func (conn *HvsockConn) shutdown(how int) error {
 | 
			
		||||
	if conn.IsClosed() {
 | 
			
		||||
		return ErrFileClosed
 | 
			
		||||
		return socket.ErrSocketClosed
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := syscall.Shutdown(conn.sock.handle, how)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// If the connection was closed, shutdowns fail with "not connected"
 | 
			
		||||
		if errors.Is(err, windows.WSAENOTCONN) ||
 | 
			
		||||
			errors.Is(err, windows.WSAESHUTDOWN) {
 | 
			
		||||
			err = socket.ErrSocketClosed
 | 
			
		||||
		}
 | 
			
		||||
		return os.NewSyscallError("shutdown", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
@@ -273,7 +527,7 @@ func (conn *HvsockConn) shutdown(how int) error {
 | 
			
		||||
func (conn *HvsockConn) CloseRead() error {
 | 
			
		||||
	err := conn.shutdown(syscall.SHUT_RD)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return conn.opErr("close", err)
 | 
			
		||||
		return conn.opErr("closeread", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -283,7 +537,7 @@ func (conn *HvsockConn) CloseRead() error {
 | 
			
		||||
func (conn *HvsockConn) CloseWrite() error {
 | 
			
		||||
	err := conn.shutdown(syscall.SHUT_WR)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return conn.opErr("close", err)
 | 
			
		||||
		return conn.opErr("closewrite", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -300,8 +554,13 @@ func (conn *HvsockConn) RemoteAddr() net.Addr {
 | 
			
		||||
 | 
			
		||||
// SetDeadline implements the net.Conn SetDeadline method.
 | 
			
		||||
func (conn *HvsockConn) SetDeadline(t time.Time) error {
 | 
			
		||||
	conn.SetReadDeadline(t)
 | 
			
		||||
	conn.SetWriteDeadline(t)
 | 
			
		||||
	// todo: implement `SetDeadline` for `win32File`
 | 
			
		||||
	if err := conn.SetReadDeadline(t); err != nil {
 | 
			
		||||
		return fmt.Errorf("set read deadline: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	if err := conn.SetWriteDeadline(t); err != nil {
 | 
			
		||||
		return fmt.Errorf("set write deadline: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
package socket
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RawSockaddr allows structs to be used with [Bind] and [ConnectEx]. The
 | 
			
		||||
// struct must meet the Win32 sockaddr requirements specified here:
 | 
			
		||||
// https://docs.microsoft.com/en-us/windows/win32/winsock/sockaddr-2
 | 
			
		||||
//
 | 
			
		||||
// Specifically, the struct size must be least larger than an int16 (unsigned short)
 | 
			
		||||
// for the address family.
 | 
			
		||||
type RawSockaddr interface {
 | 
			
		||||
	// Sockaddr returns a pointer to the RawSockaddr and its struct size, allowing
 | 
			
		||||
	// for the RawSockaddr's data to be overwritten by syscalls (if necessary).
 | 
			
		||||
	//
 | 
			
		||||
	// It is the callers responsibility to validate that the values are valid; invalid
 | 
			
		||||
	// pointers or size can cause a panic.
 | 
			
		||||
	Sockaddr() (unsafe.Pointer, int32, error)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										179
									
								
								vendor/github.com/Microsoft/go-winio/internal/socket/socket.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								vendor/github.com/Microsoft/go-winio/internal/socket/socket.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,179 @@
 | 
			
		||||
//go:build windows
 | 
			
		||||
 | 
			
		||||
package socket
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"github.com/Microsoft/go-winio/pkg/guid"
 | 
			
		||||
	"golang.org/x/sys/windows"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go socket.go
 | 
			
		||||
 | 
			
		||||
//sys getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) [failretval==socketError] = ws2_32.getsockname
 | 
			
		||||
//sys getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) [failretval==socketError] = ws2_32.getpeername
 | 
			
		||||
//sys bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind
 | 
			
		||||
 | 
			
		||||
const socketError = uintptr(^uint32(0))
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// todo(helsaawy): create custom error types to store the desired vs actual size and addr family?
 | 
			
		||||
 | 
			
		||||
	ErrBufferSize     = errors.New("buffer size")
 | 
			
		||||
	ErrAddrFamily     = errors.New("address family")
 | 
			
		||||
	ErrInvalidPointer = errors.New("invalid pointer")
 | 
			
		||||
	ErrSocketClosed   = fmt.Errorf("socket closed: %w", net.ErrClosed)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// todo(helsaawy): replace these with generics, ie: GetSockName[S RawSockaddr](s windows.Handle) (S, error)
 | 
			
		||||
 | 
			
		||||
// GetSockName writes the local address of socket s to the [RawSockaddr] rsa.
 | 
			
		||||
// If rsa is not large enough, the [windows.WSAEFAULT] is returned.
 | 
			
		||||
func GetSockName(s windows.Handle, rsa RawSockaddr) error {
 | 
			
		||||
	ptr, l, err := rsa.Sockaddr()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("could not retrieve socket pointer and size: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// although getsockname returns WSAEFAULT if the buffer is too small, it does not set
 | 
			
		||||
	// &l to the correct size, so--apart from doubling the buffer repeatedly--there is no remedy
 | 
			
		||||
	return getsockname(s, ptr, &l)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetPeerName returns the remote address the socket is connected to.
 | 
			
		||||
//
 | 
			
		||||
// See [GetSockName] for more information.
 | 
			
		||||
func GetPeerName(s windows.Handle, rsa RawSockaddr) error {
 | 
			
		||||
	ptr, l, err := rsa.Sockaddr()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("could not retrieve socket pointer and size: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return getpeername(s, ptr, &l)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Bind(s windows.Handle, rsa RawSockaddr) (err error) {
 | 
			
		||||
	ptr, l, err := rsa.Sockaddr()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("could not retrieve socket pointer and size: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return bind(s, ptr, l)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// "golang.org/x/sys/windows".ConnectEx and .Bind only accept internal implementations of the
 | 
			
		||||
// their sockaddr interface, so they cannot be used with HvsockAddr
 | 
			
		||||
// Replicate functionality here from
 | 
			
		||||
// https://cs.opensource.google/go/x/sys/+/master:windows/syscall_windows.go
 | 
			
		||||
 | 
			
		||||
// The function pointers to `AcceptEx`, `ConnectEx` and `GetAcceptExSockaddrs` must be loaded at
 | 
			
		||||
// runtime via a WSAIoctl call:
 | 
			
		||||
// https://docs.microsoft.com/en-us/windows/win32/api/Mswsock/nc-mswsock-lpfn_connectex#remarks
 | 
			
		||||
 | 
			
		||||
type runtimeFunc struct {
 | 
			
		||||
	id   guid.GUID
 | 
			
		||||
	once sync.Once
 | 
			
		||||
	addr uintptr
 | 
			
		||||
	err  error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *runtimeFunc) Load() error {
 | 
			
		||||
	f.once.Do(func() {
 | 
			
		||||
		var s windows.Handle
 | 
			
		||||
		s, f.err = windows.Socket(windows.AF_INET, windows.SOCK_STREAM, windows.IPPROTO_TCP)
 | 
			
		||||
		if f.err != nil {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		defer windows.CloseHandle(s) //nolint:errcheck
 | 
			
		||||
 | 
			
		||||
		var n uint32
 | 
			
		||||
		f.err = windows.WSAIoctl(s,
 | 
			
		||||
			windows.SIO_GET_EXTENSION_FUNCTION_POINTER,
 | 
			
		||||
			(*byte)(unsafe.Pointer(&f.id)),
 | 
			
		||||
			uint32(unsafe.Sizeof(f.id)),
 | 
			
		||||
			(*byte)(unsafe.Pointer(&f.addr)),
 | 
			
		||||
			uint32(unsafe.Sizeof(f.addr)),
 | 
			
		||||
			&n,
 | 
			
		||||
			nil, //overlapped
 | 
			
		||||
			0,   //completionRoutine
 | 
			
		||||
		)
 | 
			
		||||
	})
 | 
			
		||||
	return f.err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// todo: add `AcceptEx` and `GetAcceptExSockaddrs`
 | 
			
		||||
	WSAID_CONNECTEX = guid.GUID{ //revive:disable-line:var-naming ALL_CAPS
 | 
			
		||||
		Data1: 0x25a207b9,
 | 
			
		||||
		Data2: 0xddf3,
 | 
			
		||||
		Data3: 0x4660,
 | 
			
		||||
		Data4: [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	connectExFunc = runtimeFunc{id: WSAID_CONNECTEX}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func ConnectEx(
 | 
			
		||||
	fd windows.Handle,
 | 
			
		||||
	rsa RawSockaddr,
 | 
			
		||||
	sendBuf *byte,
 | 
			
		||||
	sendDataLen uint32,
 | 
			
		||||
	bytesSent *uint32,
 | 
			
		||||
	overlapped *windows.Overlapped,
 | 
			
		||||
) error {
 | 
			
		||||
	if err := connectExFunc.Load(); err != nil {
 | 
			
		||||
		return fmt.Errorf("failed to load ConnectEx function pointer: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	ptr, n, err := rsa.Sockaddr()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BOOL LpfnConnectex(
 | 
			
		||||
//   [in]           SOCKET s,
 | 
			
		||||
//   [in]           const sockaddr *name,
 | 
			
		||||
//   [in]           int namelen,
 | 
			
		||||
//   [in, optional] PVOID lpSendBuffer,
 | 
			
		||||
//   [in]           DWORD dwSendDataLength,
 | 
			
		||||
//   [out]          LPDWORD lpdwBytesSent,
 | 
			
		||||
//   [in]           LPOVERLAPPED lpOverlapped
 | 
			
		||||
// )
 | 
			
		||||
 | 
			
		||||
func connectEx(
 | 
			
		||||
	s windows.Handle,
 | 
			
		||||
	name unsafe.Pointer,
 | 
			
		||||
	namelen int32,
 | 
			
		||||
	sendBuf *byte,
 | 
			
		||||
	sendDataLen uint32,
 | 
			
		||||
	bytesSent *uint32,
 | 
			
		||||
	overlapped *windows.Overlapped,
 | 
			
		||||
) (err error) {
 | 
			
		||||
	// todo: after upgrading to 1.18, switch from syscall.Syscall9 to syscall.SyscallN
 | 
			
		||||
	r1, _, e1 := syscall.Syscall9(connectExFunc.addr,
 | 
			
		||||
		7,
 | 
			
		||||
		uintptr(s),
 | 
			
		||||
		uintptr(name),
 | 
			
		||||
		uintptr(namelen),
 | 
			
		||||
		uintptr(unsafe.Pointer(sendBuf)),
 | 
			
		||||
		uintptr(sendDataLen),
 | 
			
		||||
		uintptr(unsafe.Pointer(bytesSent)),
 | 
			
		||||
		uintptr(unsafe.Pointer(overlapped)),
 | 
			
		||||
		0,
 | 
			
		||||
		0)
 | 
			
		||||
	if r1 == 0 {
 | 
			
		||||
		if e1 != 0 {
 | 
			
		||||
			err = error(e1)
 | 
			
		||||
		} else {
 | 
			
		||||
			err = syscall.EINVAL
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										72
									
								
								vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
//go:build windows
 | 
			
		||||
 | 
			
		||||
// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package socket
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/windows"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var _ unsafe.Pointer
 | 
			
		||||
 | 
			
		||||
// Do the interface allocations only once for common
 | 
			
		||||
// Errno values.
 | 
			
		||||
const (
 | 
			
		||||
	errnoERROR_IO_PENDING = 997
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
 | 
			
		||||
	errERROR_EINVAL     error = syscall.EINVAL
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// errnoErr returns common boxed Errno values, to prevent
 | 
			
		||||
// allocations at runtime.
 | 
			
		||||
func errnoErr(e syscall.Errno) error {
 | 
			
		||||
	switch e {
 | 
			
		||||
	case 0:
 | 
			
		||||
		return errERROR_EINVAL
 | 
			
		||||
	case errnoERROR_IO_PENDING:
 | 
			
		||||
		return errERROR_IO_PENDING
 | 
			
		||||
	}
 | 
			
		||||
	// TODO: add more here, after collecting data on the common
 | 
			
		||||
	// error values see on Windows. (perhaps when running
 | 
			
		||||
	// all.bat?)
 | 
			
		||||
	return e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	modws2_32 = windows.NewLazySystemDLL("ws2_32.dll")
 | 
			
		||||
 | 
			
		||||
	procbind        = modws2_32.NewProc("bind")
 | 
			
		||||
	procgetpeername = modws2_32.NewProc("getpeername")
 | 
			
		||||
	procgetsockname = modws2_32.NewProc("getsockname")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err error) {
 | 
			
		||||
	r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))
 | 
			
		||||
	if r1 == socketError {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) {
 | 
			
		||||
	r1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen)))
 | 
			
		||||
	if r1 == socketError {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) {
 | 
			
		||||
	r1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen)))
 | 
			
		||||
	if r1 == socketError {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										124
									
								
								vendor/github.com/Microsoft/go-winio/pipe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										124
									
								
								vendor/github.com/Microsoft/go-winio/pipe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,4 @@
 | 
			
		||||
//go:build windows
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package winio
 | 
			
		||||
@@ -13,6 +14,8 @@ import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/windows"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//sys connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) = ConnectNamedPipe
 | 
			
		||||
@@ -21,10 +24,10 @@ import (
 | 
			
		||||
//sys getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo
 | 
			
		||||
//sys getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW
 | 
			
		||||
//sys localAlloc(uFlags uint32, length uint32) (ptr uintptr) = LocalAlloc
 | 
			
		||||
//sys ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) = ntdll.NtCreateNamedPipeFile
 | 
			
		||||
//sys rtlNtStatusToDosError(status ntstatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb
 | 
			
		||||
//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) = ntdll.RtlDosPathNameToNtPathName_U
 | 
			
		||||
//sys rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) = ntdll.RtlDefaultNpAcl
 | 
			
		||||
//sys ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntStatus) = ntdll.NtCreateNamedPipeFile
 | 
			
		||||
//sys rtlNtStatusToDosError(status ntStatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb
 | 
			
		||||
//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntStatus) = ntdll.RtlDosPathNameToNtPathName_U
 | 
			
		||||
//sys rtlDefaultNpAcl(dacl *uintptr) (status ntStatus) = ntdll.RtlDefaultNpAcl
 | 
			
		||||
 | 
			
		||||
type ioStatusBlock struct {
 | 
			
		||||
	Status, Information uintptr
 | 
			
		||||
@@ -51,45 +54,22 @@ type securityDescriptor struct {
 | 
			
		||||
	Control  uint16
 | 
			
		||||
	Owner    uintptr
 | 
			
		||||
	Group    uintptr
 | 
			
		||||
	Sacl     uintptr
 | 
			
		||||
	Dacl     uintptr
 | 
			
		||||
	Sacl     uintptr //revive:disable-line:var-naming SACL, not Sacl
 | 
			
		||||
	Dacl     uintptr //revive:disable-line:var-naming DACL, not Dacl
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ntstatus int32
 | 
			
		||||
type ntStatus int32
 | 
			
		||||
 | 
			
		||||
func (status ntstatus) Err() error {
 | 
			
		||||
func (status ntStatus) Err() error {
 | 
			
		||||
	if status >= 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return rtlNtStatusToDosError(status)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	cERROR_PIPE_BUSY      = syscall.Errno(231)
 | 
			
		||||
	cERROR_NO_DATA        = syscall.Errno(232)
 | 
			
		||||
	cERROR_PIPE_CONNECTED = syscall.Errno(535)
 | 
			
		||||
	cERROR_SEM_TIMEOUT    = syscall.Errno(121)
 | 
			
		||||
 | 
			
		||||
	cSECURITY_SQOS_PRESENT = 0x100000
 | 
			
		||||
	cSECURITY_ANONYMOUS    = 0
 | 
			
		||||
 | 
			
		||||
	cPIPE_TYPE_MESSAGE = 4
 | 
			
		||||
 | 
			
		||||
	cPIPE_READMODE_MESSAGE = 2
 | 
			
		||||
 | 
			
		||||
	cFILE_OPEN   = 1
 | 
			
		||||
	cFILE_CREATE = 2
 | 
			
		||||
 | 
			
		||||
	cFILE_PIPE_MESSAGE_TYPE          = 1
 | 
			
		||||
	cFILE_PIPE_REJECT_REMOTE_CLIENTS = 2
 | 
			
		||||
 | 
			
		||||
	cSE_DACL_PRESENT = 4
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed.
 | 
			
		||||
	// This error should match net.errClosing since docker takes a dependency on its text.
 | 
			
		||||
	ErrPipeListenerClosed = errors.New("use of closed network connection")
 | 
			
		||||
	ErrPipeListenerClosed = net.ErrClosed
 | 
			
		||||
 | 
			
		||||
	errPipeWriteClosed = errors.New("pipe has been closed for write")
 | 
			
		||||
)
 | 
			
		||||
@@ -116,9 +96,10 @@ func (f *win32Pipe) RemoteAddr() net.Addr {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *win32Pipe) SetDeadline(t time.Time) error {
 | 
			
		||||
	f.SetReadDeadline(t)
 | 
			
		||||
	f.SetWriteDeadline(t)
 | 
			
		||||
	return nil
 | 
			
		||||
	if err := f.SetReadDeadline(t); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return f.SetWriteDeadline(t)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CloseWrite closes the write side of a message pipe in byte mode.
 | 
			
		||||
@@ -157,14 +138,14 @@ func (f *win32MessageBytePipe) Read(b []byte) (int, error) {
 | 
			
		||||
		return 0, io.EOF
 | 
			
		||||
	}
 | 
			
		||||
	n, err := f.win32File.Read(b)
 | 
			
		||||
	if err == io.EOF {
 | 
			
		||||
	if err == io.EOF { //nolint:errorlint
 | 
			
		||||
		// If this was the result of a zero-byte read, then
 | 
			
		||||
		// it is possible that the read was due to a zero-size
 | 
			
		||||
		// message. Since we are simulating CloseWrite with a
 | 
			
		||||
		// zero-byte message, ensure that all future Read() calls
 | 
			
		||||
		// also return EOF.
 | 
			
		||||
		f.readEOF = true
 | 
			
		||||
	} else if err == syscall.ERROR_MORE_DATA {
 | 
			
		||||
	} else if err == syscall.ERROR_MORE_DATA { //nolint:errorlint // err is Errno
 | 
			
		||||
		// ERROR_MORE_DATA indicates that the pipe's read mode is message mode
 | 
			
		||||
		// and the message still has more bytes. Treat this as a success, since
 | 
			
		||||
		// this package presents all named pipes as byte streams.
 | 
			
		||||
@@ -173,7 +154,7 @@ func (f *win32MessageBytePipe) Read(b []byte) (int, error) {
 | 
			
		||||
	return n, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s pipeAddress) Network() string {
 | 
			
		||||
func (pipeAddress) Network() string {
 | 
			
		||||
	return "pipe"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -184,16 +165,21 @@ func (s pipeAddress) String() string {
 | 
			
		||||
// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout.
 | 
			
		||||
func tryDialPipe(ctx context.Context, path *string, access uint32) (syscall.Handle, error) {
 | 
			
		||||
	for {
 | 
			
		||||
 | 
			
		||||
		select {
 | 
			
		||||
		case <-ctx.Done():
 | 
			
		||||
			return syscall.Handle(0), ctx.Err()
 | 
			
		||||
		default:
 | 
			
		||||
			h, err := createFile(*path, access, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0)
 | 
			
		||||
			h, err := createFile(*path,
 | 
			
		||||
				access,
 | 
			
		||||
				0,
 | 
			
		||||
				nil,
 | 
			
		||||
				syscall.OPEN_EXISTING,
 | 
			
		||||
				windows.FILE_FLAG_OVERLAPPED|windows.SECURITY_SQOS_PRESENT|windows.SECURITY_ANONYMOUS,
 | 
			
		||||
				0)
 | 
			
		||||
			if err == nil {
 | 
			
		||||
				return h, nil
 | 
			
		||||
			}
 | 
			
		||||
			if err != cERROR_PIPE_BUSY {
 | 
			
		||||
			if err != windows.ERROR_PIPE_BUSY { //nolint:errorlint // err is Errno
 | 
			
		||||
				return h, &os.PathError{Err: err, Op: "open", Path: *path}
 | 
			
		||||
			}
 | 
			
		||||
			// Wait 10 msec and try again. This is a rather simplistic
 | 
			
		||||
@@ -213,9 +199,10 @@ func DialPipe(path string, timeout *time.Duration) (net.Conn, error) {
 | 
			
		||||
	} else {
 | 
			
		||||
		absTimeout = time.Now().Add(2 * time.Second)
 | 
			
		||||
	}
 | 
			
		||||
	ctx, _ := context.WithDeadline(context.Background(), absTimeout)
 | 
			
		||||
	ctx, cancel := context.WithDeadline(context.Background(), absTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	conn, err := DialPipeContext(ctx, path)
 | 
			
		||||
	if err == context.DeadlineExceeded {
 | 
			
		||||
	if errors.Is(err, context.DeadlineExceeded) {
 | 
			
		||||
		return nil, ErrTimeout
 | 
			
		||||
	}
 | 
			
		||||
	return conn, err
 | 
			
		||||
@@ -251,7 +238,7 @@ func DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn,
 | 
			
		||||
 | 
			
		||||
	// If the pipe is in message mode, return a message byte pipe, which
 | 
			
		||||
	// supports CloseWrite().
 | 
			
		||||
	if flags&cPIPE_TYPE_MESSAGE != 0 {
 | 
			
		||||
	if flags&windows.PIPE_TYPE_MESSAGE != 0 {
 | 
			
		||||
		return &win32MessageBytePipe{
 | 
			
		||||
			win32Pipe: win32Pipe{win32File: f, path: path},
 | 
			
		||||
		}, nil
 | 
			
		||||
@@ -283,7 +270,11 @@ func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (sy
 | 
			
		||||
	oa.Length = unsafe.Sizeof(oa)
 | 
			
		||||
 | 
			
		||||
	var ntPath unicodeString
 | 
			
		||||
	if err := rtlDosPathNameToNtPathName(&path16[0], &ntPath, 0, 0).Err(); err != nil {
 | 
			
		||||
	if err := rtlDosPathNameToNtPathName(&path16[0],
 | 
			
		||||
		&ntPath,
 | 
			
		||||
		0,
 | 
			
		||||
		0,
 | 
			
		||||
	).Err(); err != nil {
 | 
			
		||||
		return 0, &os.PathError{Op: "open", Path: path, Err: err}
 | 
			
		||||
	}
 | 
			
		||||
	defer localFree(ntPath.Buffer)
 | 
			
		||||
@@ -292,8 +283,8 @@ func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (sy
 | 
			
		||||
	// The security descriptor is only needed for the first pipe.
 | 
			
		||||
	if first {
 | 
			
		||||
		if sd != nil {
 | 
			
		||||
			len := uint32(len(sd))
 | 
			
		||||
			sdb := localAlloc(0, len)
 | 
			
		||||
			l := uint32(len(sd))
 | 
			
		||||
			sdb := localAlloc(0, l)
 | 
			
		||||
			defer localFree(sdb)
 | 
			
		||||
			copy((*[0xffff]byte)(unsafe.Pointer(sdb))[:], sd)
 | 
			
		||||
			oa.SecurityDescriptor = (*securityDescriptor)(unsafe.Pointer(sdb))
 | 
			
		||||
@@ -301,28 +292,28 @@ func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (sy
 | 
			
		||||
			// Construct the default named pipe security descriptor.
 | 
			
		||||
			var dacl uintptr
 | 
			
		||||
			if err := rtlDefaultNpAcl(&dacl).Err(); err != nil {
 | 
			
		||||
				return 0, fmt.Errorf("getting default named pipe ACL: %s", err)
 | 
			
		||||
				return 0, fmt.Errorf("getting default named pipe ACL: %w", err)
 | 
			
		||||
			}
 | 
			
		||||
			defer localFree(dacl)
 | 
			
		||||
 | 
			
		||||
			sdb := &securityDescriptor{
 | 
			
		||||
				Revision: 1,
 | 
			
		||||
				Control:  cSE_DACL_PRESENT,
 | 
			
		||||
				Control:  windows.SE_DACL_PRESENT,
 | 
			
		||||
				Dacl:     dacl,
 | 
			
		||||
			}
 | 
			
		||||
			oa.SecurityDescriptor = sdb
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	typ := uint32(cFILE_PIPE_REJECT_REMOTE_CLIENTS)
 | 
			
		||||
	typ := uint32(windows.FILE_PIPE_REJECT_REMOTE_CLIENTS)
 | 
			
		||||
	if c.MessageMode {
 | 
			
		||||
		typ |= cFILE_PIPE_MESSAGE_TYPE
 | 
			
		||||
		typ |= windows.FILE_PIPE_MESSAGE_TYPE
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	disposition := uint32(cFILE_OPEN)
 | 
			
		||||
	disposition := uint32(windows.FILE_OPEN)
 | 
			
		||||
	access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | syscall.SYNCHRONIZE)
 | 
			
		||||
	if first {
 | 
			
		||||
		disposition = cFILE_CREATE
 | 
			
		||||
		disposition = windows.FILE_CREATE
 | 
			
		||||
		// By not asking for read or write access, the named pipe file system
 | 
			
		||||
		// will put this pipe into an initially disconnected state, blocking
 | 
			
		||||
		// client connections until the next call with first == false.
 | 
			
		||||
@@ -335,7 +326,20 @@ func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (sy
 | 
			
		||||
		h    syscall.Handle
 | 
			
		||||
		iosb ioStatusBlock
 | 
			
		||||
	)
 | 
			
		||||
	err = ntCreateNamedPipeFile(&h, access, &oa, &iosb, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE, disposition, 0, typ, 0, 0, 0xffffffff, uint32(c.InputBufferSize), uint32(c.OutputBufferSize), &timeout).Err()
 | 
			
		||||
	err = ntCreateNamedPipeFile(&h,
 | 
			
		||||
		access,
 | 
			
		||||
		&oa,
 | 
			
		||||
		&iosb,
 | 
			
		||||
		syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE,
 | 
			
		||||
		disposition,
 | 
			
		||||
		0,
 | 
			
		||||
		typ,
 | 
			
		||||
		0,
 | 
			
		||||
		0,
 | 
			
		||||
		0xffffffff,
 | 
			
		||||
		uint32(c.InputBufferSize),
 | 
			
		||||
		uint32(c.OutputBufferSize),
 | 
			
		||||
		&timeout).Err()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, &os.PathError{Op: "open", Path: path, Err: err}
 | 
			
		||||
	}
 | 
			
		||||
@@ -380,7 +384,7 @@ func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) {
 | 
			
		||||
		p.Close()
 | 
			
		||||
		p = nil
 | 
			
		||||
		err = <-ch
 | 
			
		||||
		if err == nil || err == ErrFileClosed {
 | 
			
		||||
		if err == nil || err == ErrFileClosed { //nolint:errorlint // err is Errno
 | 
			
		||||
			err = ErrPipeListenerClosed
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -402,12 +406,12 @@ func (l *win32PipeListener) listenerRoutine() {
 | 
			
		||||
				p, err = l.makeConnectedServerPipe()
 | 
			
		||||
				// If the connection was immediately closed by the client, try
 | 
			
		||||
				// again.
 | 
			
		||||
				if err != cERROR_NO_DATA {
 | 
			
		||||
				if err != windows.ERROR_NO_DATA { //nolint:errorlint // err is Errno
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			responseCh <- acceptResponse{p, err}
 | 
			
		||||
			closed = err == ErrPipeListenerClosed
 | 
			
		||||
			closed = err == ErrPipeListenerClosed //nolint:errorlint // err is Errno
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	syscall.Close(l.firstHandle)
 | 
			
		||||
@@ -469,15 +473,15 @@ func ListenPipe(path string, c *PipeConfig) (net.Listener, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func connectPipe(p *win32File) error {
 | 
			
		||||
	c, err := p.prepareIo()
 | 
			
		||||
	c, err := p.prepareIO()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer p.wg.Done()
 | 
			
		||||
 | 
			
		||||
	err = connectNamedPipe(p.handle, &c.o)
 | 
			
		||||
	_, err = p.asyncIo(c, nil, 0, err)
 | 
			
		||||
	if err != nil && err != cERROR_PIPE_CONNECTED {
 | 
			
		||||
	_, err = p.asyncIO(c, nil, 0, err)
 | 
			
		||||
	if err != nil && err != windows.ERROR_PIPE_CONNECTED { //nolint:errorlint // err is Errno
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,3 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
// Package guid provides a GUID type. The backing structure for a GUID is
 | 
			
		||||
// identical to that used by the golang.org/x/sys/windows GUID type.
 | 
			
		||||
// There are two main binary encodings used for a GUID, the big-endian encoding,
 | 
			
		||||
@@ -9,24 +7,26 @@ package guid
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"crypto/sha1"
 | 
			
		||||
	"crypto/sha1" //nolint:gosec // not used for secure application
 | 
			
		||||
	"encoding"
 | 
			
		||||
	"encoding/binary"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strconv"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:generate go run golang.org/x/tools/cmd/stringer -type=Variant -trimprefix=Variant -linecomment
 | 
			
		||||
 | 
			
		||||
// Variant specifies which GUID variant (or "type") of the GUID. It determines
 | 
			
		||||
// how the entirety of the rest of the GUID is interpreted.
 | 
			
		||||
type Variant uint8
 | 
			
		||||
 | 
			
		||||
// The variants specified by RFC 4122.
 | 
			
		||||
// The variants specified by RFC 4122 section 4.1.1.
 | 
			
		||||
const (
 | 
			
		||||
	// VariantUnknown specifies a GUID variant which does not conform to one of
 | 
			
		||||
	// the variant encodings specified in RFC 4122.
 | 
			
		||||
	VariantUnknown Variant = iota
 | 
			
		||||
	VariantNCS
 | 
			
		||||
	VariantRFC4122
 | 
			
		||||
	VariantRFC4122 // RFC 4122
 | 
			
		||||
	VariantMicrosoft
 | 
			
		||||
	VariantFuture
 | 
			
		||||
)
 | 
			
		||||
@@ -36,6 +36,10 @@ const (
 | 
			
		||||
// hash of an input string.
 | 
			
		||||
type Version uint8
 | 
			
		||||
 | 
			
		||||
func (v Version) String() string {
 | 
			
		||||
	return strconv.FormatUint(uint64(v), 10)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ = (encoding.TextMarshaler)(GUID{})
 | 
			
		||||
var _ = (encoding.TextUnmarshaler)(&GUID{})
 | 
			
		||||
 | 
			
		||||
@@ -61,7 +65,7 @@ func NewV4() (GUID, error) {
 | 
			
		||||
// big-endian UTF16 stream of bytes. If that is desired, the string can be
 | 
			
		||||
// encoded as such before being passed to this function.
 | 
			
		||||
func NewV5(namespace GUID, name []byte) (GUID, error) {
 | 
			
		||||
	b := sha1.New()
 | 
			
		||||
	b := sha1.New() //nolint:gosec // not used for secure application
 | 
			
		||||
	namespaceBytes := namespace.ToArray()
 | 
			
		||||
	b.Write(namespaceBytes[:])
 | 
			
		||||
	b.Write(name)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,4 @@
 | 
			
		||||
//go:build !windows
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package guid
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,6 @@
 | 
			
		||||
//go:build windows
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package guid
 | 
			
		||||
 | 
			
		||||
import "golang.org/x/sys/windows"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
// Code generated by "stringer -type=Variant -trimprefix=Variant -linecomment"; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package guid
 | 
			
		||||
 | 
			
		||||
import "strconv"
 | 
			
		||||
 | 
			
		||||
func _() {
 | 
			
		||||
	// An "invalid array index" compiler error signifies that the constant values have changed.
 | 
			
		||||
	// Re-run the stringer command to generate them again.
 | 
			
		||||
	var x [1]struct{}
 | 
			
		||||
	_ = x[VariantUnknown-0]
 | 
			
		||||
	_ = x[VariantNCS-1]
 | 
			
		||||
	_ = x[VariantRFC4122-2]
 | 
			
		||||
	_ = x[VariantMicrosoft-3]
 | 
			
		||||
	_ = x[VariantFuture-4]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const _Variant_name = "UnknownNCSRFC 4122MicrosoftFuture"
 | 
			
		||||
 | 
			
		||||
var _Variant_index = [...]uint8{0, 7, 10, 18, 27, 33}
 | 
			
		||||
 | 
			
		||||
func (i Variant) String() string {
 | 
			
		||||
	if i >= Variant(len(_Variant_index)-1) {
 | 
			
		||||
		return "Variant(" + strconv.FormatInt(int64(i), 10) + ")"
 | 
			
		||||
	}
 | 
			
		||||
	return _Variant_name[_Variant_index[i]:_Variant_index[i+1]]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								vendor/github.com/Microsoft/go-winio/privilege.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/github.com/Microsoft/go-winio/privilege.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,4 @@
 | 
			
		||||
//go:build windows
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package winio
 | 
			
		||||
@@ -24,22 +25,17 @@ import (
 | 
			
		||||
//sys lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) = advapi32.LookupPrivilegeDisplayNameW
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	SE_PRIVILEGE_ENABLED = 2
 | 
			
		||||
	//revive:disable-next-line:var-naming ALL_CAPS
 | 
			
		||||
	SE_PRIVILEGE_ENABLED = windows.SE_PRIVILEGE_ENABLED
 | 
			
		||||
 | 
			
		||||
	ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300
 | 
			
		||||
	//revive:disable-next-line:var-naming ALL_CAPS
 | 
			
		||||
	ERROR_NOT_ALL_ASSIGNED syscall.Errno = windows.ERROR_NOT_ALL_ASSIGNED
 | 
			
		||||
 | 
			
		||||
	SeBackupPrivilege   = "SeBackupPrivilege"
 | 
			
		||||
	SeRestorePrivilege  = "SeRestorePrivilege"
 | 
			
		||||
	SeSecurityPrivilege = "SeSecurityPrivilege"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	securityAnonymous = iota
 | 
			
		||||
	securityIdentification
 | 
			
		||||
	securityImpersonation
 | 
			
		||||
	securityDelegation
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	privNames     = make(map[string]uint64)
 | 
			
		||||
	privNameMutex sync.Mutex
 | 
			
		||||
@@ -51,11 +47,9 @@ type PrivilegeError struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *PrivilegeError) Error() string {
 | 
			
		||||
	s := ""
 | 
			
		||||
	s := "Could not enable privilege "
 | 
			
		||||
	if len(e.privileges) > 1 {
 | 
			
		||||
		s = "Could not enable privileges "
 | 
			
		||||
	} else {
 | 
			
		||||
		s = "Could not enable privilege "
 | 
			
		||||
	}
 | 
			
		||||
	for i, p := range e.privileges {
 | 
			
		||||
		if i != 0 {
 | 
			
		||||
@@ -94,7 +88,7 @@ func RunWithPrivileges(names []string, fn func() error) error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func mapPrivileges(names []string) ([]uint64, error) {
 | 
			
		||||
	var privileges []uint64
 | 
			
		||||
	privileges := make([]uint64, 0, len(names))
 | 
			
		||||
	privNameMutex.Lock()
 | 
			
		||||
	defer privNameMutex.Unlock()
 | 
			
		||||
	for _, name := range names {
 | 
			
		||||
@@ -127,7 +121,7 @@ func enableDisableProcessPrivilege(names []string, action uint32) error {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p, _ := windows.GetCurrentProcess()
 | 
			
		||||
	p := windows.CurrentProcess()
 | 
			
		||||
	var token windows.Token
 | 
			
		||||
	err = windows.OpenProcessToken(p, windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, &token)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -140,10 +134,10 @@ func enableDisableProcessPrivilege(names []string, action uint32) error {
 | 
			
		||||
 | 
			
		||||
func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) error {
 | 
			
		||||
	var b bytes.Buffer
 | 
			
		||||
	binary.Write(&b, binary.LittleEndian, uint32(len(privileges)))
 | 
			
		||||
	_ = binary.Write(&b, binary.LittleEndian, uint32(len(privileges)))
 | 
			
		||||
	for _, p := range privileges {
 | 
			
		||||
		binary.Write(&b, binary.LittleEndian, p)
 | 
			
		||||
		binary.Write(&b, binary.LittleEndian, action)
 | 
			
		||||
		_ = binary.Write(&b, binary.LittleEndian, p)
 | 
			
		||||
		_ = binary.Write(&b, binary.LittleEndian, action)
 | 
			
		||||
	}
 | 
			
		||||
	prevState := make([]byte, b.Len())
 | 
			
		||||
	reqSize := uint32(0)
 | 
			
		||||
@@ -151,7 +145,7 @@ func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) e
 | 
			
		||||
	if !success {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err == ERROR_NOT_ALL_ASSIGNED {
 | 
			
		||||
	if err == ERROR_NOT_ALL_ASSIGNED { //nolint:errorlint // err is Errno
 | 
			
		||||
		return &PrivilegeError{privileges}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
@@ -177,7 +171,7 @@ func getPrivilegeName(luid uint64) string {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newThreadToken() (windows.Token, error) {
 | 
			
		||||
	err := impersonateSelf(securityImpersonation)
 | 
			
		||||
	err := impersonateSelf(windows.SecurityImpersonation)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/github.com/Microsoft/go-winio/reparse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/Microsoft/go-winio/reparse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,6 @@
 | 
			
		||||
//go:build windows
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package winio
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -113,16 +116,16 @@ func EncodeReparsePoint(rp *ReparsePoint) []byte {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var b bytes.Buffer
 | 
			
		||||
	binary.Write(&b, binary.LittleEndian, &data)
 | 
			
		||||
	_ = binary.Write(&b, binary.LittleEndian, &data)
 | 
			
		||||
	if !rp.IsMountPoint {
 | 
			
		||||
		flags := uint32(0)
 | 
			
		||||
		if relative {
 | 
			
		||||
			flags |= 1
 | 
			
		||||
		}
 | 
			
		||||
		binary.Write(&b, binary.LittleEndian, flags)
 | 
			
		||||
		_ = binary.Write(&b, binary.LittleEndian, flags)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	binary.Write(&b, binary.LittleEndian, ntTarget16)
 | 
			
		||||
	binary.Write(&b, binary.LittleEndian, target16)
 | 
			
		||||
	_ = binary.Write(&b, binary.LittleEndian, ntTarget16)
 | 
			
		||||
	_ = binary.Write(&b, binary.LittleEndian, target16)
 | 
			
		||||
	return b.Bytes()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								vendor/github.com/Microsoft/go-winio/sd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								vendor/github.com/Microsoft/go-winio/sd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,23 +1,25 @@
 | 
			
		||||
//go:build windows
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package winio
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/windows"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//sys lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountNameW
 | 
			
		||||
//sys lookupAccountSid(systemName *uint16, sid *byte, name *uint16, nameSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountSidW
 | 
			
		||||
//sys convertSidToStringSid(sid *byte, str **uint16) (err error) = advapi32.ConvertSidToStringSidW
 | 
			
		||||
//sys convertStringSidToSid(str *uint16, sid **byte) (err error) = advapi32.ConvertStringSidToSidW
 | 
			
		||||
//sys convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW
 | 
			
		||||
//sys convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW
 | 
			
		||||
//sys localFree(mem uintptr) = LocalFree
 | 
			
		||||
//sys getSecurityDescriptorLength(sd uintptr) (len uint32) = advapi32.GetSecurityDescriptorLength
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	cERROR_NONE_MAPPED = syscall.Errno(1332)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type AccountLookupError struct {
 | 
			
		||||
	Name string
 | 
			
		||||
	Err  error
 | 
			
		||||
@@ -28,8 +30,10 @@ func (e *AccountLookupError) Error() string {
 | 
			
		||||
		return "lookup account: empty account name specified"
 | 
			
		||||
	}
 | 
			
		||||
	var s string
 | 
			
		||||
	switch e.Err {
 | 
			
		||||
	case cERROR_NONE_MAPPED:
 | 
			
		||||
	switch {
 | 
			
		||||
	case errors.Is(e.Err, windows.ERROR_INVALID_SID):
 | 
			
		||||
		s = "the security ID structure is invalid"
 | 
			
		||||
	case errors.Is(e.Err, windows.ERROR_NONE_MAPPED):
 | 
			
		||||
		s = "not found"
 | 
			
		||||
	default:
 | 
			
		||||
		s = e.Err.Error()
 | 
			
		||||
@@ -37,6 +41,8 @@ func (e *AccountLookupError) Error() string {
 | 
			
		||||
	return "lookup account " + e.Name + ": " + s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *AccountLookupError) Unwrap() error { return e.Err }
 | 
			
		||||
 | 
			
		||||
type SddlConversionError struct {
 | 
			
		||||
	Sddl string
 | 
			
		||||
	Err  error
 | 
			
		||||
@@ -46,15 +52,19 @@ func (e *SddlConversionError) Error() string {
 | 
			
		||||
	return "convert " + e.Sddl + ": " + e.Err.Error()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *SddlConversionError) Unwrap() error { return e.Err }
 | 
			
		||||
 | 
			
		||||
// LookupSidByName looks up the SID of an account by name
 | 
			
		||||
//
 | 
			
		||||
//revive:disable-next-line:var-naming SID, not Sid
 | 
			
		||||
func LookupSidByName(name string) (sid string, err error) {
 | 
			
		||||
	if name == "" {
 | 
			
		||||
		return "", &AccountLookupError{name, cERROR_NONE_MAPPED}
 | 
			
		||||
		return "", &AccountLookupError{name, windows.ERROR_NONE_MAPPED}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var sidSize, sidNameUse, refDomainSize uint32
 | 
			
		||||
	err = lookupAccountName(nil, name, nil, &sidSize, nil, &refDomainSize, &sidNameUse)
 | 
			
		||||
	if err != nil && err != syscall.ERROR_INSUFFICIENT_BUFFER {
 | 
			
		||||
	if err != nil && err != syscall.ERROR_INSUFFICIENT_BUFFER { //nolint:errorlint // err is Errno
 | 
			
		||||
		return "", &AccountLookupError{name, err}
 | 
			
		||||
	}
 | 
			
		||||
	sidBuffer := make([]byte, sidSize)
 | 
			
		||||
@@ -73,6 +83,42 @@ func LookupSidByName(name string) (sid string, err error) {
 | 
			
		||||
	return sid, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LookupNameBySid looks up the name of an account by SID
 | 
			
		||||
//
 | 
			
		||||
//revive:disable-next-line:var-naming SID, not Sid
 | 
			
		||||
func LookupNameBySid(sid string) (name string, err error) {
 | 
			
		||||
	if sid == "" {
 | 
			
		||||
		return "", &AccountLookupError{sid, windows.ERROR_NONE_MAPPED}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sidBuffer, err := windows.UTF16PtrFromString(sid)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", &AccountLookupError{sid, err}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var sidPtr *byte
 | 
			
		||||
	if err = convertStringSidToSid(sidBuffer, &sidPtr); err != nil {
 | 
			
		||||
		return "", &AccountLookupError{sid, err}
 | 
			
		||||
	}
 | 
			
		||||
	defer localFree(uintptr(unsafe.Pointer(sidPtr)))
 | 
			
		||||
 | 
			
		||||
	var nameSize, refDomainSize, sidNameUse uint32
 | 
			
		||||
	err = lookupAccountSid(nil, sidPtr, nil, &nameSize, nil, &refDomainSize, &sidNameUse)
 | 
			
		||||
	if err != nil && err != windows.ERROR_INSUFFICIENT_BUFFER { //nolint:errorlint // err is Errno
 | 
			
		||||
		return "", &AccountLookupError{sid, err}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	nameBuffer := make([]uint16, nameSize)
 | 
			
		||||
	refDomainBuffer := make([]uint16, refDomainSize)
 | 
			
		||||
	err = lookupAccountSid(nil, sidPtr, &nameBuffer[0], &nameSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", &AccountLookupError{sid, err}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	name = windows.UTF16ToString(nameBuffer)
 | 
			
		||||
	return name, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SddlToSecurityDescriptor(sddl string) ([]byte, error) {
 | 
			
		||||
	var sdBuffer uintptr
 | 
			
		||||
	err := convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &sdBuffer, nil)
 | 
			
		||||
@@ -87,7 +133,7 @@ func SddlToSecurityDescriptor(sddl string) ([]byte, error) {
 | 
			
		||||
 | 
			
		||||
func SecurityDescriptorToSddl(sd []byte) (string, error) {
 | 
			
		||||
	var sddl *uint16
 | 
			
		||||
	// The returned string length seems to including an aribtrary number of terminating NULs.
 | 
			
		||||
	// The returned string length seems to include an arbitrary number of terminating NULs.
 | 
			
		||||
	// Don't use it.
 | 
			
		||||
	err := convertSecurityDescriptorToStringSecurityDescriptor(&sd[0], 1, 0xff, &sddl, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/Microsoft/go-winio/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/Microsoft/go-winio/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,5 @@
 | 
			
		||||
//go:build windows
 | 
			
		||||
 | 
			
		||||
package winio
 | 
			
		||||
 | 
			
		||||
//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go file.go pipe.go sd.go fileinfo.go privilege.go backup.go hvsock.go
 | 
			
		||||
//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go ./*.go
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								vendor/github.com/Microsoft/go-winio/tools.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/Microsoft/go-winio/tools.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
//go:build tools
 | 
			
		||||
 | 
			
		||||
package winio
 | 
			
		||||
 | 
			
		||||
import _ "golang.org/x/tools/cmd/stringer"
 | 
			
		||||
							
								
								
									
										45
									
								
								vendor/github.com/Microsoft/go-winio/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								vendor/github.com/Microsoft/go-winio/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,6 @@
 | 
			
		||||
// Code generated by 'go generate'; DO NOT EDIT.
 | 
			
		||||
//go:build windows
 | 
			
		||||
 | 
			
		||||
// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package winio
 | 
			
		||||
 | 
			
		||||
@@ -47,9 +49,11 @@ var (
 | 
			
		||||
	procConvertSecurityDescriptorToStringSecurityDescriptorW = modadvapi32.NewProc("ConvertSecurityDescriptorToStringSecurityDescriptorW")
 | 
			
		||||
	procConvertSidToStringSidW                               = modadvapi32.NewProc("ConvertSidToStringSidW")
 | 
			
		||||
	procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW")
 | 
			
		||||
	procConvertStringSidToSidW                               = modadvapi32.NewProc("ConvertStringSidToSidW")
 | 
			
		||||
	procGetSecurityDescriptorLength                          = modadvapi32.NewProc("GetSecurityDescriptorLength")
 | 
			
		||||
	procImpersonateSelf                                      = modadvapi32.NewProc("ImpersonateSelf")
 | 
			
		||||
	procLookupAccountNameW                                   = modadvapi32.NewProc("LookupAccountNameW")
 | 
			
		||||
	procLookupAccountSidW                                    = modadvapi32.NewProc("LookupAccountSidW")
 | 
			
		||||
	procLookupPrivilegeDisplayNameW                          = modadvapi32.NewProc("LookupPrivilegeDisplayNameW")
 | 
			
		||||
	procLookupPrivilegeNameW                                 = modadvapi32.NewProc("LookupPrivilegeNameW")
 | 
			
		||||
	procLookupPrivilegeValueW                                = modadvapi32.NewProc("LookupPrivilegeValueW")
 | 
			
		||||
@@ -74,7 +78,6 @@ var (
 | 
			
		||||
	procRtlDosPathNameToNtPathName_U                         = modntdll.NewProc("RtlDosPathNameToNtPathName_U")
 | 
			
		||||
	procRtlNtStatusToDosErrorNoTeb                           = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb")
 | 
			
		||||
	procWSAGetOverlappedResult                               = modws2_32.NewProc("WSAGetOverlappedResult")
 | 
			
		||||
	procbind                                                 = modws2_32.NewProc("bind")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) {
 | 
			
		||||
@@ -123,6 +126,14 @@ func _convertStringSecurityDescriptorToSecurityDescriptor(str *uint16, revision
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func convertStringSidToSid(str *uint16, sid **byte) (err error) {
 | 
			
		||||
	r1, _, e1 := syscall.Syscall(procConvertStringSidToSidW.Addr(), 2, uintptr(unsafe.Pointer(str)), uintptr(unsafe.Pointer(sid)), 0)
 | 
			
		||||
	if r1 == 0 {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getSecurityDescriptorLength(sd uintptr) (len uint32) {
 | 
			
		||||
	r0, _, _ := syscall.Syscall(procGetSecurityDescriptorLength.Addr(), 1, uintptr(sd), 0, 0)
 | 
			
		||||
	len = uint32(r0)
 | 
			
		||||
@@ -154,6 +165,14 @@ func _lookupAccountName(systemName *uint16, accountName *uint16, sid *byte, sidS
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lookupAccountSid(systemName *uint16, sid *byte, name *uint16, nameSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) {
 | 
			
		||||
	r1, _, e1 := syscall.Syscall9(procLookupAccountSidW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse)), 0, 0)
 | 
			
		||||
	if r1 == 0 {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) {
 | 
			
		||||
	var _p0 *uint16
 | 
			
		||||
	_p0, err = syscall.UTF16PtrFromString(systemName)
 | 
			
		||||
@@ -380,25 +399,25 @@ func setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err erro
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) {
 | 
			
		||||
func ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntStatus) {
 | 
			
		||||
	r0, _, _ := syscall.Syscall15(procNtCreateNamedPipeFile.Addr(), 14, uintptr(unsafe.Pointer(pipe)), uintptr(access), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(share), uintptr(disposition), uintptr(options), uintptr(typ), uintptr(readMode), uintptr(completionMode), uintptr(maxInstances), uintptr(inboundQuota), uintptr(outputQuota), uintptr(unsafe.Pointer(timeout)), 0)
 | 
			
		||||
	status = ntstatus(r0)
 | 
			
		||||
	status = ntStatus(r0)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) {
 | 
			
		||||
func rtlDefaultNpAcl(dacl *uintptr) (status ntStatus) {
 | 
			
		||||
	r0, _, _ := syscall.Syscall(procRtlDefaultNpAcl.Addr(), 1, uintptr(unsafe.Pointer(dacl)), 0, 0)
 | 
			
		||||
	status = ntstatus(r0)
 | 
			
		||||
	status = ntStatus(r0)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) {
 | 
			
		||||
func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntStatus) {
 | 
			
		||||
	r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U.Addr(), 4, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(ntName)), uintptr(filePart), uintptr(reserved), 0, 0)
 | 
			
		||||
	status = ntstatus(r0)
 | 
			
		||||
	status = ntStatus(r0)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func rtlNtStatusToDosError(status ntstatus) (winerr error) {
 | 
			
		||||
func rtlNtStatusToDosError(status ntStatus) (winerr error) {
 | 
			
		||||
	r0, _, _ := syscall.Syscall(procRtlNtStatusToDosErrorNoTeb.Addr(), 1, uintptr(status), 0, 0)
 | 
			
		||||
	if r0 != 0 {
 | 
			
		||||
		winerr = syscall.Errno(r0)
 | 
			
		||||
@@ -417,11 +436,3 @@ func wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) {
 | 
			
		||||
	r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))
 | 
			
		||||
	if r1 == socketError {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -85,6 +85,15 @@ type Config struct {
 | 
			
		||||
	// when producing a generic certification signature onto an existing user ID.
 | 
			
		||||
	// The identity must be present in the signer Entity.
 | 
			
		||||
	SigningIdentity string
 | 
			
		||||
	// InsecureAllowUnauthenticatedMessages controls, whether it is tolerated to read
 | 
			
		||||
	// encrypted messages without Modification Detection Code (MDC).
 | 
			
		||||
	// MDC is mandated by the IETF OpenPGP Crypto Refresh draft and has long been implemented
 | 
			
		||||
	// in most OpenPGP implementations. Messages without MDC are considered unnecessarily
 | 
			
		||||
	// insecure and should be prevented whenever possible.
 | 
			
		||||
	// In case one needs to deal with messages from very old OpenPGP implementations, there
 | 
			
		||||
	// might be no other way than to tolerate the missing MDC. Setting this flag, allows this
 | 
			
		||||
	// mode of operation. It should be considered a measure of last resort.
 | 
			
		||||
	InsecureAllowUnauthenticatedMessages bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Config) Random() io.Reader {
 | 
			
		||||
@@ -186,3 +195,10 @@ func (c *Config) SigningUserId() string {
 | 
			
		||||
	}
 | 
			
		||||
	return c.SigningIdentity
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Config) AllowUnauthenticatedMessages() bool {
 | 
			
		||||
	if c == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return c.InsecureAllowUnauthenticatedMessages
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/ProtonMail/go-crypto/openpgp/packet/opaque.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/ProtonMail/go-crypto/openpgp/packet/opaque.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -84,8 +84,9 @@ func (or *OpaqueReader) Next() (op *OpaquePacket, err error) {
 | 
			
		||||
// OpaqueSubpacket represents an unparsed OpenPGP subpacket,
 | 
			
		||||
// as found in signature and user attribute packets.
 | 
			
		||||
type OpaqueSubpacket struct {
 | 
			
		||||
	SubType  uint8
 | 
			
		||||
	Contents []byte
 | 
			
		||||
	SubType       uint8
 | 
			
		||||
	EncodedLength []byte // Store the original encoded length for signature verifications.
 | 
			
		||||
	Contents      []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OpaqueSubpackets extracts opaque, unparsed OpenPGP subpackets from
 | 
			
		||||
@@ -109,6 +110,7 @@ func OpaqueSubpackets(contents []byte) (result []*OpaqueSubpacket, err error) {
 | 
			
		||||
func nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacket, err error) {
 | 
			
		||||
	// RFC 4880, section 5.2.3.1
 | 
			
		||||
	var subLen uint32
 | 
			
		||||
	var encodedLength []byte
 | 
			
		||||
	if len(contents) < 1 {
 | 
			
		||||
		goto Truncated
 | 
			
		||||
	}
 | 
			
		||||
@@ -119,6 +121,7 @@ func nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacke
 | 
			
		||||
		if len(contents) < subHeaderLen {
 | 
			
		||||
			goto Truncated
 | 
			
		||||
		}
 | 
			
		||||
		encodedLength = contents[0:1]
 | 
			
		||||
		subLen = uint32(contents[0])
 | 
			
		||||
		contents = contents[1:]
 | 
			
		||||
	case contents[0] < 255:
 | 
			
		||||
@@ -126,6 +129,7 @@ func nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacke
 | 
			
		||||
		if len(contents) < subHeaderLen {
 | 
			
		||||
			goto Truncated
 | 
			
		||||
		}
 | 
			
		||||
		encodedLength = contents[0:2]
 | 
			
		||||
		subLen = uint32(contents[0]-192)<<8 + uint32(contents[1]) + 192
 | 
			
		||||
		contents = contents[2:]
 | 
			
		||||
	default:
 | 
			
		||||
@@ -133,16 +137,19 @@ func nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacke
 | 
			
		||||
		if len(contents) < subHeaderLen {
 | 
			
		||||
			goto Truncated
 | 
			
		||||
		}
 | 
			
		||||
		encodedLength = contents[0:5]
 | 
			
		||||
		subLen = uint32(contents[1])<<24 |
 | 
			
		||||
			uint32(contents[2])<<16 |
 | 
			
		||||
			uint32(contents[3])<<8 |
 | 
			
		||||
			uint32(contents[4])
 | 
			
		||||
		contents = contents[5:]
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	if subLen > uint32(len(contents)) || subLen == 0 {
 | 
			
		||||
		goto Truncated
 | 
			
		||||
	}
 | 
			
		||||
	subPacket.SubType = contents[0]
 | 
			
		||||
	subPacket.EncodedLength = encodedLength
 | 
			
		||||
	subPacket.Contents = contents[1:subLen]
 | 
			
		||||
	return
 | 
			
		||||
Truncated:
 | 
			
		||||
@@ -152,7 +159,9 @@ Truncated:
 | 
			
		||||
 | 
			
		||||
func (osp *OpaqueSubpacket) Serialize(w io.Writer) (err error) {
 | 
			
		||||
	buf := make([]byte, 6)
 | 
			
		||||
	n := serializeSubpacketLength(buf, len(osp.Contents)+1)
 | 
			
		||||
	copy(buf, osp.EncodedLength)
 | 
			
		||||
	n := len(osp.EncodedLength)
 | 
			
		||||
 | 
			
		||||
	buf[n] = osp.SubType
 | 
			
		||||
	if _, err = w.Write(buf[:n+1]); err != nil {
 | 
			
		||||
		return
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -37,8 +37,6 @@ func (se *SymmetricallyEncrypted) parse(r io.Reader) error {
 | 
			
		||||
		if buf[0] != symmetricallyEncryptedVersion {
 | 
			
		||||
			return errors.UnsupportedError("unknown SymmetricallyEncrypted version")
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		return errors.UnsupportedError("Symmetrically encrypted packets without MDC are not supported")
 | 
			
		||||
	}
 | 
			
		||||
	se.Contents = r
 | 
			
		||||
	return nil
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userattribute.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userattribute.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -42,9 +42,16 @@ func NewUserAttributePhoto(photos ...image.Image) (uat *UserAttribute, err error
 | 
			
		||||
		if err = jpeg.Encode(&buf, photo, nil); err != nil {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		lengthBuf := make([]byte, 5)
 | 
			
		||||
		n := serializeSubpacketLength(lengthBuf, len(buf.Bytes())+1)
 | 
			
		||||
		lengthBuf = lengthBuf[:n]
 | 
			
		||||
 | 
			
		||||
		uat.Contents = append(uat.Contents, &OpaqueSubpacket{
 | 
			
		||||
			SubType:  UserAttrImageSubpacket,
 | 
			
		||||
			Contents: buf.Bytes()})
 | 
			
		||||
			SubType:       UserAttrImageSubpacket,
 | 
			
		||||
			EncodedLength: lengthBuf,
 | 
			
		||||
			Contents:      buf.Bytes(),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/github.com/ProtonMail/go-crypto/openpgp/read.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/ProtonMail/go-crypto/openpgp/read.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -130,8 +130,14 @@ ParsePackets:
 | 
			
		||||
					pubKeys = append(pubKeys, keyEnvelopePair{k, p})
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case *packet.SymmetricallyEncrypted, *packet.AEADEncrypted:
 | 
			
		||||
			edp = p.(packet.EncryptedDataPacket)
 | 
			
		||||
		case *packet.SymmetricallyEncrypted:
 | 
			
		||||
			if !p.MDC && !config.AllowUnauthenticatedMessages() {
 | 
			
		||||
				return nil, errors.UnsupportedError("message is not authenticated")
 | 
			
		||||
			}
 | 
			
		||||
			edp = p
 | 
			
		||||
			break ParsePackets
 | 
			
		||||
		case *packet.AEADEncrypted:
 | 
			
		||||
			edp = p
 | 
			
		||||
			break ParsePackets
 | 
			
		||||
		case *packet.Compressed, *packet.LiteralData, *packet.OnePassSignature:
 | 
			
		||||
			// This message isn't encrypted.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/crypto/ssh/agent/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/crypto/ssh/agent/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -93,7 +93,7 @@ type ExtendedAgent interface {
 | 
			
		||||
type ConstraintExtension struct {
 | 
			
		||||
	// ExtensionName consist of a UTF-8 string suffixed by the
 | 
			
		||||
	// implementation domain following the naming scheme defined
 | 
			
		||||
	// in Section 4.2 of [RFC4251], e.g.  "foo@example.com".
 | 
			
		||||
	// in Section 4.2 of RFC 4251, e.g.  "foo@example.com".
 | 
			
		||||
	ExtensionName string
 | 
			
		||||
	// ExtensionDetails contains the actual content of the extended
 | 
			
		||||
	// constraint.
 | 
			
		||||
@@ -731,7 +731,7 @@ func (c *client) insertCert(s interface{}, cert *ssh.Certificate, comment string
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 {
 | 
			
		||||
	if !bytes.Equal(cert.Key.Marshal(), signer.PublicKey().Marshal()) {
 | 
			
		||||
		return errors.New("agent: signer and cert have different public key")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/certs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/certs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -251,7 +251,7 @@ type algorithmOpenSSHCertSigner struct {
 | 
			
		||||
// private key is held by signer. It returns an error if the public key in cert
 | 
			
		||||
// doesn't match the key used by signer.
 | 
			
		||||
func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) {
 | 
			
		||||
	if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 {
 | 
			
		||||
	if !bytes.Equal(cert.Key.Marshal(), signer.PublicKey().Marshal()) {
 | 
			
		||||
		return nil, errors.New("ssh: signer and cert have different public key")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/golang.org/x/crypto/ssh/cipher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/golang.org/x/crypto/ssh/cipher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -15,7 +15,6 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"hash"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/crypto/chacha20"
 | 
			
		||||
	"golang.org/x/crypto/internal/poly1305"
 | 
			
		||||
@@ -97,13 +96,13 @@ func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream,
 | 
			
		||||
// are not supported and will not be negotiated, even if explicitly requested in
 | 
			
		||||
// ClientConfig.Crypto.Ciphers.
 | 
			
		||||
var cipherModes = map[string]*cipherMode{
 | 
			
		||||
	// Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms
 | 
			
		||||
	// Ciphers from RFC 4344, which introduced many CTR-based ciphers. Algorithms
 | 
			
		||||
	// are defined in the order specified in the RFC.
 | 
			
		||||
	"aes128-ctr": {16, aes.BlockSize, streamCipherMode(0, newAESCTR)},
 | 
			
		||||
	"aes192-ctr": {24, aes.BlockSize, streamCipherMode(0, newAESCTR)},
 | 
			
		||||
	"aes256-ctr": {32, aes.BlockSize, streamCipherMode(0, newAESCTR)},
 | 
			
		||||
 | 
			
		||||
	// Ciphers from RFC4345, which introduces security-improved arcfour ciphers.
 | 
			
		||||
	// Ciphers from RFC 4345, which introduces security-improved arcfour ciphers.
 | 
			
		||||
	// They are defined in the order specified in the RFC.
 | 
			
		||||
	"arcfour128": {16, 0, streamCipherMode(1536, newRC4)},
 | 
			
		||||
	"arcfour256": {32, 0, streamCipherMode(1536, newRC4)},
 | 
			
		||||
@@ -111,7 +110,7 @@ var cipherModes = map[string]*cipherMode{
 | 
			
		||||
	// Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol.
 | 
			
		||||
	// Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and
 | 
			
		||||
	// RC4) has problems with weak keys, and should be used with caution."
 | 
			
		||||
	// RFC4345 introduces improved versions of Arcfour.
 | 
			
		||||
	// RFC 4345 introduces improved versions of Arcfour.
 | 
			
		||||
	"arcfour": {16, 0, streamCipherMode(0, newRC4)},
 | 
			
		||||
 | 
			
		||||
	// AEAD ciphers
 | 
			
		||||
@@ -497,7 +496,7 @@ func (c *cbcCipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error)
 | 
			
		||||
			// data, to make distinguishing between
 | 
			
		||||
			// failing MAC and failing length check more
 | 
			
		||||
			// difficult.
 | 
			
		||||
			io.CopyN(ioutil.Discard, r, int64(c.oracleCamouflage))
 | 
			
		||||
			io.CopyN(io.Discard, r, int64(c.oracleCamouflage))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return p, err
 | 
			
		||||
@@ -642,7 +641,7 @@ const chacha20Poly1305ID = "chacha20-poly1305@openssh.com"
 | 
			
		||||
//
 | 
			
		||||
//	https://tools.ietf.org/html/draft-josefsson-ssh-chacha20-poly1305-openssh-00
 | 
			
		||||
//
 | 
			
		||||
// the methods here also implement padding, which RFC4253 Section 6
 | 
			
		||||
// the methods here also implement padding, which RFC 4253 Section 6
 | 
			
		||||
// also requires of stream ciphers.
 | 
			
		||||
type chacha20Poly1305Cipher struct {
 | 
			
		||||
	lengthKey  [32]byte
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/crypto/ssh/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/crypto/ssh/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -149,7 +149,7 @@ type directionAlgorithms struct {
 | 
			
		||||
 | 
			
		||||
// rekeyBytes returns a rekeying intervals in bytes.
 | 
			
		||||
func (a *directionAlgorithms) rekeyBytes() int64 {
 | 
			
		||||
	// According to RFC4344 block ciphers should rekey after
 | 
			
		||||
	// According to RFC 4344 block ciphers should rekey after
 | 
			
		||||
	// 2^(BLOCKSIZE/4) blocks. For all AES flavors BLOCKSIZE is
 | 
			
		||||
	// 128.
 | 
			
		||||
	switch a.Cipher {
 | 
			
		||||
@@ -158,7 +158,7 @@ func (a *directionAlgorithms) rekeyBytes() int64 {
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// For others, stick with RFC4253 recommendation to rekey after 1 Gb of data.
 | 
			
		||||
	// For others, stick with RFC 4253 recommendation to rekey after 1 Gb of data.
 | 
			
		||||
	return 1 << 30
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/connection.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/connection.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -52,7 +52,7 @@ type Conn interface {
 | 
			
		||||
 | 
			
		||||
	// SendRequest sends a global request, and returns the
 | 
			
		||||
	// reply. If wantReply is true, it returns the response status
 | 
			
		||||
	// and payload. See also RFC4254, section 4.
 | 
			
		||||
	// and payload. See also RFC 4254, section 4.
 | 
			
		||||
	SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error)
 | 
			
		||||
 | 
			
		||||
	// OpenChannel tries to open an channel. If the request is
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/keys.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/keys.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -184,7 +184,7 @@ func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey
 | 
			
		||||
	return "", nil, nil, "", nil, io.EOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseAuthorizedKeys parses a public key from an authorized_keys
 | 
			
		||||
// ParseAuthorizedKey parses a public key from an authorized_keys
 | 
			
		||||
// file used in OpenSSH according to the sshd(8) manual page.
 | 
			
		||||
func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) {
 | 
			
		||||
	for len(in) > 0 {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								vendor/golang.org/x/crypto/ssh/server.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/golang.org/x/crypto/ssh/server.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -68,8 +68,16 @@ type ServerConfig struct {
 | 
			
		||||
 | 
			
		||||
	// NoClientAuth is true if clients are allowed to connect without
 | 
			
		||||
	// authenticating.
 | 
			
		||||
	// To determine NoClientAuth at runtime, set NoClientAuth to true
 | 
			
		||||
	// and the optional NoClientAuthCallback to a non-nil value.
 | 
			
		||||
	NoClientAuth bool
 | 
			
		||||
 | 
			
		||||
	// NoClientAuthCallback, if non-nil, is called when a user
 | 
			
		||||
	// attempts to authenticate with auth method "none".
 | 
			
		||||
	// NoClientAuth must also be set to true for this be used, or
 | 
			
		||||
	// this func is unused.
 | 
			
		||||
	NoClientAuthCallback func(ConnMetadata) (*Permissions, error)
 | 
			
		||||
 | 
			
		||||
	// MaxAuthTries specifies the maximum number of authentication attempts
 | 
			
		||||
	// permitted per connection. If set to a negative number, the number of
 | 
			
		||||
	// attempts are unlimited. If set to zero, the number of attempts are limited
 | 
			
		||||
@@ -455,7 +463,11 @@ userAuthLoop:
 | 
			
		||||
		switch userAuthReq.Method {
 | 
			
		||||
		case "none":
 | 
			
		||||
			if config.NoClientAuth {
 | 
			
		||||
				authErr = nil
 | 
			
		||||
				if config.NoClientAuthCallback != nil {
 | 
			
		||||
					perms, authErr = config.NoClientAuthCallback(s)
 | 
			
		||||
				} else {
 | 
			
		||||
					authErr = nil
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// allow initial attempt of 'none' without penalty
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								vendor/golang.org/x/crypto/ssh/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/golang.org/x/crypto/ssh/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -13,7 +13,6 @@ import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -124,7 +123,7 @@ type Session struct {
 | 
			
		||||
	// output and error.
 | 
			
		||||
	//
 | 
			
		||||
	// If either is nil, Run connects the corresponding file
 | 
			
		||||
	// descriptor to an instance of ioutil.Discard. There is a
 | 
			
		||||
	// descriptor to an instance of io.Discard. There is a
 | 
			
		||||
	// fixed amount of buffering that is shared for the two streams.
 | 
			
		||||
	// If either blocks it may eventually cause the remote
 | 
			
		||||
	// command to block.
 | 
			
		||||
@@ -506,7 +505,7 @@ func (s *Session) stdout() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if s.Stdout == nil {
 | 
			
		||||
		s.Stdout = ioutil.Discard
 | 
			
		||||
		s.Stdout = io.Discard
 | 
			
		||||
	}
 | 
			
		||||
	s.copyFuncs = append(s.copyFuncs, func() error {
 | 
			
		||||
		_, err := io.Copy(s.Stdout, s.ch)
 | 
			
		||||
@@ -519,7 +518,7 @@ func (s *Session) stderr() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if s.Stderr == nil {
 | 
			
		||||
		s.Stderr = ioutil.Discard
 | 
			
		||||
		s.Stderr = io.Discard
 | 
			
		||||
	}
 | 
			
		||||
	s.copyFuncs = append(s.copyFuncs, func() error {
 | 
			
		||||
		_, err := io.Copy(s.Stderr, s.ch.Stderr())
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/mod/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/mod/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
Copyright (c) 2009 The Go Authors. All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
modification, are permitted provided that the following conditions are
 | 
			
		||||
met:
 | 
			
		||||
 | 
			
		||||
   * Redistributions of source code must retain the above copyright
 | 
			
		||||
notice, this list of conditions and the following disclaimer.
 | 
			
		||||
   * Redistributions in binary form must reproduce the above
 | 
			
		||||
copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
in the documentation and/or other materials provided with the
 | 
			
		||||
distribution.
 | 
			
		||||
   * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
contributors may be used to endorse or promote products derived from
 | 
			
		||||
this software without specific prior written permission.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/mod/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/mod/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
Additional IP Rights Grant (Patents)
 | 
			
		||||
 | 
			
		||||
"This implementation" means the copyrightable works distributed by
 | 
			
		||||
Google as part of the Go project.
 | 
			
		||||
 | 
			
		||||
Google hereby grants to You a perpetual, worldwide, non-exclusive,
 | 
			
		||||
no-charge, royalty-free, irrevocable (except as stated in this section)
 | 
			
		||||
patent license to make, have made, use, offer to sell, sell, import,
 | 
			
		||||
transfer and otherwise run, modify and propagate the contents of this
 | 
			
		||||
implementation of Go, where such license applies only to those patent
 | 
			
		||||
claims, both currently owned or controlled by Google and acquired in
 | 
			
		||||
the future, licensable by Google that are necessarily infringed by this
 | 
			
		||||
implementation of Go.  This grant does not include claims that would be
 | 
			
		||||
infringed only as a consequence of further modification of this
 | 
			
		||||
implementation.  If you or your agent or exclusive licensee institute or
 | 
			
		||||
order or agree to the institution of patent litigation against any
 | 
			
		||||
entity (including a cross-claim or counterclaim in a lawsuit) alleging
 | 
			
		||||
that this implementation of Go or any code incorporated within this
 | 
			
		||||
implementation of Go constitutes direct or contributory patent
 | 
			
		||||
infringement, or inducement of patent infringement, then any patent
 | 
			
		||||
rights granted to you under this License for this implementation of Go
 | 
			
		||||
shall terminate as of the date such litigation is filed.
 | 
			
		||||
							
								
								
									
										401
									
								
								vendor/golang.org/x/mod/semver/semver.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										401
									
								
								vendor/golang.org/x/mod/semver/semver.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,401 @@
 | 
			
		||||
// Copyright 2018 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Package semver implements comparison of semantic version strings.
 | 
			
		||||
// In this package, semantic version strings must begin with a leading "v",
 | 
			
		||||
// as in "v1.0.0".
 | 
			
		||||
//
 | 
			
		||||
// The general form of a semantic version string accepted by this package is
 | 
			
		||||
//
 | 
			
		||||
//	vMAJOR[.MINOR[.PATCH[-PRERELEASE][+BUILD]]]
 | 
			
		||||
//
 | 
			
		||||
// where square brackets indicate optional parts of the syntax;
 | 
			
		||||
// MAJOR, MINOR, and PATCH are decimal integers without extra leading zeros;
 | 
			
		||||
// PRERELEASE and BUILD are each a series of non-empty dot-separated identifiers
 | 
			
		||||
// using only alphanumeric characters and hyphens; and
 | 
			
		||||
// all-numeric PRERELEASE identifiers must not have leading zeros.
 | 
			
		||||
//
 | 
			
		||||
// This package follows Semantic Versioning 2.0.0 (see semver.org)
 | 
			
		||||
// with two exceptions. First, it requires the "v" prefix. Second, it recognizes
 | 
			
		||||
// vMAJOR and vMAJOR.MINOR (with no prerelease or build suffixes)
 | 
			
		||||
// as shorthands for vMAJOR.0.0 and vMAJOR.MINOR.0.
 | 
			
		||||
package semver
 | 
			
		||||
 | 
			
		||||
import "sort"
 | 
			
		||||
 | 
			
		||||
// parsed returns the parsed form of a semantic version string.
 | 
			
		||||
type parsed struct {
 | 
			
		||||
	major      string
 | 
			
		||||
	minor      string
 | 
			
		||||
	patch      string
 | 
			
		||||
	short      string
 | 
			
		||||
	prerelease string
 | 
			
		||||
	build      string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsValid reports whether v is a valid semantic version string.
 | 
			
		||||
func IsValid(v string) bool {
 | 
			
		||||
	_, ok := parse(v)
 | 
			
		||||
	return ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Canonical returns the canonical formatting of the semantic version v.
 | 
			
		||||
// It fills in any missing .MINOR or .PATCH and discards build metadata.
 | 
			
		||||
// Two semantic versions compare equal only if their canonical formattings
 | 
			
		||||
// are identical strings.
 | 
			
		||||
// The canonical invalid semantic version is the empty string.
 | 
			
		||||
func Canonical(v string) string {
 | 
			
		||||
	p, ok := parse(v)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	if p.build != "" {
 | 
			
		||||
		return v[:len(v)-len(p.build)]
 | 
			
		||||
	}
 | 
			
		||||
	if p.short != "" {
 | 
			
		||||
		return v + p.short
 | 
			
		||||
	}
 | 
			
		||||
	return v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Major returns the major version prefix of the semantic version v.
 | 
			
		||||
// For example, Major("v2.1.0") == "v2".
 | 
			
		||||
// If v is an invalid semantic version string, Major returns the empty string.
 | 
			
		||||
func Major(v string) string {
 | 
			
		||||
	pv, ok := parse(v)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return v[:1+len(pv.major)]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MajorMinor returns the major.minor version prefix of the semantic version v.
 | 
			
		||||
// For example, MajorMinor("v2.1.0") == "v2.1".
 | 
			
		||||
// If v is an invalid semantic version string, MajorMinor returns the empty string.
 | 
			
		||||
func MajorMinor(v string) string {
 | 
			
		||||
	pv, ok := parse(v)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	i := 1 + len(pv.major)
 | 
			
		||||
	if j := i + 1 + len(pv.minor); j <= len(v) && v[i] == '.' && v[i+1:j] == pv.minor {
 | 
			
		||||
		return v[:j]
 | 
			
		||||
	}
 | 
			
		||||
	return v[:i] + "." + pv.minor
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Prerelease returns the prerelease suffix of the semantic version v.
 | 
			
		||||
// For example, Prerelease("v2.1.0-pre+meta") == "-pre".
 | 
			
		||||
// If v is an invalid semantic version string, Prerelease returns the empty string.
 | 
			
		||||
func Prerelease(v string) string {
 | 
			
		||||
	pv, ok := parse(v)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return pv.prerelease
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Build returns the build suffix of the semantic version v.
 | 
			
		||||
// For example, Build("v2.1.0+meta") == "+meta".
 | 
			
		||||
// If v is an invalid semantic version string, Build returns the empty string.
 | 
			
		||||
func Build(v string) string {
 | 
			
		||||
	pv, ok := parse(v)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return pv.build
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Compare returns an integer comparing two versions according to
 | 
			
		||||
// semantic version precedence.
 | 
			
		||||
// The result will be 0 if v == w, -1 if v < w, or +1 if v > w.
 | 
			
		||||
//
 | 
			
		||||
// An invalid semantic version string is considered less than a valid one.
 | 
			
		||||
// All invalid semantic version strings compare equal to each other.
 | 
			
		||||
func Compare(v, w string) int {
 | 
			
		||||
	pv, ok1 := parse(v)
 | 
			
		||||
	pw, ok2 := parse(w)
 | 
			
		||||
	if !ok1 && !ok2 {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	if !ok1 {
 | 
			
		||||
		return -1
 | 
			
		||||
	}
 | 
			
		||||
	if !ok2 {
 | 
			
		||||
		return +1
 | 
			
		||||
	}
 | 
			
		||||
	if c := compareInt(pv.major, pw.major); c != 0 {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	if c := compareInt(pv.minor, pw.minor); c != 0 {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	if c := compareInt(pv.patch, pw.patch); c != 0 {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return comparePrerelease(pv.prerelease, pw.prerelease)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Max canonicalizes its arguments and then returns the version string
 | 
			
		||||
// that compares greater.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: use Compare instead. In most cases, returning a canonicalized
 | 
			
		||||
// version is not expected or desired.
 | 
			
		||||
func Max(v, w string) string {
 | 
			
		||||
	v = Canonical(v)
 | 
			
		||||
	w = Canonical(w)
 | 
			
		||||
	if Compare(v, w) > 0 {
 | 
			
		||||
		return v
 | 
			
		||||
	}
 | 
			
		||||
	return w
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ByVersion implements sort.Interface for sorting semantic version strings.
 | 
			
		||||
type ByVersion []string
 | 
			
		||||
 | 
			
		||||
func (vs ByVersion) Len() int      { return len(vs) }
 | 
			
		||||
func (vs ByVersion) Swap(i, j int) { vs[i], vs[j] = vs[j], vs[i] }
 | 
			
		||||
func (vs ByVersion) Less(i, j int) bool {
 | 
			
		||||
	cmp := Compare(vs[i], vs[j])
 | 
			
		||||
	if cmp != 0 {
 | 
			
		||||
		return cmp < 0
 | 
			
		||||
	}
 | 
			
		||||
	return vs[i] < vs[j]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Sort sorts a list of semantic version strings using ByVersion.
 | 
			
		||||
func Sort(list []string) {
 | 
			
		||||
	sort.Sort(ByVersion(list))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parse(v string) (p parsed, ok bool) {
 | 
			
		||||
	if v == "" || v[0] != 'v' {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	p.major, v, ok = parseInt(v[1:])
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if v == "" {
 | 
			
		||||
		p.minor = "0"
 | 
			
		||||
		p.patch = "0"
 | 
			
		||||
		p.short = ".0.0"
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if v[0] != '.' {
 | 
			
		||||
		ok = false
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	p.minor, v, ok = parseInt(v[1:])
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if v == "" {
 | 
			
		||||
		p.patch = "0"
 | 
			
		||||
		p.short = ".0"
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if v[0] != '.' {
 | 
			
		||||
		ok = false
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	p.patch, v, ok = parseInt(v[1:])
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if len(v) > 0 && v[0] == '-' {
 | 
			
		||||
		p.prerelease, v, ok = parsePrerelease(v)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if len(v) > 0 && v[0] == '+' {
 | 
			
		||||
		p.build, v, ok = parseBuild(v)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if v != "" {
 | 
			
		||||
		ok = false
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	ok = true
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseInt(v string) (t, rest string, ok bool) {
 | 
			
		||||
	if v == "" {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if v[0] < '0' || '9' < v[0] {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	i := 1
 | 
			
		||||
	for i < len(v) && '0' <= v[i] && v[i] <= '9' {
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
	if v[0] == '0' && i != 1 {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	return v[:i], v[i:], true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parsePrerelease(v string) (t, rest string, ok bool) {
 | 
			
		||||
	// "A pre-release version MAY be denoted by appending a hyphen and
 | 
			
		||||
	// a series of dot separated identifiers immediately following the patch version.
 | 
			
		||||
	// Identifiers MUST comprise only ASCII alphanumerics and hyphen [0-9A-Za-z-].
 | 
			
		||||
	// Identifiers MUST NOT be empty. Numeric identifiers MUST NOT include leading zeroes."
 | 
			
		||||
	if v == "" || v[0] != '-' {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	i := 1
 | 
			
		||||
	start := 1
 | 
			
		||||
	for i < len(v) && v[i] != '+' {
 | 
			
		||||
		if !isIdentChar(v[i]) && v[i] != '.' {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if v[i] == '.' {
 | 
			
		||||
			if start == i || isBadNum(v[start:i]) {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			start = i + 1
 | 
			
		||||
		}
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
	if start == i || isBadNum(v[start:i]) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	return v[:i], v[i:], true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseBuild(v string) (t, rest string, ok bool) {
 | 
			
		||||
	if v == "" || v[0] != '+' {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	i := 1
 | 
			
		||||
	start := 1
 | 
			
		||||
	for i < len(v) {
 | 
			
		||||
		if !isIdentChar(v[i]) && v[i] != '.' {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if v[i] == '.' {
 | 
			
		||||
			if start == i {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			start = i + 1
 | 
			
		||||
		}
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
	if start == i {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	return v[:i], v[i:], true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isIdentChar(c byte) bool {
 | 
			
		||||
	return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '-'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isBadNum(v string) bool {
 | 
			
		||||
	i := 0
 | 
			
		||||
	for i < len(v) && '0' <= v[i] && v[i] <= '9' {
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
	return i == len(v) && i > 1 && v[0] == '0'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isNum(v string) bool {
 | 
			
		||||
	i := 0
 | 
			
		||||
	for i < len(v) && '0' <= v[i] && v[i] <= '9' {
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
	return i == len(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func compareInt(x, y string) int {
 | 
			
		||||
	if x == y {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	if len(x) < len(y) {
 | 
			
		||||
		return -1
 | 
			
		||||
	}
 | 
			
		||||
	if len(x) > len(y) {
 | 
			
		||||
		return +1
 | 
			
		||||
	}
 | 
			
		||||
	if x < y {
 | 
			
		||||
		return -1
 | 
			
		||||
	} else {
 | 
			
		||||
		return +1
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func comparePrerelease(x, y string) int {
 | 
			
		||||
	// "When major, minor, and patch are equal, a pre-release version has
 | 
			
		||||
	// lower precedence than a normal version.
 | 
			
		||||
	// Example: 1.0.0-alpha < 1.0.0.
 | 
			
		||||
	// Precedence for two pre-release versions with the same major, minor,
 | 
			
		||||
	// and patch version MUST be determined by comparing each dot separated
 | 
			
		||||
	// identifier from left to right until a difference is found as follows:
 | 
			
		||||
	// identifiers consisting of only digits are compared numerically and
 | 
			
		||||
	// identifiers with letters or hyphens are compared lexically in ASCII
 | 
			
		||||
	// sort order. Numeric identifiers always have lower precedence than
 | 
			
		||||
	// non-numeric identifiers. A larger set of pre-release fields has a
 | 
			
		||||
	// higher precedence than a smaller set, if all of the preceding
 | 
			
		||||
	// identifiers are equal.
 | 
			
		||||
	// Example: 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta <
 | 
			
		||||
	// 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0."
 | 
			
		||||
	if x == y {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	if x == "" {
 | 
			
		||||
		return +1
 | 
			
		||||
	}
 | 
			
		||||
	if y == "" {
 | 
			
		||||
		return -1
 | 
			
		||||
	}
 | 
			
		||||
	for x != "" && y != "" {
 | 
			
		||||
		x = x[1:] // skip - or .
 | 
			
		||||
		y = y[1:] // skip - or .
 | 
			
		||||
		var dx, dy string
 | 
			
		||||
		dx, x = nextIdent(x)
 | 
			
		||||
		dy, y = nextIdent(y)
 | 
			
		||||
		if dx != dy {
 | 
			
		||||
			ix := isNum(dx)
 | 
			
		||||
			iy := isNum(dy)
 | 
			
		||||
			if ix != iy {
 | 
			
		||||
				if ix {
 | 
			
		||||
					return -1
 | 
			
		||||
				} else {
 | 
			
		||||
					return +1
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if ix {
 | 
			
		||||
				if len(dx) < len(dy) {
 | 
			
		||||
					return -1
 | 
			
		||||
				}
 | 
			
		||||
				if len(dx) > len(dy) {
 | 
			
		||||
					return +1
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if dx < dy {
 | 
			
		||||
				return -1
 | 
			
		||||
			} else {
 | 
			
		||||
				return +1
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if x == "" {
 | 
			
		||||
		return -1
 | 
			
		||||
	} else {
 | 
			
		||||
		return +1
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func nextIdent(x string) (dx, rest string) {
 | 
			
		||||
	i := 0
 | 
			
		||||
	for i < len(x) && x[i] != '.' {
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
	return x[:i], x[i:]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/net/context/go17.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/net/context/go17.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -32,7 +32,7 @@ var DeadlineExceeded = context.DeadlineExceeded
 | 
			
		||||
// call cancel as soon as the operations running in this Context complete.
 | 
			
		||||
func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
 | 
			
		||||
	ctx, f := context.WithCancel(parent)
 | 
			
		||||
	return ctx, CancelFunc(f)
 | 
			
		||||
	return ctx, f
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithDeadline returns a copy of the parent context with the deadline adjusted
 | 
			
		||||
@@ -46,7 +46,7 @@ func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
 | 
			
		||||
// call cancel as soon as the operations running in this Context complete.
 | 
			
		||||
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) {
 | 
			
		||||
	ctx, f := context.WithDeadline(parent, deadline)
 | 
			
		||||
	return ctx, CancelFunc(f)
 | 
			
		||||
	return ctx, f
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)).
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
// Copyright 2022 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
//go:build !aix && !linux && (ppc64 || ppc64le)
 | 
			
		||||
// +build !aix
 | 
			
		||||
// +build !linux
 | 
			
		||||
// +build ppc64 ppc64le
 | 
			
		||||
 | 
			
		||||
package cpu
 | 
			
		||||
 | 
			
		||||
func archInit() {
 | 
			
		||||
	PPC64.IsPOWER8 = true
 | 
			
		||||
	Initialized = true
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
// Copyright 2022 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
//go:build (darwin || freebsd || netbsd || openbsd) && gc
 | 
			
		||||
// +build darwin freebsd netbsd openbsd
 | 
			
		||||
// +build gc
 | 
			
		||||
 | 
			
		||||
#include "textflag.h"
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// System call support for ppc64, BSD
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// Just jump to package syscall's implementation for all these functions.
 | 
			
		||||
// The runtime may know about them.
 | 
			
		||||
 | 
			
		||||
TEXT	·Syscall(SB),NOSPLIT,$0-56
 | 
			
		||||
	JMP	syscall·Syscall(SB)
 | 
			
		||||
 | 
			
		||||
TEXT	·Syscall6(SB),NOSPLIT,$0-80
 | 
			
		||||
	JMP	syscall·Syscall6(SB)
 | 
			
		||||
 | 
			
		||||
TEXT	·Syscall9(SB),NOSPLIT,$0-104
 | 
			
		||||
	JMP	syscall·Syscall9(SB)
 | 
			
		||||
 | 
			
		||||
TEXT	·RawSyscall(SB),NOSPLIT,$0-56
 | 
			
		||||
	JMP	syscall·RawSyscall(SB)
 | 
			
		||||
 | 
			
		||||
TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
 | 
			
		||||
	JMP	syscall·RawSyscall6(SB)
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/dirent.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/dirent.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,8 +2,8 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
 | 
			
		||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
			
		||||
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos
 | 
			
		||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/golang.org/x/sys/unix/ioctl_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/golang.org/x/sys/unix/ioctl_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,9 +4,7 @@
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
import "unsafe"
 | 
			
		||||
 | 
			
		||||
// IoctlRetInt performs an ioctl operation specified by req on a device
 | 
			
		||||
// associated with opened file descriptor fd, and returns a non-negative
 | 
			
		||||
@@ -217,3 +215,19 @@ func IoctlKCMAttach(fd int, info KCMAttach) error {
 | 
			
		||||
func IoctlKCMUnattach(fd int, info KCMUnattach) error {
 | 
			
		||||
	return ioctlPtr(fd, SIOCKCMUNATTACH, unsafe.Pointer(&info))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IoctlLoopGetStatus64 gets the status of the loop device associated with the
 | 
			
		||||
// file descriptor fd using the LOOP_GET_STATUS64 operation.
 | 
			
		||||
func IoctlLoopGetStatus64(fd int) (*LoopInfo64, error) {
 | 
			
		||||
	var value LoopInfo64
 | 
			
		||||
	if err := ioctlPtr(fd, LOOP_GET_STATUS64, unsafe.Pointer(&value)); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return &value, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IoctlLoopSetStatus64 sets the status of the loop device associated with the
 | 
			
		||||
// file descriptor fd using the LOOP_SET_STATUS64 operation.
 | 
			
		||||
func IoctlLoopSetStatus64(fd int, value *LoopInfo64) error {
 | 
			
		||||
	return ioctlPtr(fd, LOOP_SET_STATUS64, unsafe.Pointer(value))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								vendor/golang.org/x/sys/unix/mkall.sh
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/golang.org/x/sys/unix/mkall.sh
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -182,6 +182,24 @@ openbsd_mips64)
 | 
			
		||||
	# API consistent across platforms.
 | 
			
		||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
			
		||||
	;;
 | 
			
		||||
openbsd_ppc64)
 | 
			
		||||
	mkasm="go run mkasm.go"
 | 
			
		||||
	mkerrors="$mkerrors -m64"
 | 
			
		||||
	mksyscall="go run mksyscall.go -openbsd -libc"
 | 
			
		||||
	mksysctl="go run mksysctl_openbsd.go"
 | 
			
		||||
	# Let the type of C char be signed for making the bare syscall
 | 
			
		||||
	# API consistent across platforms.
 | 
			
		||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
			
		||||
	;;
 | 
			
		||||
openbsd_riscv64)
 | 
			
		||||
	mkasm="go run mkasm.go"
 | 
			
		||||
	mkerrors="$mkerrors -m64"
 | 
			
		||||
	mksyscall="go run mksyscall.go -openbsd -libc"
 | 
			
		||||
	mksysctl="go run mksysctl_openbsd.go"
 | 
			
		||||
	# Let the type of C char be signed for making the bare syscall
 | 
			
		||||
	# API consistent across platforms.
 | 
			
		||||
	mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
			
		||||
	;;
 | 
			
		||||
solaris_amd64)
 | 
			
		||||
	mksyscall="go run mksyscall_solaris.go"
 | 
			
		||||
	mkerrors="$mkerrors -m64"
 | 
			
		||||
@@ -214,11 +232,6 @@ esac
 | 
			
		||||
			if [ "$GOOSARCH" == "aix_ppc64" ]; then
 | 
			
		||||
				# aix/ppc64 script generates files instead of writing to stdin.
 | 
			
		||||
				echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in && gofmt -w zsyscall_$GOOSARCH.go && gofmt -w zsyscall_"$GOOSARCH"_gccgo.go && gofmt -w zsyscall_"$GOOSARCH"_gc.go " ;
 | 
			
		||||
			elif [ "$GOOS" == "darwin" ]; then
 | 
			
		||||
			        # 1.12 and later, syscalls via libSystem
 | 
			
		||||
				echo "$mksyscall -tags $GOOS,$GOARCH,go1.12 $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go";
 | 
			
		||||
				# 1.13 and later, syscalls via libSystem (including syscallPtr)
 | 
			
		||||
				echo "$mksyscall -tags $GOOS,$GOARCH,go1.13 syscall_darwin.1_13.go |gofmt >zsyscall_$GOOSARCH.1_13.go";
 | 
			
		||||
			elif [ "$GOOS" == "illumos" ]; then
 | 
			
		||||
			        # illumos code generation requires a --illumos switch
 | 
			
		||||
			        echo "$mksyscall -illumos -tags illumos,$GOARCH syscall_illumos.go |gofmt > zsyscall_illumos_$GOARCH.go";
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/mkerrors.sh
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/mkerrors.sh
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -642,7 +642,7 @@ errors=$(
 | 
			
		||||
signals=$(
 | 
			
		||||
	echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |
 | 
			
		||||
	awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' |
 | 
			
		||||
	egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' |
 | 
			
		||||
	grep -v 'SIGSTKSIZE\|SIGSTKSZ\|SIGRT\|SIGMAX64' |
 | 
			
		||||
	sort
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -652,7 +652,7 @@ echo '#include <errno.h>' | $CC -x c - -E -dM $ccflags |
 | 
			
		||||
	sort >_error.grep
 | 
			
		||||
echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |
 | 
			
		||||
	awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' |
 | 
			
		||||
	egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' |
 | 
			
		||||
	grep -v 'SIGSTKSIZE\|SIGSTKSZ\|SIGRT\|SIGMAX64' |
 | 
			
		||||
	sort >_signal.grep
 | 
			
		||||
 | 
			
		||||
echo '// mkerrors.sh' "$@"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/sys/unix/str.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/sys/unix/str.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,27 +0,0 @@
 | 
			
		||||
// Copyright 2009 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
 | 
			
		||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
func itoa(val int) string { // do it here rather than with fmt to avoid dependency
 | 
			
		||||
	if val < 0 {
 | 
			
		||||
		return "-" + uitoa(uint(-val))
 | 
			
		||||
	}
 | 
			
		||||
	return uitoa(uint(val))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func uitoa(val uint) string {
 | 
			
		||||
	var buf [32]byte // big enough for int64
 | 
			
		||||
	i := len(buf) - 1
 | 
			
		||||
	for val >= 10 {
 | 
			
		||||
		buf[i] = byte(val%10 + '0')
 | 
			
		||||
		i--
 | 
			
		||||
		val /= 10
 | 
			
		||||
	}
 | 
			
		||||
	buf[i] = byte(val + '0')
 | 
			
		||||
	return string(buf[i:])
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/unix/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -29,8 +29,6 @@ import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/internal/unsafeheader"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ByteSliceFromString returns a NUL-terminated slice of bytes
 | 
			
		||||
@@ -82,13 +80,7 @@ func BytePtrToString(p *byte) string {
 | 
			
		||||
		ptr = unsafe.Pointer(uintptr(ptr) + 1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var s []byte
 | 
			
		||||
	h := (*unsafeheader.Slice)(unsafe.Pointer(&s))
 | 
			
		||||
	h.Data = unsafe.Pointer(p)
 | 
			
		||||
	h.Len = n
 | 
			
		||||
	h.Cap = n
 | 
			
		||||
 | 
			
		||||
	return string(s)
 | 
			
		||||
	return string(unsafe.Slice(p, n))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Single-word zero for use when we need a valid pointer to 0 bytes.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,32 +0,0 @@
 | 
			
		||||
// 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.
 | 
			
		||||
 | 
			
		||||
//go:build darwin && go1.12 && !go1.13
 | 
			
		||||
// +build darwin,go1.12,!go1.13
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const _SYS_GETDIRENTRIES64 = 344
 | 
			
		||||
 | 
			
		||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
			
		||||
	// To implement this using libSystem we'd need syscall_syscallPtr for
 | 
			
		||||
	// fdopendir. However, syscallPtr was only added in Go 1.13, so we fall
 | 
			
		||||
	// back to raw syscalls for this func on Go 1.12.
 | 
			
		||||
	var p unsafe.Pointer
 | 
			
		||||
	if len(buf) > 0 {
 | 
			
		||||
		p = unsafe.Pointer(&buf[0])
 | 
			
		||||
	} else {
 | 
			
		||||
		p = unsafe.Pointer(&_zero)
 | 
			
		||||
	}
 | 
			
		||||
	r0, _, e1 := Syscall6(_SYS_GETDIRENTRIES64, uintptr(fd), uintptr(p), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)
 | 
			
		||||
	n = int(r0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
		return n, errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return n, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										108
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										108
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,108 +0,0 @@
 | 
			
		||||
// 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.
 | 
			
		||||
 | 
			
		||||
//go:build darwin && go1.13
 | 
			
		||||
// +build darwin,go1.13
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/internal/unsafeheader"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//sys	closedir(dir uintptr) (err error)
 | 
			
		||||
//sys	readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno)
 | 
			
		||||
 | 
			
		||||
func fdopendir(fd int) (dir uintptr, err error) {
 | 
			
		||||
	r0, _, e1 := syscall_syscallPtr(libc_fdopendir_trampoline_addr, uintptr(fd), 0, 0)
 | 
			
		||||
	dir = uintptr(r0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var libc_fdopendir_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
//go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib"
 | 
			
		||||
 | 
			
		||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
			
		||||
	// Simulate Getdirentries using fdopendir/readdir_r/closedir.
 | 
			
		||||
	// We store the number of entries to skip in the seek
 | 
			
		||||
	// offset of fd. See issue #31368.
 | 
			
		||||
	// It's not the full required semantics, but should handle the case
 | 
			
		||||
	// of calling Getdirentries or ReadDirent repeatedly.
 | 
			
		||||
	// It won't handle assigning the results of lseek to *basep, or handle
 | 
			
		||||
	// the directory being edited underfoot.
 | 
			
		||||
	skip, err := Seek(fd, 0, 1 /* SEEK_CUR */)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// We need to duplicate the incoming file descriptor
 | 
			
		||||
	// because the caller expects to retain control of it, but
 | 
			
		||||
	// fdopendir expects to take control of its argument.
 | 
			
		||||
	// Just Dup'ing the file descriptor is not enough, as the
 | 
			
		||||
	// result shares underlying state. Use Openat to make a really
 | 
			
		||||
	// new file descriptor referring to the same directory.
 | 
			
		||||
	fd2, err := Openat(fd, ".", O_RDONLY, 0)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	d, err := fdopendir(fd2)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		Close(fd2)
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	defer closedir(d)
 | 
			
		||||
 | 
			
		||||
	var cnt int64
 | 
			
		||||
	for {
 | 
			
		||||
		var entry Dirent
 | 
			
		||||
		var entryp *Dirent
 | 
			
		||||
		e := readdir_r(d, &entry, &entryp)
 | 
			
		||||
		if e != 0 {
 | 
			
		||||
			return n, errnoErr(e)
 | 
			
		||||
		}
 | 
			
		||||
		if entryp == nil {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		if skip > 0 {
 | 
			
		||||
			skip--
 | 
			
		||||
			cnt++
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		reclen := int(entry.Reclen)
 | 
			
		||||
		if reclen > len(buf) {
 | 
			
		||||
			// Not enough room. Return for now.
 | 
			
		||||
			// The counter will let us know where we should start up again.
 | 
			
		||||
			// Note: this strategy for suspending in the middle and
 | 
			
		||||
			// restarting is O(n^2) in the length of the directory. Oh well.
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Copy entry into return buffer.
 | 
			
		||||
		var s []byte
 | 
			
		||||
		hdr := (*unsafeheader.Slice)(unsafe.Pointer(&s))
 | 
			
		||||
		hdr.Data = unsafe.Pointer(&entry)
 | 
			
		||||
		hdr.Cap = reclen
 | 
			
		||||
		hdr.Len = reclen
 | 
			
		||||
		copy(buf, s)
 | 
			
		||||
 | 
			
		||||
		buf = buf[reclen:]
 | 
			
		||||
		n += reclen
 | 
			
		||||
		cnt++
 | 
			
		||||
	}
 | 
			
		||||
	// Set the seek offset of the input fd to record
 | 
			
		||||
	// how many files we've already returned.
 | 
			
		||||
	_, err = Seek(fd, cnt, 0 /* SEEK_SET */)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return n, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return n, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										90
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										90
									
								
								vendor/golang.org/x/sys/unix/syscall_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -19,6 +19,96 @@ 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(libc_fdopendir_trampoline_addr, uintptr(fd), 0, 0)
 | 
			
		||||
	dir = uintptr(r0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var libc_fdopendir_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
//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 := unsafe.Slice((*byte)(unsafe.Pointer(&entry)), reclen)
 | 
			
		||||
		copy(buf, s)
 | 
			
		||||
 | 
			
		||||
		buf = buf[reclen:]
 | 
			
		||||
		n += reclen
 | 
			
		||||
		cnt++
 | 
			
		||||
	}
 | 
			
		||||
	// Set the seek offset of the input fd to record
 | 
			
		||||
	// how many files we've already returned.
 | 
			
		||||
	_, err = Seek(fd, cnt, 0 /* SEEK_SET */)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return n, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return n, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
 | 
			
		||||
type SockaddrDatalink struct {
 | 
			
		||||
	Len    uint8
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -61,7 +61,7 @@ func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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)}
 | 
			
		||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint32(countin)}
 | 
			
		||||
	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
			
		||||
	return int(ioDesc.Len), err
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -61,7 +61,7 @@ func PtraceGetFsBase(pid int, fsbase *int64) (err error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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)}
 | 
			
		||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 | 
			
		||||
	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
			
		||||
	return int(ioDesc.Len), err
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -57,7 +57,7 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 | 
			
		||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
			
		||||
 | 
			
		||||
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
			
		||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)}
 | 
			
		||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint32(countin)}
 | 
			
		||||
	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
			
		||||
	return int(ioDesc.Len), err
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -57,7 +57,7 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 | 
			
		||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
			
		||||
 | 
			
		||||
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
			
		||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 | 
			
		||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 | 
			
		||||
	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
			
		||||
	return int(ioDesc.Len), err
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -57,7 +57,7 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 | 
			
		||||
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
			
		||||
 | 
			
		||||
func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) {
 | 
			
		||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 | 
			
		||||
	ioDesc := PtraceIoDesc{Op: int32(req), Offs: uintptr(unsafe.Pointer(addr)), Addr: uintptr(unsafe.Pointer(&out[0])), Len: uint64(countin)}
 | 
			
		||||
	err = ptrace(PT_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0)
 | 
			
		||||
	return int(ioDesc.Len), err
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										106
									
								
								vendor/golang.org/x/sys/unix/syscall_illumos.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										106
									
								
								vendor/golang.org/x/sys/unix/syscall_illumos.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,8 +10,6 @@
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -79,107 +77,3 @@ func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//sys	putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error)
 | 
			
		||||
 | 
			
		||||
func Putmsg(fd int, cl []byte, data []byte, flags int) (err error) {
 | 
			
		||||
	var clp, datap *strbuf
 | 
			
		||||
	if len(cl) > 0 {
 | 
			
		||||
		clp = &strbuf{
 | 
			
		||||
			Len: int32(len(cl)),
 | 
			
		||||
			Buf: (*int8)(unsafe.Pointer(&cl[0])),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if len(data) > 0 {
 | 
			
		||||
		datap = &strbuf{
 | 
			
		||||
			Len: int32(len(data)),
 | 
			
		||||
			Buf: (*int8)(unsafe.Pointer(&data[0])),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return putmsg(fd, clp, datap, flags)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//sys	getmsg(fd int, clptr *strbuf, dataptr *strbuf, flags *int) (err error)
 | 
			
		||||
 | 
			
		||||
func Getmsg(fd int, cl []byte, data []byte) (retCl []byte, retData []byte, flags int, err error) {
 | 
			
		||||
	var clp, datap *strbuf
 | 
			
		||||
	if len(cl) > 0 {
 | 
			
		||||
		clp = &strbuf{
 | 
			
		||||
			Maxlen: int32(len(cl)),
 | 
			
		||||
			Buf:    (*int8)(unsafe.Pointer(&cl[0])),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if len(data) > 0 {
 | 
			
		||||
		datap = &strbuf{
 | 
			
		||||
			Maxlen: int32(len(data)),
 | 
			
		||||
			Buf:    (*int8)(unsafe.Pointer(&data[0])),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = getmsg(fd, clp, datap, &flags); err != nil {
 | 
			
		||||
		return nil, nil, 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(cl) > 0 {
 | 
			
		||||
		retCl = cl[:clp.Len]
 | 
			
		||||
	}
 | 
			
		||||
	if len(data) > 0 {
 | 
			
		||||
		retData = data[:datap.Len]
 | 
			
		||||
	}
 | 
			
		||||
	return retCl, retData, flags, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IoctlSetIntRetInt(fd int, req uint, arg int) (int, error) {
 | 
			
		||||
	return ioctlRet(fd, req, uintptr(arg))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IoctlSetString(fd int, req uint, val string) error {
 | 
			
		||||
	bs := make([]byte, len(val)+1)
 | 
			
		||||
	copy(bs[:len(bs)-1], val)
 | 
			
		||||
	err := ioctl(fd, req, uintptr(unsafe.Pointer(&bs[0])))
 | 
			
		||||
	runtime.KeepAlive(&bs[0])
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Lifreq Helpers
 | 
			
		||||
 | 
			
		||||
func (l *Lifreq) SetName(name string) error {
 | 
			
		||||
	if len(name) >= len(l.Name) {
 | 
			
		||||
		return fmt.Errorf("name cannot be more than %d characters", len(l.Name)-1)
 | 
			
		||||
	}
 | 
			
		||||
	for i := range name {
 | 
			
		||||
		l.Name[i] = int8(name[i])
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *Lifreq) SetLifruInt(d int) {
 | 
			
		||||
	*(*int)(unsafe.Pointer(&l.Lifru[0])) = d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *Lifreq) GetLifruInt() int {
 | 
			
		||||
	return *(*int)(unsafe.Pointer(&l.Lifru[0]))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *Lifreq) SetLifruUint(d uint) {
 | 
			
		||||
	*(*uint)(unsafe.Pointer(&l.Lifru[0])) = d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *Lifreq) GetLifruUint() uint {
 | 
			
		||||
	return *(*uint)(unsafe.Pointer(&l.Lifru[0]))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IoctlLifreq(fd int, req uint, l *Lifreq) error {
 | 
			
		||||
	return ioctl(fd, req, uintptr(unsafe.Pointer(l)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Strioctl Helpers
 | 
			
		||||
 | 
			
		||||
func (s *Strioctl) SetInt(i int) {
 | 
			
		||||
	s.Len = int32(unsafe.Sizeof(i))
 | 
			
		||||
	s.Dp = (*int8)(unsafe.Pointer(&i))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IoctlSetStrioctlRetInt(fd int, req uint, s *Strioctl) (int, error) {
 | 
			
		||||
	return ioctlRet(fd, req, uintptr(unsafe.Pointer(s)))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								vendor/golang.org/x/sys/unix/syscall_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								vendor/golang.org/x/sys/unix/syscall_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -13,6 +13,7 @@ package unix
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/binary"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
@@ -233,7 +234,7 @@ func Futimesat(dirfd int, path string, tv []Timeval) error {
 | 
			
		||||
func Futimes(fd int, tv []Timeval) (err error) {
 | 
			
		||||
	// Believe it or not, this is the best we can do on Linux
 | 
			
		||||
	// (and is what glibc does).
 | 
			
		||||
	return Utimes("/proc/self/fd/"+itoa(fd), tv)
 | 
			
		||||
	return Utimes("/proc/self/fd/"+strconv.Itoa(fd), tv)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const ImplementsGetwd = true
 | 
			
		||||
@@ -1891,17 +1892,28 @@ func PrctlRetInt(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uint
 | 
			
		||||
	return int(ret), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// issue 1435.
 | 
			
		||||
// On linux Setuid and Setgid only affects the current thread, not the process.
 | 
			
		||||
// This does not match what most callers expect so we must return an error
 | 
			
		||||
// here rather than letting the caller think that the call succeeded.
 | 
			
		||||
 | 
			
		||||
func Setuid(uid int) (err error) {
 | 
			
		||||
	return EOPNOTSUPP
 | 
			
		||||
	return syscall.Setuid(uid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Setgid(uid int) (err error) {
 | 
			
		||||
	return EOPNOTSUPP
 | 
			
		||||
func Setgid(gid int) (err error) {
 | 
			
		||||
	return syscall.Setgid(gid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Setreuid(ruid, euid int) (err error) {
 | 
			
		||||
	return syscall.Setreuid(ruid, euid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Setregid(rgid, egid int) (err error) {
 | 
			
		||||
	return syscall.Setregid(rgid, egid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Setresuid(ruid, euid, suid int) (err error) {
 | 
			
		||||
	return syscall.Setresuid(ruid, euid, suid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Setresgid(rgid, egid, sgid int) (err error) {
 | 
			
		||||
	return syscall.Setresgid(rgid, egid, sgid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetfsgidRetGid sets fsgid for current thread and returns previous fsgid set.
 | 
			
		||||
@@ -2240,7 +2252,7 @@ func (fh *FileHandle) Bytes() []byte {
 | 
			
		||||
	if n == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return (*[1 << 30]byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&fh.fileHandle.Type)) + 4))[:n:n]
 | 
			
		||||
	return unsafe.Slice((*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&fh.fileHandle.Type))+4)), n)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NameToHandleAt wraps the name_to_handle_at system call; it obtains
 | 
			
		||||
@@ -2356,6 +2368,16 @@ func Setitimer(which ItimerWhich, it Itimerval) (Itimerval, error) {
 | 
			
		||||
	return prev, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//sysnb	rtSigprocmask(how int, set *Sigset_t, oldset *Sigset_t, sigsetsize uintptr) (err error) = SYS_RT_SIGPROCMASK
 | 
			
		||||
 | 
			
		||||
func PthreadSigmask(how int, set, oldset *Sigset_t) error {
 | 
			
		||||
	if oldset != nil {
 | 
			
		||||
		// Explicitly clear in case Sigset_t is larger than _C__NSIG.
 | 
			
		||||
		*oldset = Sigset_t{}
 | 
			
		||||
	}
 | 
			
		||||
	return rtSigprocmask(how, set, oldset, _C__NSIG/8)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Unimplemented
 | 
			
		||||
 */
 | 
			
		||||
@@ -2414,7 +2436,6 @@ func Setitimer(which ItimerWhich, it Itimerval) (Itimerval, error) {
 | 
			
		||||
// RestartSyscall
 | 
			
		||||
// RtSigaction
 | 
			
		||||
// RtSigpending
 | 
			
		||||
// RtSigprocmask
 | 
			
		||||
// RtSigqueueinfo
 | 
			
		||||
// RtSigreturn
 | 
			
		||||
// RtSigsuspend
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -41,10 +41,6 @@ func setTimeval(sec, usec int64) Timeval {
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
			
		||||
//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
			
		||||
//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -46,11 +46,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
			
		||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
			
		||||
//sys	Shutdown(fd int, how int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -62,10 +62,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 | 
			
		||||
//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
 | 
			
		||||
//sys	Shutdown(fd int, how int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
			
		||||
//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -39,11 +39,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
			
		||||
//sysnb	setrlimit(resource int, rlim *Rlimit) (err error)
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
			
		||||
//sys	Shutdown(fd int, how int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_loong64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_loong64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -34,10 +34,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
			
		||||
//sys	Shutdown(fd int, how int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -37,11 +37,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
			
		||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
			
		||||
//sys	Shutdown(fd int, how int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
			
		||||
//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -32,10 +32,6 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr,
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
			
		||||
//sys	Shutdown(fd int, how int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
			
		||||
//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_ppc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_ppc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -34,10 +34,6 @@ import (
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
			
		||||
//sys	Shutdown(fd int, how int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
			
		||||
//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -34,11 +34,7 @@ package unix
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
			
		||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
			
		||||
//sys	Shutdown(fd int, how int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
			
		||||
//sys	Stat(path string, stat *Stat_t) (err error)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -38,11 +38,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
			
		||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
			
		||||
//sys	Shutdown(fd int, how int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -34,11 +34,7 @@ import (
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
			
		||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
			
		||||
//sys	Stat(path string, stat *Stat_t) (err error)
 | 
			
		||||
//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -31,11 +31,7 @@ package unix
 | 
			
		||||
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
			
		||||
//sys	setfsgid(gid int) (prev int, err error)
 | 
			
		||||
//sys	setfsuid(uid int) (prev int, err error)
 | 
			
		||||
//sysnb	Setregid(rgid int, egid int) (err error)
 | 
			
		||||
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
			
		||||
//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
			
		||||
//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
			
		||||
//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
			
		||||
//sys	Shutdown(fd int, how int) (err error)
 | 
			
		||||
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
			
		||||
//sys	Stat(path string, stat *Stat_t) (err error)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,8 +2,8 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
//go:build (openbsd && 386) || (openbsd && amd64) || (openbsd && arm) || (openbsd && arm64)
 | 
			
		||||
// +build openbsd,386 openbsd,amd64 openbsd,arm openbsd,arm64
 | 
			
		||||
//go:build openbsd && !mips64
 | 
			
		||||
// +build openbsd,!mips64
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
//go:build ppc64 && openbsd
 | 
			
		||||
// +build ppc64,openbsd
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
func setTimespec(sec, nsec int64) Timespec {
 | 
			
		||||
	return Timespec{Sec: sec, Nsec: nsec}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func setTimeval(sec, usec int64) Timeval {
 | 
			
		||||
	return Timeval{Sec: sec, Usec: usec}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
			
		||||
	k.Ident = uint64(fd)
 | 
			
		||||
	k.Filter = int16(mode)
 | 
			
		||||
	k.Flags = uint16(flags)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (iov *Iovec) SetLen(length int) {
 | 
			
		||||
	iov.Len = uint64(length)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (msghdr *Msghdr) SetControllen(length int) {
 | 
			
		||||
	msghdr.Controllen = uint32(length)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (msghdr *Msghdr) SetIovlen(length int) {
 | 
			
		||||
	msghdr.Iovlen = uint32(length)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (cmsg *Cmsghdr) SetLen(length int) {
 | 
			
		||||
	cmsg.Len = uint32(length)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
 | 
			
		||||
// of openbsd/ppc64 the syscall is called sysctl instead of __sysctl.
 | 
			
		||||
const SYS___SYSCTL = SYS_SYSCTL
 | 
			
		||||
							
								
								
									
										42
									
								
								vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
//go:build riscv64 && openbsd
 | 
			
		||||
// +build riscv64,openbsd
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
func setTimespec(sec, nsec int64) Timespec {
 | 
			
		||||
	return Timespec{Sec: sec, Nsec: nsec}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func setTimeval(sec, usec int64) Timeval {
 | 
			
		||||
	return Timeval{Sec: sec, Usec: usec}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
			
		||||
	k.Ident = uint64(fd)
 | 
			
		||||
	k.Filter = int16(mode)
 | 
			
		||||
	k.Flags = uint16(flags)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (iov *Iovec) SetLen(length int) {
 | 
			
		||||
	iov.Len = uint64(length)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (msghdr *Msghdr) SetControllen(length int) {
 | 
			
		||||
	msghdr.Controllen = uint32(length)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (msghdr *Msghdr) SetIovlen(length int) {
 | 
			
		||||
	msghdr.Iovlen = uint32(length)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (cmsg *Cmsghdr) SetLen(length int) {
 | 
			
		||||
	cmsg.Len = uint32(length)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
 | 
			
		||||
// of openbsd/riscv64 the syscall is called sysctl instead of __sysctl.
 | 
			
		||||
const SYS___SYSCTL = SYS_SYSCTL
 | 
			
		||||
							
								
								
									
										215
									
								
								vendor/golang.org/x/sys/unix/syscall_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										215
									
								
								vendor/golang.org/x/sys/unix/syscall_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -750,8 +750,8 @@ type EventPort struct {
 | 
			
		||||
	// we should handle things gracefully. To do so, we need to keep an extra
 | 
			
		||||
	// reference to the cookie around until the event is processed
 | 
			
		||||
	// thus the otherwise seemingly extraneous "cookies" map
 | 
			
		||||
	// The key of this map is a pointer to the corresponding &fCookie.cookie
 | 
			
		||||
	cookies map[*interface{}]*fileObjCookie
 | 
			
		||||
	// The key of this map is a pointer to the corresponding fCookie
 | 
			
		||||
	cookies map[*fileObjCookie]struct{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PortEvent is an abstraction of the port_event C struct.
 | 
			
		||||
@@ -778,7 +778,7 @@ func NewEventPort() (*EventPort, error) {
 | 
			
		||||
		port:    port,
 | 
			
		||||
		fds:     make(map[uintptr]*fileObjCookie),
 | 
			
		||||
		paths:   make(map[string]*fileObjCookie),
 | 
			
		||||
		cookies: make(map[*interface{}]*fileObjCookie),
 | 
			
		||||
		cookies: make(map[*fileObjCookie]struct{}),
 | 
			
		||||
	}
 | 
			
		||||
	return e, nil
 | 
			
		||||
}
 | 
			
		||||
@@ -799,6 +799,7 @@ func (e *EventPort) Close() error {
 | 
			
		||||
	}
 | 
			
		||||
	e.fds = nil
 | 
			
		||||
	e.paths = nil
 | 
			
		||||
	e.cookies = nil
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -826,17 +827,16 @@ func (e *EventPort) AssociatePath(path string, stat os.FileInfo, events int, coo
 | 
			
		||||
	if _, found := e.paths[path]; found {
 | 
			
		||||
		return fmt.Errorf("%v is already associated with this Event Port", path)
 | 
			
		||||
	}
 | 
			
		||||
	fobj, err := createFileObj(path, stat)
 | 
			
		||||
	fCookie, err := createFileObjCookie(path, stat, cookie)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	fCookie := &fileObjCookie{fobj, cookie}
 | 
			
		||||
	_, err = port_associate(e.port, PORT_SOURCE_FILE, uintptr(unsafe.Pointer(fobj)), events, (*byte)(unsafe.Pointer(&fCookie.cookie)))
 | 
			
		||||
	_, err = port_associate(e.port, PORT_SOURCE_FILE, uintptr(unsafe.Pointer(fCookie.fobj)), events, (*byte)(unsafe.Pointer(fCookie)))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	e.paths[path] = fCookie
 | 
			
		||||
	e.cookies[&fCookie.cookie] = fCookie
 | 
			
		||||
	e.cookies[fCookie] = struct{}{}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -858,7 +858,7 @@ func (e *EventPort) DissociatePath(path string) error {
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		// dissociate was successful, safe to delete the cookie
 | 
			
		||||
		fCookie := e.paths[path]
 | 
			
		||||
		delete(e.cookies, &fCookie.cookie)
 | 
			
		||||
		delete(e.cookies, fCookie)
 | 
			
		||||
	}
 | 
			
		||||
	delete(e.paths, path)
 | 
			
		||||
	return err
 | 
			
		||||
@@ -871,13 +871,16 @@ func (e *EventPort) AssociateFd(fd uintptr, events int, cookie interface{}) erro
 | 
			
		||||
	if _, found := e.fds[fd]; found {
 | 
			
		||||
		return fmt.Errorf("%v is already associated with this Event Port", fd)
 | 
			
		||||
	}
 | 
			
		||||
	fCookie := &fileObjCookie{nil, cookie}
 | 
			
		||||
	_, err := port_associate(e.port, PORT_SOURCE_FD, fd, events, (*byte)(unsafe.Pointer(&fCookie.cookie)))
 | 
			
		||||
	fCookie, err := createFileObjCookie("", nil, cookie)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	_, err = port_associate(e.port, PORT_SOURCE_FD, fd, events, (*byte)(unsafe.Pointer(fCookie)))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	e.fds[fd] = fCookie
 | 
			
		||||
	e.cookies[&fCookie.cookie] = fCookie
 | 
			
		||||
	e.cookies[fCookie] = struct{}{}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -896,27 +899,31 @@ func (e *EventPort) DissociateFd(fd uintptr) error {
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		// dissociate was successful, safe to delete the cookie
 | 
			
		||||
		fCookie := e.fds[fd]
 | 
			
		||||
		delete(e.cookies, &fCookie.cookie)
 | 
			
		||||
		delete(e.cookies, fCookie)
 | 
			
		||||
	}
 | 
			
		||||
	delete(e.fds, fd)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createFileObj(name string, stat os.FileInfo) (*fileObj, error) {
 | 
			
		||||
	fobj := new(fileObj)
 | 
			
		||||
	bs, err := ByteSliceFromString(name)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
func createFileObjCookie(name string, stat os.FileInfo, cookie interface{}) (*fileObjCookie, error) {
 | 
			
		||||
	fCookie := new(fileObjCookie)
 | 
			
		||||
	fCookie.cookie = cookie
 | 
			
		||||
	if name != "" && stat != nil {
 | 
			
		||||
		fCookie.fobj = new(fileObj)
 | 
			
		||||
		bs, err := ByteSliceFromString(name)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		fCookie.fobj.Name = (*int8)(unsafe.Pointer(&bs[0]))
 | 
			
		||||
		s := stat.Sys().(*syscall.Stat_t)
 | 
			
		||||
		fCookie.fobj.Atim.Sec = s.Atim.Sec
 | 
			
		||||
		fCookie.fobj.Atim.Nsec = s.Atim.Nsec
 | 
			
		||||
		fCookie.fobj.Mtim.Sec = s.Mtim.Sec
 | 
			
		||||
		fCookie.fobj.Mtim.Nsec = s.Mtim.Nsec
 | 
			
		||||
		fCookie.fobj.Ctim.Sec = s.Ctim.Sec
 | 
			
		||||
		fCookie.fobj.Ctim.Nsec = s.Ctim.Nsec
 | 
			
		||||
	}
 | 
			
		||||
	fobj.Name = (*int8)(unsafe.Pointer(&bs[0]))
 | 
			
		||||
	s := stat.Sys().(*syscall.Stat_t)
 | 
			
		||||
	fobj.Atim.Sec = s.Atim.Sec
 | 
			
		||||
	fobj.Atim.Nsec = s.Atim.Nsec
 | 
			
		||||
	fobj.Mtim.Sec = s.Mtim.Sec
 | 
			
		||||
	fobj.Mtim.Nsec = s.Mtim.Nsec
 | 
			
		||||
	fobj.Ctim.Sec = s.Ctim.Sec
 | 
			
		||||
	fobj.Ctim.Nsec = s.Ctim.Nsec
 | 
			
		||||
	return fobj, nil
 | 
			
		||||
	return fCookie, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetOne wraps port_get(3c) and returns a single PortEvent.
 | 
			
		||||
@@ -929,44 +936,50 @@ func (e *EventPort) GetOne(t *Timespec) (*PortEvent, error) {
 | 
			
		||||
	p := new(PortEvent)
 | 
			
		||||
	e.mu.Lock()
 | 
			
		||||
	defer e.mu.Unlock()
 | 
			
		||||
	e.peIntToExt(pe, p)
 | 
			
		||||
	err = e.peIntToExt(pe, p)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return p, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// peIntToExt converts a cgo portEvent struct into the friendlier PortEvent
 | 
			
		||||
// NOTE: Always call this function while holding the e.mu mutex
 | 
			
		||||
func (e *EventPort) peIntToExt(peInt *portEvent, peExt *PortEvent) {
 | 
			
		||||
func (e *EventPort) peIntToExt(peInt *portEvent, peExt *PortEvent) error {
 | 
			
		||||
	if e.cookies == nil {
 | 
			
		||||
		return fmt.Errorf("this EventPort is already closed")
 | 
			
		||||
	}
 | 
			
		||||
	peExt.Events = peInt.Events
 | 
			
		||||
	peExt.Source = peInt.Source
 | 
			
		||||
	cookie := (*interface{})(unsafe.Pointer(peInt.User))
 | 
			
		||||
	peExt.Cookie = *cookie
 | 
			
		||||
	fCookie := (*fileObjCookie)(unsafe.Pointer(peInt.User))
 | 
			
		||||
	_, found := e.cookies[fCookie]
 | 
			
		||||
 | 
			
		||||
	if !found {
 | 
			
		||||
		panic("unexpected event port address; may be due to kernel bug; see https://go.dev/issue/54254")
 | 
			
		||||
	}
 | 
			
		||||
	peExt.Cookie = fCookie.cookie
 | 
			
		||||
	delete(e.cookies, fCookie)
 | 
			
		||||
 | 
			
		||||
	switch peInt.Source {
 | 
			
		||||
	case PORT_SOURCE_FD:
 | 
			
		||||
		delete(e.cookies, cookie)
 | 
			
		||||
		peExt.Fd = uintptr(peInt.Object)
 | 
			
		||||
		// Only remove the fds entry if it exists and this cookie matches
 | 
			
		||||
		if fobj, ok := e.fds[peExt.Fd]; ok {
 | 
			
		||||
			if &fobj.cookie == cookie {
 | 
			
		||||
			if fobj == fCookie {
 | 
			
		||||
				delete(e.fds, peExt.Fd)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case PORT_SOURCE_FILE:
 | 
			
		||||
		if fCookie, ok := e.cookies[cookie]; ok && uintptr(unsafe.Pointer(fCookie.fobj)) == uintptr(peInt.Object) {
 | 
			
		||||
			// Use our stashed reference rather than using unsafe on what we got back
 | 
			
		||||
			// the unsafe version would be (*fileObj)(unsafe.Pointer(uintptr(peInt.Object)))
 | 
			
		||||
			peExt.fobj = fCookie.fobj
 | 
			
		||||
		} else {
 | 
			
		||||
			panic("unexpected event port address; may be due to kernel bug; see https://go.dev/issue/54254")
 | 
			
		||||
		}
 | 
			
		||||
		delete(e.cookies, cookie)
 | 
			
		||||
		peExt.fobj = fCookie.fobj
 | 
			
		||||
		peExt.Path = BytePtrToString((*byte)(unsafe.Pointer(peExt.fobj.Name)))
 | 
			
		||||
		// Only remove the paths entry if it exists and this cookie matches
 | 
			
		||||
		if fobj, ok := e.paths[peExt.Path]; ok {
 | 
			
		||||
			if &fobj.cookie == cookie {
 | 
			
		||||
			if fobj == fCookie {
 | 
			
		||||
				delete(e.paths, peExt.Path)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Pending wraps port_getn(3c) and returns how many events are pending.
 | 
			
		||||
@@ -990,7 +1003,7 @@ func (e *EventPort) Get(s []PortEvent, min int, timeout *Timespec) (int, error)
 | 
			
		||||
	got := uint32(min)
 | 
			
		||||
	max := uint32(len(s))
 | 
			
		||||
	var err error
 | 
			
		||||
	ps := make([]portEvent, max, max)
 | 
			
		||||
	ps := make([]portEvent, max)
 | 
			
		||||
	_, err = port_getn(e.port, &ps[0], max, &got, timeout)
 | 
			
		||||
	// got will be trustworthy with ETIME, but not any other error.
 | 
			
		||||
	if err != nil && err != ETIME {
 | 
			
		||||
@@ -998,8 +1011,122 @@ func (e *EventPort) Get(s []PortEvent, min int, timeout *Timespec) (int, error)
 | 
			
		||||
	}
 | 
			
		||||
	e.mu.Lock()
 | 
			
		||||
	defer e.mu.Unlock()
 | 
			
		||||
	valid := 0
 | 
			
		||||
	for i := 0; i < int(got); i++ {
 | 
			
		||||
		e.peIntToExt(&ps[i], &s[i])
 | 
			
		||||
		err2 := e.peIntToExt(&ps[i], &s[i])
 | 
			
		||||
		if err2 != nil {
 | 
			
		||||
			if valid == 0 && err == nil {
 | 
			
		||||
				// If err2 is the only error and there are no valid events
 | 
			
		||||
				// to return, return it to the caller.
 | 
			
		||||
				err = err2
 | 
			
		||||
			}
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		valid = i + 1
 | 
			
		||||
	}
 | 
			
		||||
	return int(got), err
 | 
			
		||||
	return valid, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//sys	putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error)
 | 
			
		||||
 | 
			
		||||
func Putmsg(fd int, cl []byte, data []byte, flags int) (err error) {
 | 
			
		||||
	var clp, datap *strbuf
 | 
			
		||||
	if len(cl) > 0 {
 | 
			
		||||
		clp = &strbuf{
 | 
			
		||||
			Len: int32(len(cl)),
 | 
			
		||||
			Buf: (*int8)(unsafe.Pointer(&cl[0])),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if len(data) > 0 {
 | 
			
		||||
		datap = &strbuf{
 | 
			
		||||
			Len: int32(len(data)),
 | 
			
		||||
			Buf: (*int8)(unsafe.Pointer(&data[0])),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return putmsg(fd, clp, datap, flags)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//sys	getmsg(fd int, clptr *strbuf, dataptr *strbuf, flags *int) (err error)
 | 
			
		||||
 | 
			
		||||
func Getmsg(fd int, cl []byte, data []byte) (retCl []byte, retData []byte, flags int, err error) {
 | 
			
		||||
	var clp, datap *strbuf
 | 
			
		||||
	if len(cl) > 0 {
 | 
			
		||||
		clp = &strbuf{
 | 
			
		||||
			Maxlen: int32(len(cl)),
 | 
			
		||||
			Buf:    (*int8)(unsafe.Pointer(&cl[0])),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if len(data) > 0 {
 | 
			
		||||
		datap = &strbuf{
 | 
			
		||||
			Maxlen: int32(len(data)),
 | 
			
		||||
			Buf:    (*int8)(unsafe.Pointer(&data[0])),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = getmsg(fd, clp, datap, &flags); err != nil {
 | 
			
		||||
		return nil, nil, 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(cl) > 0 {
 | 
			
		||||
		retCl = cl[:clp.Len]
 | 
			
		||||
	}
 | 
			
		||||
	if len(data) > 0 {
 | 
			
		||||
		retData = data[:datap.Len]
 | 
			
		||||
	}
 | 
			
		||||
	return retCl, retData, flags, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IoctlSetIntRetInt(fd int, req uint, arg int) (int, error) {
 | 
			
		||||
	return ioctlRet(fd, req, uintptr(arg))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IoctlSetString(fd int, req uint, val string) error {
 | 
			
		||||
	bs := make([]byte, len(val)+1)
 | 
			
		||||
	copy(bs[:len(bs)-1], val)
 | 
			
		||||
	err := ioctl(fd, req, uintptr(unsafe.Pointer(&bs[0])))
 | 
			
		||||
	runtime.KeepAlive(&bs[0])
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Lifreq Helpers
 | 
			
		||||
 | 
			
		||||
func (l *Lifreq) SetName(name string) error {
 | 
			
		||||
	if len(name) >= len(l.Name) {
 | 
			
		||||
		return fmt.Errorf("name cannot be more than %d characters", len(l.Name)-1)
 | 
			
		||||
	}
 | 
			
		||||
	for i := range name {
 | 
			
		||||
		l.Name[i] = int8(name[i])
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *Lifreq) SetLifruInt(d int) {
 | 
			
		||||
	*(*int)(unsafe.Pointer(&l.Lifru[0])) = d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *Lifreq) GetLifruInt() int {
 | 
			
		||||
	return *(*int)(unsafe.Pointer(&l.Lifru[0]))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *Lifreq) SetLifruUint(d uint) {
 | 
			
		||||
	*(*uint)(unsafe.Pointer(&l.Lifru[0])) = d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *Lifreq) GetLifruUint() uint {
 | 
			
		||||
	return *(*uint)(unsafe.Pointer(&l.Lifru[0]))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IoctlLifreq(fd int, req uint, l *Lifreq) error {
 | 
			
		||||
	return ioctl(fd, req, uintptr(unsafe.Pointer(l)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Strioctl Helpers
 | 
			
		||||
 | 
			
		||||
func (s *Strioctl) SetInt(i int) {
 | 
			
		||||
	s.Len = int32(unsafe.Sizeof(i))
 | 
			
		||||
	s.Dp = (*int8)(unsafe.Pointer(&i))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IoctlSetStrioctlRetInt(fd int, req uint, s *Strioctl) (int, error) {
 | 
			
		||||
	return ioctlRet(fd, req, uintptr(unsafe.Pointer(s)))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/golang.org/x/sys/unix/syscall_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/golang.org/x/sys/unix/syscall_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -13,8 +13,6 @@ import (
 | 
			
		||||
	"sync"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/internal/unsafeheader"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
@@ -117,11 +115,7 @@ func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (d
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Use unsafe to convert addr into a []byte.
 | 
			
		||||
	var b []byte
 | 
			
		||||
	hdr := (*unsafeheader.Slice)(unsafe.Pointer(&b))
 | 
			
		||||
	hdr.Data = unsafe.Pointer(addr)
 | 
			
		||||
	hdr.Cap = length
 | 
			
		||||
	hdr.Len = length
 | 
			
		||||
	b := unsafe.Slice((*byte)(unsafe.Pointer(addr)), length)
 | 
			
		||||
 | 
			
		||||
	// Register mapping in m and return it.
 | 
			
		||||
	p := &b[cap(b)-1]
 | 
			
		||||
@@ -429,11 +423,15 @@ func Send(s int, buf []byte, flags int) (err error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) {
 | 
			
		||||
	ptr, n, err := to.sockaddr()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	var ptr unsafe.Pointer
 | 
			
		||||
	var salen _Socklen
 | 
			
		||||
	if to != nil {
 | 
			
		||||
		ptr, salen, err = to.sockaddr()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return sendto(fd, p, flags, ptr, n)
 | 
			
		||||
	return sendto(fd, p, flags, ptr, salen)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetsockoptByte(fd, level, opt int, value byte) (err error) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/golang.org/x/sys/unix/syscall_unix_gc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/golang.org/x/sys/unix/syscall_unix_gc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,11 +2,9 @@
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
//go:build (darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris) && gc && !ppc64le && !ppc64
 | 
			
		||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
			
		||||
//go:build (darwin || dragonfly || freebsd || (linux && !ppc64 && !ppc64le) || netbsd || openbsd || solaris) && gc
 | 
			
		||||
// +build darwin dragonfly freebsd linux,!ppc64,!ppc64le netbsd openbsd solaris
 | 
			
		||||
// +build gc
 | 
			
		||||
// +build !ppc64le
 | 
			
		||||
// +build !ppc64
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										173
									
								
								vendor/golang.org/x/sys/unix/syscall_zos_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										173
									
								
								vendor/golang.org/x/sys/unix/syscall_zos_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -9,8 +9,10 @@ package unix
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
@@ -55,7 +57,13 @@ func (d *Dirent) NameString() string {
 | 
			
		||||
	if d == nil {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return string(d.Name[:d.Namlen])
 | 
			
		||||
	s := string(d.Name[:])
 | 
			
		||||
	idx := strings.IndexByte(s, 0)
 | 
			
		||||
	if idx == -1 {
 | 
			
		||||
		return s
 | 
			
		||||
	} else {
 | 
			
		||||
		return s[:idx]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
 | 
			
		||||
@@ -1230,6 +1238,14 @@ func Readdir(dir uintptr) (*Dirent, error) {
 | 
			
		||||
	return &ent, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func readdir_r(dirp uintptr, entry *direntLE, result **direntLE) (err error) {
 | 
			
		||||
	r0, _, e1 := syscall_syscall(SYS___READDIR_R_A, dirp, uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result)))
 | 
			
		||||
	if int64(r0) == -1 {
 | 
			
		||||
		err = errnoErr(Errno(e1))
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Closedir(dir uintptr) error {
 | 
			
		||||
	_, _, e := syscall_syscall(SYS_CLOSEDIR, dir, 0, 0)
 | 
			
		||||
	if e != 0 {
 | 
			
		||||
@@ -1821,3 +1837,158 @@ func Unmount(name string, mtm int) (err error) {
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fdToPath(dirfd int) (path string, err error) {
 | 
			
		||||
	var buffer [1024]byte
 | 
			
		||||
	// w_ctrl()
 | 
			
		||||
	ret := runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS_W_IOCTL<<4,
 | 
			
		||||
		[]uintptr{uintptr(dirfd), 17, 1024, uintptr(unsafe.Pointer(&buffer[0]))})
 | 
			
		||||
	if ret == 0 {
 | 
			
		||||
		zb := bytes.IndexByte(buffer[:], 0)
 | 
			
		||||
		if zb == -1 {
 | 
			
		||||
			zb = len(buffer)
 | 
			
		||||
		}
 | 
			
		||||
		// __e2a_l()
 | 
			
		||||
		runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___E2A_L<<4,
 | 
			
		||||
			[]uintptr{uintptr(unsafe.Pointer(&buffer[0])), uintptr(zb)})
 | 
			
		||||
		return string(buffer[:zb]), nil
 | 
			
		||||
	}
 | 
			
		||||
	// __errno()
 | 
			
		||||
	errno := int(*(*int32)(unsafe.Pointer(runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___ERRNO<<4,
 | 
			
		||||
		[]uintptr{}))))
 | 
			
		||||
	// __errno2()
 | 
			
		||||
	errno2 := int(runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___ERRNO2<<4,
 | 
			
		||||
		[]uintptr{}))
 | 
			
		||||
	// strerror_r()
 | 
			
		||||
	ret = runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS_STRERROR_R<<4,
 | 
			
		||||
		[]uintptr{uintptr(errno), uintptr(unsafe.Pointer(&buffer[0])), 1024})
 | 
			
		||||
	if ret == 0 {
 | 
			
		||||
		zb := bytes.IndexByte(buffer[:], 0)
 | 
			
		||||
		if zb == -1 {
 | 
			
		||||
			zb = len(buffer)
 | 
			
		||||
		}
 | 
			
		||||
		return "", fmt.Errorf("%s (errno2=0x%x)", buffer[:zb], errno2)
 | 
			
		||||
	} else {
 | 
			
		||||
		return "", fmt.Errorf("fdToPath errno %d (errno2=0x%x)", errno, errno2)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func direntLeToDirentUnix(dirent *direntLE, dir uintptr, path string) (Dirent, error) {
 | 
			
		||||
	var d Dirent
 | 
			
		||||
 | 
			
		||||
	d.Ino = uint64(dirent.Ino)
 | 
			
		||||
	offset, err := Telldir(dir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return d, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	d.Off = int64(offset)
 | 
			
		||||
	s := string(bytes.Split(dirent.Name[:], []byte{0})[0])
 | 
			
		||||
	copy(d.Name[:], s)
 | 
			
		||||
 | 
			
		||||
	d.Reclen = uint16(24 + len(d.NameString()))
 | 
			
		||||
	var st Stat_t
 | 
			
		||||
	path = path + "/" + s
 | 
			
		||||
	err = Lstat(path, &st)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return d, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	d.Type = uint8(st.Mode >> 24)
 | 
			
		||||
	return d, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
			
		||||
	// Simulation of Getdirentries port from the Darwin implementation.
 | 
			
		||||
	// COMMENTS FROM DARWIN:
 | 
			
		||||
	// 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
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get path from fd to avoid unavailable call (fdopendir)
 | 
			
		||||
	path, err := fdToPath(fd)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	d, err := Opendir(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	defer Closedir(d)
 | 
			
		||||
 | 
			
		||||
	var cnt int64
 | 
			
		||||
	for {
 | 
			
		||||
		var entryLE direntLE
 | 
			
		||||
		var entrypLE *direntLE
 | 
			
		||||
		e := readdir_r(d, &entryLE, &entrypLE)
 | 
			
		||||
		if e != nil {
 | 
			
		||||
			return n, e
 | 
			
		||||
		}
 | 
			
		||||
		if entrypLE == nil {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		if skip > 0 {
 | 
			
		||||
			skip--
 | 
			
		||||
			cnt++
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Dirent on zos has a different structure
 | 
			
		||||
		entry, e := direntLeToDirentUnix(&entryLE, d, path)
 | 
			
		||||
		if e != nil {
 | 
			
		||||
			return n, e
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		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 := unsafe.Slice((*byte)(unsafe.Pointer(&entry)), reclen)
 | 
			
		||||
		copy(buf, s)
 | 
			
		||||
 | 
			
		||||
		buf = buf[reclen:]
 | 
			
		||||
		n += reclen
 | 
			
		||||
		cnt++
 | 
			
		||||
	}
 | 
			
		||||
	// Set the seek offset of the input fd to record
 | 
			
		||||
	// how many files we've already returned.
 | 
			
		||||
	_, err = Seek(fd, cnt, 0 /* SEEK_SET */)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return n, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return n, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ReadDirent(fd int, buf []byte) (n int, err error) {
 | 
			
		||||
	var base = (*uintptr)(unsafe.Pointer(new(uint64)))
 | 
			
		||||
	return Getdirentries(fd, buf, base)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func direntIno(buf []byte) (uint64, bool) {
 | 
			
		||||
	return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func direntReclen(buf []byte) (uint64, bool) {
 | 
			
		||||
	return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func direntNamlen(buf []byte) (uint64, bool) {
 | 
			
		||||
	reclen, ok := direntReclen(buf)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return 0, false
 | 
			
		||||
	}
 | 
			
		||||
	return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/golang.org/x/sys/unix/sysvshm_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/sys/unix/sysvshm_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,11 +7,7 @@
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/internal/unsafeheader"
 | 
			
		||||
)
 | 
			
		||||
import "unsafe"
 | 
			
		||||
 | 
			
		||||
// SysvShmAttach attaches the Sysv shared memory segment associated with the
 | 
			
		||||
// shared memory identifier id.
 | 
			
		||||
@@ -34,12 +30,7 @@ func SysvShmAttach(id int, addr uintptr, flag int) ([]byte, error) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Use unsafe to convert addr into a []byte.
 | 
			
		||||
	// TODO: convert to unsafe.Slice once we can assume Go 1.17
 | 
			
		||||
	var b []byte
 | 
			
		||||
	hdr := (*unsafeheader.Slice)(unsafe.Pointer(&b))
 | 
			
		||||
	hdr.Data = unsafe.Pointer(addr)
 | 
			
		||||
	hdr.Cap = int(info.Segsz)
 | 
			
		||||
	hdr.Len = int(info.Segsz)
 | 
			
		||||
	b := unsafe.Slice((*byte)(unsafe.Pointer(addr)), int(info.Segsz))
 | 
			
		||||
	return b, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										95
									
								
								vendor/golang.org/x/sys/unix/xattr_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										95
									
								
								vendor/golang.org/x/sys/unix/xattr_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -160,13 +160,12 @@ func Lremovexattr(link string, attr string) (err error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Listxattr(file string, dest []byte) (sz int, err error) {
 | 
			
		||||
	d := initxattrdest(dest, 0)
 | 
			
		||||
	destsiz := len(dest)
 | 
			
		||||
 | 
			
		||||
	// FreeBSD won't allow you to list xattrs from multiple namespaces
 | 
			
		||||
	s := 0
 | 
			
		||||
	s, pos := 0, 0
 | 
			
		||||
	for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
 | 
			
		||||
		stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz)
 | 
			
		||||
		stmp, e := ListxattrNS(file, nsid, dest[pos:])
 | 
			
		||||
 | 
			
		||||
		/* Errors accessing system attrs are ignored so that
 | 
			
		||||
		 * we can implement the Linux-like behavior of omitting errors that
 | 
			
		||||
@@ -175,66 +174,102 @@ func Listxattr(file string, dest []byte) (sz int, err error) {
 | 
			
		||||
		 * Linux will still error if we ask for user attributes on a file that
 | 
			
		||||
		 * we don't have read permissions on, so don't ignore those errors
 | 
			
		||||
		 */
 | 
			
		||||
		if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
 | 
			
		||||
			continue
 | 
			
		||||
		} else if e != nil {
 | 
			
		||||
		if e != nil {
 | 
			
		||||
			if e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			return s, e
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		s += stmp
 | 
			
		||||
		destsiz -= s
 | 
			
		||||
		if destsiz < 0 {
 | 
			
		||||
			destsiz = 0
 | 
			
		||||
		pos = s
 | 
			
		||||
		if pos > destsiz {
 | 
			
		||||
			pos = destsiz
 | 
			
		||||
		}
 | 
			
		||||
		d = initxattrdest(dest, s)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return s, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ListxattrNS(file string, nsid int, dest []byte) (sz int, err error) {
 | 
			
		||||
	d := initxattrdest(dest, 0)
 | 
			
		||||
	destsiz := len(dest)
 | 
			
		||||
 | 
			
		||||
	s, e := ExtattrListFile(file, nsid, uintptr(d), destsiz)
 | 
			
		||||
	if e != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return s, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Flistxattr(fd int, dest []byte) (sz int, err error) {
 | 
			
		||||
	d := initxattrdest(dest, 0)
 | 
			
		||||
	destsiz := len(dest)
 | 
			
		||||
 | 
			
		||||
	s := 0
 | 
			
		||||
	s, pos := 0, 0
 | 
			
		||||
	for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
 | 
			
		||||
		stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz)
 | 
			
		||||
		if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
 | 
			
		||||
			continue
 | 
			
		||||
		} else if e != nil {
 | 
			
		||||
		stmp, e := FlistxattrNS(fd, nsid, dest[pos:])
 | 
			
		||||
 | 
			
		||||
		if e != nil {
 | 
			
		||||
			if e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			return s, e
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		s += stmp
 | 
			
		||||
		destsiz -= s
 | 
			
		||||
		if destsiz < 0 {
 | 
			
		||||
			destsiz = 0
 | 
			
		||||
		pos = s
 | 
			
		||||
		if pos > destsiz {
 | 
			
		||||
			pos = destsiz
 | 
			
		||||
		}
 | 
			
		||||
		d = initxattrdest(dest, s)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return s, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FlistxattrNS(fd int, nsid int, dest []byte) (sz int, err error) {
 | 
			
		||||
	d := initxattrdest(dest, 0)
 | 
			
		||||
	destsiz := len(dest)
 | 
			
		||||
 | 
			
		||||
	s, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz)
 | 
			
		||||
	if e != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return s, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Llistxattr(link string, dest []byte) (sz int, err error) {
 | 
			
		||||
	d := initxattrdest(dest, 0)
 | 
			
		||||
	destsiz := len(dest)
 | 
			
		||||
 | 
			
		||||
	s := 0
 | 
			
		||||
	s, pos := 0, 0
 | 
			
		||||
	for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
 | 
			
		||||
		stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz)
 | 
			
		||||
		if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
 | 
			
		||||
			continue
 | 
			
		||||
		} else if e != nil {
 | 
			
		||||
		stmp, e := LlistxattrNS(link, nsid, dest[pos:])
 | 
			
		||||
 | 
			
		||||
		if e != nil {
 | 
			
		||||
			if e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			return s, e
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		s += stmp
 | 
			
		||||
		destsiz -= s
 | 
			
		||||
		if destsiz < 0 {
 | 
			
		||||
			destsiz = 0
 | 
			
		||||
		pos = s
 | 
			
		||||
		if pos > destsiz {
 | 
			
		||||
			pos = destsiz
 | 
			
		||||
		}
 | 
			
		||||
		d = initxattrdest(dest, s)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return s, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func LlistxattrNS(link string, nsid int, dest []byte) (sz int, err error) {
 | 
			
		||||
	d := initxattrdest(dest, 0)
 | 
			
		||||
	destsiz := len(dest)
 | 
			
		||||
 | 
			
		||||
	s, e := ExtattrListLink(link, nsid, uintptr(d), destsiz)
 | 
			
		||||
	if e != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return s, nil
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1905
									
								
								vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1905
									
								
								vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1904
									
								
								vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1904
									
								
								vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										40
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,40 +0,0 @@
 | 
			
		||||
// go run mksyscall.go -tags darwin,amd64,go1.13 syscall_darwin.1_13.go
 | 
			
		||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
//go:build darwin && amd64 && go1.13
 | 
			
		||||
// +build darwin,amd64,go1.13
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var _ syscall.Errno
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func closedir(dir uintptr) (err error) {
 | 
			
		||||
	_, _, e1 := syscall_syscall(libc_closedir_trampoline_addr, uintptr(dir), 0, 0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var libc_closedir_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib"
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
 | 
			
		||||
	r0, _, _ := syscall_syscall(libc_readdir_r_trampoline_addr, uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result)))
 | 
			
		||||
	res = Errno(r0)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var libc_readdir_r_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib"
 | 
			
		||||
							
								
								
									
										25
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,25 +0,0 @@
 | 
			
		||||
// go run mkasm.go darwin amd64
 | 
			
		||||
// Code generated by the command above; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
//go:build go1.13
 | 
			
		||||
// +build go1.13
 | 
			
		||||
 | 
			
		||||
#include "textflag.h"
 | 
			
		||||
 | 
			
		||||
TEXT libc_fdopendir_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_fdopendir(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_fdopendir_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_fdopendir_trampoline_addr(SB)/8, $libc_fdopendir_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_closedir_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_closedir(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_closedir_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_closedir_trampoline_addr(SB)/8, $libc_closedir_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_readdir_r_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_readdir_r(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_readdir_r_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_readdir_r_trampoline_addr(SB)/8, $libc_readdir_r_trampoline<>(SB)
 | 
			
		||||
							
								
								
									
										32
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
// go run mksyscall.go -tags darwin,amd64,go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go
 | 
			
		||||
// go run mksyscall.go -tags darwin,amd64 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go
 | 
			
		||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
//go:build darwin && amd64 && go1.12
 | 
			
		||||
// +build darwin,amd64,go1.12
 | 
			
		||||
//go:build darwin && amd64
 | 
			
		||||
// +build darwin,amd64
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
@@ -463,6 +463,32 @@ var libc_munlockall_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func closedir(dir uintptr) (err error) {
 | 
			
		||||
	_, _, e1 := syscall_syscall(libc_closedir_trampoline_addr, uintptr(dir), 0, 0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var libc_closedir_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib"
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
 | 
			
		||||
	r0, _, _ := syscall_syscall(libc_readdir_r_trampoline_addr, uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result)))
 | 
			
		||||
	res = Errno(r0)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var libc_readdir_r_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib"
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func pipe(p *[2]int32) (err error) {
 | 
			
		||||
	_, _, e1 := syscall_rawSyscall(libc_pipe_trampoline_addr, uintptr(unsafe.Pointer(p)), 0, 0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,11 +1,14 @@
 | 
			
		||||
// go run mkasm.go darwin amd64
 | 
			
		||||
// Code generated by the command above; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
//go:build go1.12
 | 
			
		||||
// +build go1.12
 | 
			
		||||
 | 
			
		||||
#include "textflag.h"
 | 
			
		||||
 | 
			
		||||
TEXT libc_fdopendir_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_fdopendir(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_fdopendir_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_fdopendir_trampoline_addr(SB)/8, $libc_fdopendir_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_getgroups(SB)
 | 
			
		||||
 | 
			
		||||
@@ -174,6 +177,18 @@ TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
GLOBL	·libc_munlockall_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_closedir_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_closedir(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_closedir_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_closedir_trampoline_addr(SB)/8, $libc_closedir_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_readdir_r_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_readdir_r(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_readdir_r_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_readdir_r_trampoline_addr(SB)/8, $libc_readdir_r_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_pipe_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_pipe(SB)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,40 +0,0 @@
 | 
			
		||||
// go run mksyscall.go -tags darwin,arm64,go1.13 syscall_darwin.1_13.go
 | 
			
		||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
//go:build darwin && arm64 && go1.13
 | 
			
		||||
// +build darwin,arm64,go1.13
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var _ syscall.Errno
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func closedir(dir uintptr) (err error) {
 | 
			
		||||
	_, _, e1 := syscall_syscall(libc_closedir_trampoline_addr, uintptr(dir), 0, 0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var libc_closedir_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib"
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
 | 
			
		||||
	r0, _, _ := syscall_syscall(libc_readdir_r_trampoline_addr, uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result)))
 | 
			
		||||
	res = Errno(r0)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var libc_readdir_r_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib"
 | 
			
		||||
							
								
								
									
										25
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,25 +0,0 @@
 | 
			
		||||
// go run mkasm.go darwin arm64
 | 
			
		||||
// Code generated by the command above; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
//go:build go1.13
 | 
			
		||||
// +build go1.13
 | 
			
		||||
 | 
			
		||||
#include "textflag.h"
 | 
			
		||||
 | 
			
		||||
TEXT libc_fdopendir_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_fdopendir(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_fdopendir_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_fdopendir_trampoline_addr(SB)/8, $libc_fdopendir_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_closedir_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_closedir(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_closedir_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_closedir_trampoline_addr(SB)/8, $libc_closedir_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_readdir_r_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_readdir_r(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_readdir_r_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_readdir_r_trampoline_addr(SB)/8, $libc_readdir_r_trampoline<>(SB)
 | 
			
		||||
							
								
								
									
										32
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
// go run mksyscall.go -tags darwin,arm64,go1.12 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go
 | 
			
		||||
// go run mksyscall.go -tags darwin,arm64 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go
 | 
			
		||||
// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
//go:build darwin && arm64 && go1.12
 | 
			
		||||
// +build darwin,arm64,go1.12
 | 
			
		||||
//go:build darwin && arm64
 | 
			
		||||
// +build darwin,arm64
 | 
			
		||||
 | 
			
		||||
package unix
 | 
			
		||||
 | 
			
		||||
@@ -463,6 +463,32 @@ var libc_munlockall_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func closedir(dir uintptr) (err error) {
 | 
			
		||||
	_, _, e1 := syscall_syscall(libc_closedir_trampoline_addr, uintptr(dir), 0, 0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var libc_closedir_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib"
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
 | 
			
		||||
	r0, _, _ := syscall_syscall(libc_readdir_r_trampoline_addr, uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result)))
 | 
			
		||||
	res = Errno(r0)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var libc_readdir_r_trampoline_addr uintptr
 | 
			
		||||
 | 
			
		||||
//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib"
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func pipe(p *[2]int32) (err error) {
 | 
			
		||||
	_, _, e1 := syscall_rawSyscall(libc_pipe_trampoline_addr, uintptr(unsafe.Pointer(p)), 0, 0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,11 +1,14 @@
 | 
			
		||||
// go run mkasm.go darwin arm64
 | 
			
		||||
// Code generated by the command above; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
//go:build go1.12
 | 
			
		||||
// +build go1.12
 | 
			
		||||
 | 
			
		||||
#include "textflag.h"
 | 
			
		||||
 | 
			
		||||
TEXT libc_fdopendir_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_fdopendir(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_fdopendir_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_fdopendir_trampoline_addr(SB)/8, $libc_fdopendir_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_getgroups(SB)
 | 
			
		||||
 | 
			
		||||
@@ -174,6 +177,18 @@ TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
GLOBL	·libc_munlockall_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_closedir_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_closedir(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_closedir_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_closedir_trampoline_addr(SB)/8, $libc_closedir_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_readdir_r_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_readdir_r(SB)
 | 
			
		||||
 | 
			
		||||
GLOBL	·libc_readdir_r_trampoline_addr(SB), RODATA, $8
 | 
			
		||||
DATA	·libc_readdir_r_trampoline_addr(SB)/8, $libc_readdir_r_trampoline<>(SB)
 | 
			
		||||
 | 
			
		||||
TEXT libc_pipe_trampoline<>(SB),NOSPLIT,$0-0
 | 
			
		||||
	JMP	libc_pipe(SB)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -15,25 +15,19 @@ import (
 | 
			
		||||
//go:cgo_import_dynamic libc_writev writev "libc.so"
 | 
			
		||||
//go:cgo_import_dynamic libc_pwritev pwritev "libc.so"
 | 
			
		||||
//go:cgo_import_dynamic libc_accept4 accept4 "libsocket.so"
 | 
			
		||||
//go:cgo_import_dynamic libc_putmsg putmsg "libc.so"
 | 
			
		||||
//go:cgo_import_dynamic libc_getmsg getmsg "libc.so"
 | 
			
		||||
 | 
			
		||||
//go:linkname procreadv libc_readv
 | 
			
		||||
//go:linkname procpreadv libc_preadv
 | 
			
		||||
//go:linkname procwritev libc_writev
 | 
			
		||||
//go:linkname procpwritev libc_pwritev
 | 
			
		||||
//go:linkname procaccept4 libc_accept4
 | 
			
		||||
//go:linkname procputmsg libc_putmsg
 | 
			
		||||
//go:linkname procgetmsg libc_getmsg
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	procreadv,
 | 
			
		||||
	procpreadv,
 | 
			
		||||
	procwritev,
 | 
			
		||||
	procpwritev,
 | 
			
		||||
	procaccept4,
 | 
			
		||||
	procputmsg,
 | 
			
		||||
	procgetmsg syscallFunc
 | 
			
		||||
	procaccept4 syscallFunc
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
@@ -106,23 +100,3 @@ func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int,
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error) {
 | 
			
		||||
	_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procputmsg)), 4, uintptr(fd), uintptr(unsafe.Pointer(clptr)), uintptr(unsafe.Pointer(dataptr)), uintptr(flags), 0, 0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
		err = e1
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func getmsg(fd int, clptr *strbuf, dataptr *strbuf, flags *int) (err error) {
 | 
			
		||||
	_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetmsg)), 4, uintptr(fd), uintptr(unsafe.Pointer(clptr)), uintptr(unsafe.Pointer(dataptr)), uintptr(unsafe.Pointer(flags)), 0, 0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
		err = e1
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/sys/unix/zsyscall_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/sys/unix/zsyscall_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2151,3 +2151,13 @@ func setitimer(which int, newValue *Itimerval, oldValue *Itimerval) (err error)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | 
			
		||||
 | 
			
		||||
func rtSigprocmask(how int, set *Sigset_t, oldset *Sigset_t, sigsetsize uintptr) (err error) {
 | 
			
		||||
	_, _, e1 := RawSyscall6(SYS_RT_SIGPROCMASK, uintptr(how), uintptr(unsafe.Pointer(set)), uintptr(unsafe.Pointer(oldset)), uintptr(sigsetsize), 0, 0)
 | 
			
		||||
	if e1 != 0 {
 | 
			
		||||
		err = errnoErr(e1)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user