mirror of https://github.com/knative/pkg.git
				
				
				
			Bump golang.org/x/net from 0.30.0 to 0.31.0 (#3113)
* Bump golang.org/x/net from 0.30.0 to 0.31.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.30.0 to 0.31.0. - [Commits](https://github.com/golang/net/compare/v0.30.0...v0.31.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * Run ./hack/update-codegen.sh --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									0a99635c78
								
							
						
					
					
						commit
						7b333a046a
					
				
							
								
								
									
										10
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										10
									
								
								go.mod
								
								
								
								
							|  | @ -24,8 +24,8 @@ require ( | ||||||
| 	go.opencensus.io v0.24.0 | 	go.opencensus.io v0.24.0 | ||||||
| 	go.uber.org/automaxprocs v1.6.0 | 	go.uber.org/automaxprocs v1.6.0 | ||||||
| 	go.uber.org/zap v1.27.0 | 	go.uber.org/zap v1.27.0 | ||||||
| 	golang.org/x/net v0.30.0 | 	golang.org/x/net v0.31.0 | ||||||
| 	golang.org/x/sync v0.8.0 | 	golang.org/x/sync v0.9.0 | ||||||
| 	golang.org/x/tools v0.26.0 | 	golang.org/x/tools v0.26.0 | ||||||
| 	gomodules.xyz/jsonpatch/v2 v2.4.0 | 	gomodules.xyz/jsonpatch/v2 v2.4.0 | ||||||
| 	google.golang.org/grpc v1.67.1 | 	google.golang.org/grpc v1.67.1 | ||||||
|  | @ -79,9 +79,9 @@ require ( | ||||||
| 	golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect | 	golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect | ||||||
| 	golang.org/x/mod v0.21.0 // indirect | 	golang.org/x/mod v0.21.0 // indirect | ||||||
| 	golang.org/x/oauth2 v0.22.0 // indirect | 	golang.org/x/oauth2 v0.22.0 // indirect | ||||||
| 	golang.org/x/sys v0.26.0 // indirect | 	golang.org/x/sys v0.27.0 // indirect | ||||||
| 	golang.org/x/term v0.25.0 // indirect | 	golang.org/x/term v0.26.0 // indirect | ||||||
| 	golang.org/x/text v0.19.0 // indirect | 	golang.org/x/text v0.20.0 // indirect | ||||||
| 	golang.org/x/time v0.6.0 // indirect | 	golang.org/x/time v0.6.0 // indirect | ||||||
| 	google.golang.org/api v0.183.0 // indirect | 	google.golang.org/api v0.183.0 // indirect | ||||||
| 	google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect | 	google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										20
									
								
								go.sum
								
								
								
								
							|  | @ -439,8 +439,8 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY | ||||||
| golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||||
| golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= | golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= | ||||||
| golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= | golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= | ||||||
| golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= | golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= | ||||||
| golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= | golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= | ||||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||||
| golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||||
| golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||||
|  | @ -461,8 +461,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ | ||||||
| golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= | golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= | ||||||
| golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | ||||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
|  | @ -505,12 +505,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc | ||||||
| golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= | golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= | ||||||
| golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||||
| golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= | golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= | ||||||
| golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= | golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= | ||||||
| golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
| golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
|  | @ -518,8 +518,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | ||||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
| golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||||||
| golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= | golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= | ||||||
| golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= | golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= | ||||||
| golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||||
| golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||||
| golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||||
|  |  | ||||||
|  | @ -8,8 +8,8 @@ package http2 | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"crypto/tls" |  | ||||||
| 	"errors" | 	"errors" | ||||||
|  | 	"net" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"sync" | 	"sync" | ||||||
| ) | ) | ||||||
|  | @ -158,7 +158,7 @@ func (c *dialCall) dial(ctx context.Context, addr string) { | ||||||
| // This code decides which ones live or die.
 | // This code decides which ones live or die.
 | ||||||
| // The return value used is whether c was used.
 | // The return value used is whether c was used.
 | ||||||
| // c is never closed.
 | // c is never closed.
 | ||||||
| func (p *clientConnPool) addConnIfNeeded(key string, t *Transport, c *tls.Conn) (used bool, err error) { | func (p *clientConnPool) addConnIfNeeded(key string, t *Transport, c net.Conn) (used bool, err error) { | ||||||
| 	p.mu.Lock() | 	p.mu.Lock() | ||||||
| 	for _, cc := range p.conns[key] { | 	for _, cc := range p.conns[key] { | ||||||
| 		if cc.CanTakeNewRequest() { | 		if cc.CanTakeNewRequest() { | ||||||
|  | @ -194,8 +194,8 @@ type addConnCall struct { | ||||||
| 	err  error | 	err  error | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *addConnCall) run(t *Transport, key string, tc *tls.Conn) { | func (c *addConnCall) run(t *Transport, key string, nc net.Conn) { | ||||||
| 	cc, err := t.NewClientConn(tc) | 	cc, err := t.NewClientConn(nc) | ||||||
| 
 | 
 | ||||||
| 	p := c.p | 	p := c.p | ||||||
| 	p.mu.Lock() | 	p.mu.Lock() | ||||||
|  |  | ||||||
|  | @ -306,7 +306,7 @@ func ConfigureServer(s *http.Server, conf *Server) error { | ||||||
| 	if s.TLSNextProto == nil { | 	if s.TLSNextProto == nil { | ||||||
| 		s.TLSNextProto = map[string]func(*http.Server, *tls.Conn, http.Handler){} | 		s.TLSNextProto = map[string]func(*http.Server, *tls.Conn, http.Handler){} | ||||||
| 	} | 	} | ||||||
| 	protoHandler := func(hs *http.Server, c *tls.Conn, h http.Handler) { | 	protoHandler := func(hs *http.Server, c net.Conn, h http.Handler, sawClientPreface bool) { | ||||||
| 		if testHookOnConn != nil { | 		if testHookOnConn != nil { | ||||||
| 			testHookOnConn() | 			testHookOnConn() | ||||||
| 		} | 		} | ||||||
|  | @ -326,9 +326,28 @@ func ConfigureServer(s *http.Server, conf *Server) error { | ||||||
| 			Context:          ctx, | 			Context:          ctx, | ||||||
| 			Handler:          h, | 			Handler:          h, | ||||||
| 			BaseConfig:       hs, | 			BaseConfig:       hs, | ||||||
|  | 			SawClientPreface: sawClientPreface, | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
| 	s.TLSNextProto[NextProtoTLS] = protoHandler | 	s.TLSNextProto[NextProtoTLS] = func(hs *http.Server, c *tls.Conn, h http.Handler) { | ||||||
|  | 		protoHandler(hs, c, h, false) | ||||||
|  | 	} | ||||||
|  | 	// The "unencrypted_http2" TLSNextProto key is used to pass off non-TLS HTTP/2 conns.
 | ||||||
|  | 	//
 | ||||||
|  | 	// A connection passed in this method has already had the HTTP/2 preface read from it.
 | ||||||
|  | 	s.TLSNextProto[nextProtoUnencryptedHTTP2] = func(hs *http.Server, c *tls.Conn, h http.Handler) { | ||||||
|  | 		nc, err := unencryptedNetConnFromTLSConn(c) | ||||||
|  | 		if err != nil { | ||||||
|  | 			if lg := hs.ErrorLog; lg != nil { | ||||||
|  | 				lg.Print(err) | ||||||
|  | 			} else { | ||||||
|  | 				log.Print(err) | ||||||
|  | 			} | ||||||
|  | 			go c.Close() | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		protoHandler(hs, nc, h, true) | ||||||
|  | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -2880,6 +2899,11 @@ func (w *responseWriter) SetWriteDeadline(deadline time.Time) error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (w *responseWriter) EnableFullDuplex() error { | ||||||
|  | 	// We always support full duplex responses, so this is a no-op.
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (w *responseWriter) Flush() { | func (w *responseWriter) Flush() { | ||||||
| 	w.FlushError() | 	w.FlushError() | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -202,6 +202,20 @@ func (t *Transport) markNewGoroutine() { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (t *Transport) now() time.Time { | ||||||
|  | 	if t != nil && t.transportTestHooks != nil { | ||||||
|  | 		return t.transportTestHooks.group.Now() | ||||||
|  | 	} | ||||||
|  | 	return time.Now() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (t *Transport) timeSince(when time.Time) time.Duration { | ||||||
|  | 	if t != nil && t.transportTestHooks != nil { | ||||||
|  | 		return t.now().Sub(when) | ||||||
|  | 	} | ||||||
|  | 	return time.Since(when) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // newTimer creates a new time.Timer, or a synthetic timer in tests.
 | // newTimer creates a new time.Timer, or a synthetic timer in tests.
 | ||||||
| func (t *Transport) newTimer(d time.Duration) timer { | func (t *Transport) newTimer(d time.Duration) timer { | ||||||
| 	if t.transportTestHooks != nil { | 	if t.transportTestHooks != nil { | ||||||
|  | @ -281,8 +295,8 @@ func configureTransports(t1 *http.Transport) (*Transport, error) { | ||||||
| 	if !strSliceContains(t1.TLSClientConfig.NextProtos, "http/1.1") { | 	if !strSliceContains(t1.TLSClientConfig.NextProtos, "http/1.1") { | ||||||
| 		t1.TLSClientConfig.NextProtos = append(t1.TLSClientConfig.NextProtos, "http/1.1") | 		t1.TLSClientConfig.NextProtos = append(t1.TLSClientConfig.NextProtos, "http/1.1") | ||||||
| 	} | 	} | ||||||
| 	upgradeFn := func(authority string, c *tls.Conn) http.RoundTripper { | 	upgradeFn := func(scheme, authority string, c net.Conn) http.RoundTripper { | ||||||
| 		addr := authorityAddr("https", authority) | 		addr := authorityAddr(scheme, authority) | ||||||
| 		if used, err := connPool.addConnIfNeeded(addr, t2, c); err != nil { | 		if used, err := connPool.addConnIfNeeded(addr, t2, c); err != nil { | ||||||
| 			go c.Close() | 			go c.Close() | ||||||
| 			return erringRoundTripper{err} | 			return erringRoundTripper{err} | ||||||
|  | @ -293,18 +307,37 @@ func configureTransports(t1 *http.Transport) (*Transport, error) { | ||||||
| 			// was unknown)
 | 			// was unknown)
 | ||||||
| 			go c.Close() | 			go c.Close() | ||||||
| 		} | 		} | ||||||
|  | 		if scheme == "http" { | ||||||
|  | 			return (*unencryptedTransport)(t2) | ||||||
|  | 		} | ||||||
| 		return t2 | 		return t2 | ||||||
| 	} | 	} | ||||||
| 	if m := t1.TLSNextProto; len(m) == 0 { | 	if t1.TLSNextProto == nil { | ||||||
| 		t1.TLSNextProto = map[string]func(string, *tls.Conn) http.RoundTripper{ | 		t1.TLSNextProto = make(map[string]func(string, *tls.Conn) http.RoundTripper) | ||||||
| 			"h2": upgradeFn, |  | ||||||
| 	} | 	} | ||||||
| 	} else { | 	t1.TLSNextProto[NextProtoTLS] = func(authority string, c *tls.Conn) http.RoundTripper { | ||||||
| 		m["h2"] = upgradeFn | 		return upgradeFn("https", authority, c) | ||||||
|  | 	} | ||||||
|  | 	// The "unencrypted_http2" TLSNextProto key is used to pass off non-TLS HTTP/2 conns.
 | ||||||
|  | 	t1.TLSNextProto[nextProtoUnencryptedHTTP2] = func(authority string, c *tls.Conn) http.RoundTripper { | ||||||
|  | 		nc, err := unencryptedNetConnFromTLSConn(c) | ||||||
|  | 		if err != nil { | ||||||
|  | 			go c.Close() | ||||||
|  | 			return erringRoundTripper{err} | ||||||
|  | 		} | ||||||
|  | 		return upgradeFn("http", authority, nc) | ||||||
| 	} | 	} | ||||||
| 	return t2, nil | 	return t2, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // unencryptedTransport is a Transport with a RoundTrip method that
 | ||||||
|  | // always permits http:// URLs.
 | ||||||
|  | type unencryptedTransport Transport | ||||||
|  | 
 | ||||||
|  | func (t *unencryptedTransport) RoundTrip(req *http.Request) (*http.Response, error) { | ||||||
|  | 	return (*Transport)(t).RoundTripOpt(req, RoundTripOpt{allowHTTP: true}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (t *Transport) connPool() ClientConnPool { | func (t *Transport) connPool() ClientConnPool { | ||||||
| 	t.connPoolOnce.Do(t.initConnPool) | 	t.connPoolOnce.Do(t.initConnPool) | ||||||
| 	return t.connPoolOrDef | 	return t.connPoolOrDef | ||||||
|  | @ -324,7 +357,7 @@ type ClientConn struct { | ||||||
| 	t             *Transport | 	t             *Transport | ||||||
| 	tconn         net.Conn             // usually *tls.Conn, except specialized impls
 | 	tconn         net.Conn             // usually *tls.Conn, except specialized impls
 | ||||||
| 	tlsState      *tls.ConnectionState // nil only for specialized impls
 | 	tlsState      *tls.ConnectionState // nil only for specialized impls
 | ||||||
| 	reused        uint32               // whether conn is being reused; atomic
 | 	atomicReused  uint32               // whether conn is being reused; atomic
 | ||||||
| 	singleUse     bool                 // whether being used for a single http.Request
 | 	singleUse     bool                 // whether being used for a single http.Request
 | ||||||
| 	getConnCalled bool                 // used by clientConnPool
 | 	getConnCalled bool                 // used by clientConnPool
 | ||||||
| 
 | 
 | ||||||
|  | @ -364,6 +397,14 @@ type ClientConn struct { | ||||||
| 	readIdleTimeout             time.Duration | 	readIdleTimeout             time.Duration | ||||||
| 	pingTimeout                 time.Duration | 	pingTimeout                 time.Duration | ||||||
| 
 | 
 | ||||||
|  | 	// pendingResets is the number of RST_STREAM frames we have sent to the peer,
 | ||||||
|  | 	// without confirming that the peer has received them. When we send a RST_STREAM,
 | ||||||
|  | 	// we bundle it with a PING frame, unless a PING is already in flight. We count
 | ||||||
|  | 	// the reset stream against the connection's concurrency limit until we get
 | ||||||
|  | 	// a PING response. This limits the number of requests we'll try to send to a
 | ||||||
|  | 	// completely unresponsive connection.
 | ||||||
|  | 	pendingResets int | ||||||
|  | 
 | ||||||
| 	// reqHeaderMu is a 1-element semaphore channel controlling access to sending new requests.
 | 	// reqHeaderMu is a 1-element semaphore channel controlling access to sending new requests.
 | ||||||
| 	// Write to reqHeaderMu to lock it, read from it to unlock.
 | 	// Write to reqHeaderMu to lock it, read from it to unlock.
 | ||||||
| 	// Lock reqmu BEFORE mu or wmu.
 | 	// Lock reqmu BEFORE mu or wmu.
 | ||||||
|  | @ -423,9 +464,9 @@ type clientStream struct { | ||||||
| 	firstByte       bool  // got the first response byte
 | 	firstByte       bool  // got the first response byte
 | ||||||
| 	pastHeaders     bool  // got first MetaHeadersFrame (actual headers)
 | 	pastHeaders     bool  // got first MetaHeadersFrame (actual headers)
 | ||||||
| 	pastTrailers    bool  // got optional second MetaHeadersFrame (trailers)
 | 	pastTrailers    bool  // got optional second MetaHeadersFrame (trailers)
 | ||||||
| 	num1xx       uint8 // number of 1xx responses seen
 |  | ||||||
| 	readClosed      bool  // peer sent an END_STREAM flag
 | 	readClosed      bool  // peer sent an END_STREAM flag
 | ||||||
| 	readAborted     bool  // read loop reset the stream
 | 	readAborted     bool  // read loop reset the stream
 | ||||||
|  | 	totalHeaderSize int64 // total size of 1xx headers seen
 | ||||||
| 
 | 
 | ||||||
| 	trailer    http.Header  // accumulated trailers
 | 	trailer    http.Header  // accumulated trailers
 | ||||||
| 	resTrailer *http.Header // client's Response.Trailer
 | 	resTrailer *http.Header // client's Response.Trailer
 | ||||||
|  | @ -530,6 +571,8 @@ type RoundTripOpt struct { | ||||||
| 	// no cached connection is available, RoundTripOpt
 | 	// no cached connection is available, RoundTripOpt
 | ||||||
| 	// will return ErrNoCachedConn.
 | 	// will return ErrNoCachedConn.
 | ||||||
| 	OnlyCachedConn bool | 	OnlyCachedConn bool | ||||||
|  | 
 | ||||||
|  | 	allowHTTP bool // allow http:// URLs
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { | func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { | ||||||
|  | @ -562,7 +605,14 @@ func authorityAddr(scheme string, authority string) (addr string) { | ||||||
| 
 | 
 | ||||||
| // RoundTripOpt is like RoundTrip, but takes options.
 | // RoundTripOpt is like RoundTrip, but takes options.
 | ||||||
| func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) { | func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) { | ||||||
| 	if !(req.URL.Scheme == "https" || (req.URL.Scheme == "http" && t.AllowHTTP)) { | 	switch req.URL.Scheme { | ||||||
|  | 	case "https": | ||||||
|  | 		// Always okay.
 | ||||||
|  | 	case "http": | ||||||
|  | 		if !t.AllowHTTP && !opt.allowHTTP { | ||||||
|  | 			return nil, errors.New("http2: unencrypted HTTP/2 not enabled") | ||||||
|  | 		} | ||||||
|  | 	default: | ||||||
| 		return nil, errors.New("http2: unsupported scheme") | 		return nil, errors.New("http2: unsupported scheme") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -573,7 +623,7 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res | ||||||
| 			t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err) | 			t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err) | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
| 		reused := !atomic.CompareAndSwapUint32(&cc.reused, 0, 1) | 		reused := !atomic.CompareAndSwapUint32(&cc.atomicReused, 0, 1) | ||||||
| 		traceGotConn(req, cc, reused) | 		traceGotConn(req, cc, reused) | ||||||
| 		res, err := cc.RoundTrip(req) | 		res, err := cc.RoundTrip(req) | ||||||
| 		if err != nil && retry <= 6 { | 		if err != nil && retry <= 6 { | ||||||
|  | @ -598,6 +648,22 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 		if err == errClientConnNotEstablished { | ||||||
|  | 			// This ClientConn was created recently,
 | ||||||
|  | 			// this is the first request to use it,
 | ||||||
|  | 			// and the connection is closed and not usable.
 | ||||||
|  | 			//
 | ||||||
|  | 			// In this state, cc.idleTimer will remove the conn from the pool
 | ||||||
|  | 			// when it fires. Stop the timer and remove it here so future requests
 | ||||||
|  | 			// won't try to use this connection.
 | ||||||
|  | 			//
 | ||||||
|  | 			// If the timer has already fired and we're racing it, the redundant
 | ||||||
|  | 			// call to MarkDead is harmless.
 | ||||||
|  | 			if cc.idleTimer != nil { | ||||||
|  | 				cc.idleTimer.Stop() | ||||||
|  | 			} | ||||||
|  | 			t.connPool().MarkDead(cc) | ||||||
|  | 		} | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			t.vlogf("RoundTrip failure: %v", err) | 			t.vlogf("RoundTrip failure: %v", err) | ||||||
| 			return nil, err | 			return nil, err | ||||||
|  | @ -618,6 +684,7 @@ func (t *Transport) CloseIdleConnections() { | ||||||
| var ( | var ( | ||||||
| 	errClientConnClosed         = errors.New("http2: client conn is closed") | 	errClientConnClosed         = errors.New("http2: client conn is closed") | ||||||
| 	errClientConnUnusable       = errors.New("http2: client conn not usable") | 	errClientConnUnusable       = errors.New("http2: client conn not usable") | ||||||
|  | 	errClientConnNotEstablished = errors.New("http2: client conn could not be established") | ||||||
| 	errClientConnGotGoAway      = errors.New("http2: Transport received Server's graceful shutdown GOAWAY") | 	errClientConnGotGoAway      = errors.New("http2: Transport received Server's graceful shutdown GOAWAY") | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -757,6 +824,7 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro | ||||||
| 		pingTimeout:                 conf.PingTimeout, | 		pingTimeout:                 conf.PingTimeout, | ||||||
| 		pings:                       make(map[[8]byte]chan struct{}), | 		pings:                       make(map[[8]byte]chan struct{}), | ||||||
| 		reqHeaderMu:                 make(chan struct{}, 1), | 		reqHeaderMu:                 make(chan struct{}, 1), | ||||||
|  | 		lastActive:                  t.now(), | ||||||
| 	} | 	} | ||||||
| 	var group synctestGroupInterface | 	var group synctestGroupInterface | ||||||
| 	if t.transportTestHooks != nil { | 	if t.transportTestHooks != nil { | ||||||
|  | @ -960,7 +1028,7 @@ func (cc *ClientConn) State() ClientConnState { | ||||||
| 	return ClientConnState{ | 	return ClientConnState{ | ||||||
| 		Closed:               cc.closed, | 		Closed:               cc.closed, | ||||||
| 		Closing:              cc.closing || cc.singleUse || cc.doNotReuse || cc.goAway != nil, | 		Closing:              cc.closing || cc.singleUse || cc.doNotReuse || cc.goAway != nil, | ||||||
| 		StreamsActive:        len(cc.streams), | 		StreamsActive:        len(cc.streams) + cc.pendingResets, | ||||||
| 		StreamsReserved:      cc.streamsReserved, | 		StreamsReserved:      cc.streamsReserved, | ||||||
| 		StreamsPending:       cc.pendingRequests, | 		StreamsPending:       cc.pendingRequests, | ||||||
| 		LastIdle:             cc.lastIdle, | 		LastIdle:             cc.lastIdle, | ||||||
|  | @ -992,16 +1060,38 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) { | ||||||
| 		// writing it.
 | 		// writing it.
 | ||||||
| 		maxConcurrentOkay = true | 		maxConcurrentOkay = true | ||||||
| 	} else { | 	} else { | ||||||
| 		maxConcurrentOkay = int64(len(cc.streams)+cc.streamsReserved+1) <= int64(cc.maxConcurrentStreams) | 		// We can take a new request if the total of
 | ||||||
|  | 		//   - active streams;
 | ||||||
|  | 		//   - reservation slots for new streams; and
 | ||||||
|  | 		//   - streams for which we have sent a RST_STREAM and a PING,
 | ||||||
|  | 		//     but received no subsequent frame
 | ||||||
|  | 		// is less than the concurrency limit.
 | ||||||
|  | 		maxConcurrentOkay = cc.currentRequestCountLocked() < int(cc.maxConcurrentStreams) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	st.canTakeNewRequest = cc.goAway == nil && !cc.closed && !cc.closing && maxConcurrentOkay && | 	st.canTakeNewRequest = cc.goAway == nil && !cc.closed && !cc.closing && maxConcurrentOkay && | ||||||
| 		!cc.doNotReuse && | 		!cc.doNotReuse && | ||||||
| 		int64(cc.nextStreamID)+2*int64(cc.pendingRequests) < math.MaxInt32 && | 		int64(cc.nextStreamID)+2*int64(cc.pendingRequests) < math.MaxInt32 && | ||||||
| 		!cc.tooIdleLocked() | 		!cc.tooIdleLocked() | ||||||
|  | 
 | ||||||
|  | 	// If this connection has never been used for a request and is closed,
 | ||||||
|  | 	// then let it take a request (which will fail).
 | ||||||
|  | 	//
 | ||||||
|  | 	// This avoids a situation where an error early in a connection's lifetime
 | ||||||
|  | 	// goes unreported.
 | ||||||
|  | 	if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed { | ||||||
|  | 		st.canTakeNewRequest = true | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // currentRequestCountLocked reports the number of concurrency slots currently in use,
 | ||||||
|  | // including active streams, reserved slots, and reset streams waiting for acknowledgement.
 | ||||||
|  | func (cc *ClientConn) currentRequestCountLocked() int { | ||||||
|  | 	return len(cc.streams) + cc.streamsReserved + cc.pendingResets | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (cc *ClientConn) canTakeNewRequestLocked() bool { | func (cc *ClientConn) canTakeNewRequestLocked() bool { | ||||||
| 	st := cc.idleStateLocked() | 	st := cc.idleStateLocked() | ||||||
| 	return st.canTakeNewRequest | 	return st.canTakeNewRequest | ||||||
|  | @ -1014,7 +1104,7 @@ func (cc *ClientConn) tooIdleLocked() bool { | ||||||
| 	// times are compared based on their wall time. We don't want
 | 	// times are compared based on their wall time. We don't want
 | ||||||
| 	// to reuse a connection that's been sitting idle during
 | 	// to reuse a connection that's been sitting idle during
 | ||||||
| 	// VM/laptop suspend if monotonic time was also frozen.
 | 	// VM/laptop suspend if monotonic time was also frozen.
 | ||||||
| 	return cc.idleTimeout != 0 && !cc.lastIdle.IsZero() && time.Since(cc.lastIdle.Round(0)) > cc.idleTimeout | 	return cc.idleTimeout != 0 && !cc.lastIdle.IsZero() && cc.t.timeSince(cc.lastIdle.Round(0)) > cc.idleTimeout | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // onIdleTimeout is called from a time.AfterFunc goroutine. It will
 | // onIdleTimeout is called from a time.AfterFunc goroutine. It will
 | ||||||
|  | @ -1578,6 +1668,7 @@ func (cs *clientStream) cleanupWriteRequest(err error) { | ||||||
| 		cs.reqBodyClosed = make(chan struct{}) | 		cs.reqBodyClosed = make(chan struct{}) | ||||||
| 	} | 	} | ||||||
| 	bodyClosed := cs.reqBodyClosed | 	bodyClosed := cs.reqBodyClosed | ||||||
|  | 	closeOnIdle := cc.singleUse || cc.doNotReuse || cc.t.disableKeepAlives() || cc.goAway != nil | ||||||
| 	cc.mu.Unlock() | 	cc.mu.Unlock() | ||||||
| 	if mustCloseBody { | 	if mustCloseBody { | ||||||
| 		cs.reqBody.Close() | 		cs.reqBody.Close() | ||||||
|  | @ -1602,16 +1693,40 @@ func (cs *clientStream) cleanupWriteRequest(err error) { | ||||||
| 		if cs.sentHeaders { | 		if cs.sentHeaders { | ||||||
| 			if se, ok := err.(StreamError); ok { | 			if se, ok := err.(StreamError); ok { | ||||||
| 				if se.Cause != errFromPeer { | 				if se.Cause != errFromPeer { | ||||||
| 					cc.writeStreamReset(cs.ID, se.Code, err) | 					cc.writeStreamReset(cs.ID, se.Code, false, err) | ||||||
| 				} | 				} | ||||||
| 			} else { | 			} else { | ||||||
| 				cc.writeStreamReset(cs.ID, ErrCodeCancel, err) | 				// We're cancelling an in-flight request.
 | ||||||
|  | 				//
 | ||||||
|  | 				// This could be due to the server becoming unresponsive.
 | ||||||
|  | 				// To avoid sending too many requests on a dead connection,
 | ||||||
|  | 				// we let the request continue to consume a concurrency slot
 | ||||||
|  | 				// until we can confirm the server is still responding.
 | ||||||
|  | 				// We do this by sending a PING frame along with the RST_STREAM
 | ||||||
|  | 				// (unless a ping is already in flight).
 | ||||||
|  | 				//
 | ||||||
|  | 				// For simplicity, we don't bother tracking the PING payload:
 | ||||||
|  | 				// We reset cc.pendingResets any time we receive a PING ACK.
 | ||||||
|  | 				//
 | ||||||
|  | 				// We skip this if the conn is going to be closed on idle,
 | ||||||
|  | 				// because it's short lived and will probably be closed before
 | ||||||
|  | 				// we get the ping response.
 | ||||||
|  | 				ping := false | ||||||
|  | 				if !closeOnIdle { | ||||||
|  | 					cc.mu.Lock() | ||||||
|  | 					if cc.pendingResets == 0 { | ||||||
|  | 						ping = true | ||||||
|  | 					} | ||||||
|  | 					cc.pendingResets++ | ||||||
|  | 					cc.mu.Unlock() | ||||||
|  | 				} | ||||||
|  | 				cc.writeStreamReset(cs.ID, ErrCodeCancel, ping, err) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		cs.bufPipe.CloseWithError(err) // no-op if already closed
 | 		cs.bufPipe.CloseWithError(err) // no-op if already closed
 | ||||||
| 	} else { | 	} else { | ||||||
| 		if cs.sentHeaders && !cs.sentEndStream { | 		if cs.sentHeaders && !cs.sentEndStream { | ||||||
| 			cc.writeStreamReset(cs.ID, ErrCodeNo, nil) | 			cc.writeStreamReset(cs.ID, ErrCodeNo, false, nil) | ||||||
| 		} | 		} | ||||||
| 		cs.bufPipe.CloseWithError(errRequestCanceled) | 		cs.bufPipe.CloseWithError(errRequestCanceled) | ||||||
| 	} | 	} | ||||||
|  | @ -1633,12 +1748,17 @@ func (cs *clientStream) cleanupWriteRequest(err error) { | ||||||
| // Must hold cc.mu.
 | // Must hold cc.mu.
 | ||||||
| func (cc *ClientConn) awaitOpenSlotForStreamLocked(cs *clientStream) error { | func (cc *ClientConn) awaitOpenSlotForStreamLocked(cs *clientStream) error { | ||||||
| 	for { | 	for { | ||||||
| 		cc.lastActive = time.Now() | 		if cc.closed && cc.nextStreamID == 1 && cc.streamsReserved == 0 { | ||||||
|  | 			// This is the very first request sent to this connection.
 | ||||||
|  | 			// Return a fatal error which aborts the retry loop.
 | ||||||
|  | 			return errClientConnNotEstablished | ||||||
|  | 		} | ||||||
|  | 		cc.lastActive = cc.t.now() | ||||||
| 		if cc.closed || !cc.canTakeNewRequestLocked() { | 		if cc.closed || !cc.canTakeNewRequestLocked() { | ||||||
| 			return errClientConnUnusable | 			return errClientConnUnusable | ||||||
| 		} | 		} | ||||||
| 		cc.lastIdle = time.Time{} | 		cc.lastIdle = time.Time{} | ||||||
| 		if int64(len(cc.streams)) < int64(cc.maxConcurrentStreams) { | 		if cc.currentRequestCountLocked() < int(cc.maxConcurrentStreams) { | ||||||
| 			return nil | 			return nil | ||||||
| 		} | 		} | ||||||
| 		cc.pendingRequests++ | 		cc.pendingRequests++ | ||||||
|  | @ -2180,10 +2300,10 @@ func (cc *ClientConn) forgetStreamID(id uint32) { | ||||||
| 	if len(cc.streams) != slen-1 { | 	if len(cc.streams) != slen-1 { | ||||||
| 		panic("forgetting unknown stream id") | 		panic("forgetting unknown stream id") | ||||||
| 	} | 	} | ||||||
| 	cc.lastActive = time.Now() | 	cc.lastActive = cc.t.now() | ||||||
| 	if len(cc.streams) == 0 && cc.idleTimer != nil { | 	if len(cc.streams) == 0 && cc.idleTimer != nil { | ||||||
| 		cc.idleTimer.Reset(cc.idleTimeout) | 		cc.idleTimer.Reset(cc.idleTimeout) | ||||||
| 		cc.lastIdle = time.Now() | 		cc.lastIdle = cc.t.now() | ||||||
| 	} | 	} | ||||||
| 	// Wake up writeRequestBody via clientStream.awaitFlowControl and
 | 	// Wake up writeRequestBody via clientStream.awaitFlowControl and
 | ||||||
| 	// wake up RoundTrip if there is a pending request.
 | 	// wake up RoundTrip if there is a pending request.
 | ||||||
|  | @ -2243,7 +2363,6 @@ func isEOFOrNetReadError(err error) bool { | ||||||
| 
 | 
 | ||||||
| func (rl *clientConnReadLoop) cleanup() { | func (rl *clientConnReadLoop) cleanup() { | ||||||
| 	cc := rl.cc | 	cc := rl.cc | ||||||
| 	cc.t.connPool().MarkDead(cc) |  | ||||||
| 	defer cc.closeConn() | 	defer cc.closeConn() | ||||||
| 	defer close(cc.readerDone) | 	defer close(cc.readerDone) | ||||||
| 
 | 
 | ||||||
|  | @ -2267,6 +2386,24 @@ func (rl *clientConnReadLoop) cleanup() { | ||||||
| 	} | 	} | ||||||
| 	cc.closed = true | 	cc.closed = true | ||||||
| 
 | 
 | ||||||
|  | 	// If the connection has never been used, and has been open for only a short time,
 | ||||||
|  | 	// leave it in the connection pool for a little while.
 | ||||||
|  | 	//
 | ||||||
|  | 	// This avoids a situation where new connections are constantly created,
 | ||||||
|  | 	// added to the pool, fail, and are removed from the pool, without any error
 | ||||||
|  | 	// being surfaced to the user.
 | ||||||
|  | 	const unusedWaitTime = 5 * time.Second | ||||||
|  | 	idleTime := cc.t.now().Sub(cc.lastActive) | ||||||
|  | 	if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime { | ||||||
|  | 		cc.idleTimer = cc.t.afterFunc(unusedWaitTime-idleTime, func() { | ||||||
|  | 			cc.t.connPool().MarkDead(cc) | ||||||
|  | 		}) | ||||||
|  | 	} else { | ||||||
|  | 		cc.mu.Unlock() // avoid any deadlocks in MarkDead
 | ||||||
|  | 		cc.t.connPool().MarkDead(cc) | ||||||
|  | 		cc.mu.Lock() | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for _, cs := range cc.streams { | 	for _, cs := range cc.streams { | ||||||
| 		select { | 		select { | ||||||
| 		case <-cs.peerClosed: | 		case <-cs.peerClosed: | ||||||
|  | @ -2494,15 +2631,34 @@ func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFra | ||||||
| 		if f.StreamEnded() { | 		if f.StreamEnded() { | ||||||
| 			return nil, errors.New("1xx informational response with END_STREAM flag") | 			return nil, errors.New("1xx informational response with END_STREAM flag") | ||||||
| 		} | 		} | ||||||
| 		cs.num1xx++ |  | ||||||
| 		const max1xxResponses = 5 // arbitrary bound on number of informational responses, same as net/http
 |  | ||||||
| 		if cs.num1xx > max1xxResponses { |  | ||||||
| 			return nil, errors.New("http2: too many 1xx informational responses") |  | ||||||
| 		} |  | ||||||
| 		if fn := cs.get1xxTraceFunc(); fn != nil { | 		if fn := cs.get1xxTraceFunc(); fn != nil { | ||||||
|  | 			// If the 1xx response is being delivered to the user,
 | ||||||
|  | 			// then they're responsible for limiting the number
 | ||||||
|  | 			// of responses.
 | ||||||
| 			if err := fn(statusCode, textproto.MIMEHeader(header)); err != nil { | 			if err := fn(statusCode, textproto.MIMEHeader(header)); err != nil { | ||||||
| 				return nil, err | 				return nil, err | ||||||
| 			} | 			} | ||||||
|  | 		} else { | ||||||
|  | 			// If the user didn't examine the 1xx response, then we
 | ||||||
|  | 			// limit the size of all 1xx headers.
 | ||||||
|  | 			//
 | ||||||
|  | 			// This differs a bit from the HTTP/1 implementation, which
 | ||||||
|  | 			// limits the size of all 1xx headers plus the final response.
 | ||||||
|  | 			// Use the larger limit of MaxHeaderListSize and
 | ||||||
|  | 			// net/http.Transport.MaxResponseHeaderBytes.
 | ||||||
|  | 			limit := int64(cs.cc.t.maxHeaderListSize()) | ||||||
|  | 			if t1 := cs.cc.t.t1; t1 != nil && t1.MaxResponseHeaderBytes > limit { | ||||||
|  | 				limit = t1.MaxResponseHeaderBytes | ||||||
|  | 			} | ||||||
|  | 			for _, h := range f.Fields { | ||||||
|  | 				cs.totalHeaderSize += int64(h.Size()) | ||||||
|  | 			} | ||||||
|  | 			if cs.totalHeaderSize > limit { | ||||||
|  | 				if VerboseLogs { | ||||||
|  | 					log.Printf("http2: 1xx informational responses too large") | ||||||
|  | 				} | ||||||
|  | 				return nil, errors.New("header list too large") | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 		if statusCode == 100 { | 		if statusCode == 100 { | ||||||
| 			traceGot100Continue(cs.trace) | 			traceGot100Continue(cs.trace) | ||||||
|  | @ -3046,6 +3202,11 @@ func (rl *clientConnReadLoop) processPing(f *PingFrame) error { | ||||||
| 			close(c) | 			close(c) | ||||||
| 			delete(cc.pings, f.Data) | 			delete(cc.pings, f.Data) | ||||||
| 		} | 		} | ||||||
|  | 		if cc.pendingResets > 0 { | ||||||
|  | 			// See clientStream.cleanupWriteRequest.
 | ||||||
|  | 			cc.pendingResets = 0 | ||||||
|  | 			cc.cond.Broadcast() | ||||||
|  | 		} | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 	cc := rl.cc | 	cc := rl.cc | ||||||
|  | @ -3068,13 +3229,20 @@ func (rl *clientConnReadLoop) processPushPromise(f *PushPromiseFrame) error { | ||||||
| 	return ConnectionError(ErrCodeProtocol) | 	return ConnectionError(ErrCodeProtocol) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (cc *ClientConn) writeStreamReset(streamID uint32, code ErrCode, err error) { | // writeStreamReset sends a RST_STREAM frame.
 | ||||||
|  | // When ping is true, it also sends a PING frame with a random payload.
 | ||||||
|  | func (cc *ClientConn) writeStreamReset(streamID uint32, code ErrCode, ping bool, err error) { | ||||||
| 	// TODO: map err to more interesting error codes, once the
 | 	// TODO: map err to more interesting error codes, once the
 | ||||||
| 	// HTTP community comes up with some. But currently for
 | 	// HTTP community comes up with some. But currently for
 | ||||||
| 	// RST_STREAM there's no equivalent to GOAWAY frame's debug
 | 	// RST_STREAM there's no equivalent to GOAWAY frame's debug
 | ||||||
| 	// data, and the error codes are all pretty vague ("cancel").
 | 	// data, and the error codes are all pretty vague ("cancel").
 | ||||||
| 	cc.wmu.Lock() | 	cc.wmu.Lock() | ||||||
| 	cc.fr.WriteRSTStream(streamID, code) | 	cc.fr.WriteRSTStream(streamID, code) | ||||||
|  | 	if ping { | ||||||
|  | 		var payload [8]byte | ||||||
|  | 		rand.Read(payload[:]) | ||||||
|  | 		cc.fr.WritePing(false, payload) | ||||||
|  | 	} | ||||||
| 	cc.bw.Flush() | 	cc.bw.Flush() | ||||||
| 	cc.wmu.Unlock() | 	cc.wmu.Unlock() | ||||||
| } | } | ||||||
|  | @ -3228,7 +3396,7 @@ func traceGotConn(req *http.Request, cc *ClientConn, reused bool) { | ||||||
| 	cc.mu.Lock() | 	cc.mu.Lock() | ||||||
| 	ci.WasIdle = len(cc.streams) == 0 && reused | 	ci.WasIdle = len(cc.streams) == 0 && reused | ||||||
| 	if ci.WasIdle && !cc.lastActive.IsZero() { | 	if ci.WasIdle && !cc.lastActive.IsZero() { | ||||||
| 		ci.IdleTime = time.Since(cc.lastActive) | 		ci.IdleTime = cc.t.timeSince(cc.lastActive) | ||||||
| 	} | 	} | ||||||
| 	cc.mu.Unlock() | 	cc.mu.Unlock() | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | // Copyright 2024 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | package http2 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"crypto/tls" | ||||||
|  | 	"errors" | ||||||
|  | 	"net" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const nextProtoUnencryptedHTTP2 = "unencrypted_http2" | ||||||
|  | 
 | ||||||
|  | // unencryptedNetConnFromTLSConn retrieves a net.Conn wrapped in a *tls.Conn.
 | ||||||
|  | //
 | ||||||
|  | // TLSNextProto functions accept a *tls.Conn.
 | ||||||
|  | //
 | ||||||
|  | // When passing an unencrypted HTTP/2 connection to a TLSNextProto function,
 | ||||||
|  | // we pass a *tls.Conn with an underlying net.Conn containing the unencrypted connection.
 | ||||||
|  | // To be extra careful about mistakes (accidentally dropping TLS encryption in a place
 | ||||||
|  | // where we want it), the tls.Conn contains a net.Conn with an UnencryptedNetConn method
 | ||||||
|  | // that returns the actual connection we want to use.
 | ||||||
|  | func unencryptedNetConnFromTLSConn(tc *tls.Conn) (net.Conn, error) { | ||||||
|  | 	conner, ok := tc.NetConn().(interface { | ||||||
|  | 		UnencryptedNetConn() net.Conn | ||||||
|  | 	}) | ||||||
|  | 	if !ok { | ||||||
|  | 		return nil, errors.New("http2: TLS conn unexpectedly found in unencrypted handoff") | ||||||
|  | 	} | ||||||
|  | 	return conner.UnencryptedNetConn(), nil | ||||||
|  | } | ||||||
|  | @ -58,6 +58,102 @@ func IoctlGetEthtoolDrvinfo(fd int, ifname string) (*EthtoolDrvinfo, error) { | ||||||
| 	return &value, err | 	return &value, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // IoctlGetEthtoolTsInfo fetches ethtool timestamping and PHC
 | ||||||
|  | // association for the network device specified by ifname.
 | ||||||
|  | func IoctlGetEthtoolTsInfo(fd int, ifname string) (*EthtoolTsInfo, error) { | ||||||
|  | 	ifr, err := NewIfreq(ifname) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	value := EthtoolTsInfo{Cmd: ETHTOOL_GET_TS_INFO} | ||||||
|  | 	ifrd := ifr.withData(unsafe.Pointer(&value)) | ||||||
|  | 
 | ||||||
|  | 	err = ioctlIfreqData(fd, SIOCETHTOOL, &ifrd) | ||||||
|  | 	return &value, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IoctlGetHwTstamp retrieves the hardware timestamping configuration
 | ||||||
|  | // for the network device specified by ifname.
 | ||||||
|  | func IoctlGetHwTstamp(fd int, ifname string) (*HwTstampConfig, error) { | ||||||
|  | 	ifr, err := NewIfreq(ifname) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	value := HwTstampConfig{} | ||||||
|  | 	ifrd := ifr.withData(unsafe.Pointer(&value)) | ||||||
|  | 
 | ||||||
|  | 	err = ioctlIfreqData(fd, SIOCGHWTSTAMP, &ifrd) | ||||||
|  | 	return &value, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IoctlSetHwTstamp updates the hardware timestamping configuration for
 | ||||||
|  | // the network device specified by ifname.
 | ||||||
|  | func IoctlSetHwTstamp(fd int, ifname string, cfg *HwTstampConfig) error { | ||||||
|  | 	ifr, err := NewIfreq(ifname) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	ifrd := ifr.withData(unsafe.Pointer(cfg)) | ||||||
|  | 	return ioctlIfreqData(fd, SIOCSHWTSTAMP, &ifrd) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FdToClockID derives the clock ID from the file descriptor number
 | ||||||
|  | // - see clock_gettime(3), FD_TO_CLOCKID macros. The resulting ID is
 | ||||||
|  | // suitable for system calls like ClockGettime.
 | ||||||
|  | func FdToClockID(fd int) int32 { return int32((int(^fd) << 3) | 3) } | ||||||
|  | 
 | ||||||
|  | // IoctlPtpClockGetcaps returns the description of a given PTP device.
 | ||||||
|  | func IoctlPtpClockGetcaps(fd int) (*PtpClockCaps, error) { | ||||||
|  | 	var value PtpClockCaps | ||||||
|  | 	err := ioctlPtr(fd, PTP_CLOCK_GETCAPS2, unsafe.Pointer(&value)) | ||||||
|  | 	return &value, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IoctlPtpSysOffsetPrecise returns a description of the clock
 | ||||||
|  | // offset compared to the system clock.
 | ||||||
|  | func IoctlPtpSysOffsetPrecise(fd int) (*PtpSysOffsetPrecise, error) { | ||||||
|  | 	var value PtpSysOffsetPrecise | ||||||
|  | 	err := ioctlPtr(fd, PTP_SYS_OFFSET_PRECISE2, unsafe.Pointer(&value)) | ||||||
|  | 	return &value, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IoctlPtpSysOffsetExtended returns an extended description of the
 | ||||||
|  | // clock offset compared to the system clock. The samples parameter
 | ||||||
|  | // specifies the desired number of measurements.
 | ||||||
|  | func IoctlPtpSysOffsetExtended(fd int, samples uint) (*PtpSysOffsetExtended, error) { | ||||||
|  | 	value := PtpSysOffsetExtended{Samples: uint32(samples)} | ||||||
|  | 	err := ioctlPtr(fd, PTP_SYS_OFFSET_EXTENDED2, unsafe.Pointer(&value)) | ||||||
|  | 	return &value, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IoctlPtpPinGetfunc returns the configuration of the specified
 | ||||||
|  | // I/O pin on given PTP device.
 | ||||||
|  | func IoctlPtpPinGetfunc(fd int, index uint) (*PtpPinDesc, error) { | ||||||
|  | 	value := PtpPinDesc{Index: uint32(index)} | ||||||
|  | 	err := ioctlPtr(fd, PTP_PIN_GETFUNC2, unsafe.Pointer(&value)) | ||||||
|  | 	return &value, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IoctlPtpPinSetfunc updates configuration of the specified PTP
 | ||||||
|  | // I/O pin.
 | ||||||
|  | func IoctlPtpPinSetfunc(fd int, pd *PtpPinDesc) error { | ||||||
|  | 	return ioctlPtr(fd, PTP_PIN_SETFUNC2, unsafe.Pointer(pd)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IoctlPtpPeroutRequest configures the periodic output mode of the
 | ||||||
|  | // PTP I/O pins.
 | ||||||
|  | func IoctlPtpPeroutRequest(fd int, r *PtpPeroutRequest) error { | ||||||
|  | 	return ioctlPtr(fd, PTP_PEROUT_REQUEST2, unsafe.Pointer(r)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IoctlPtpExttsRequest configures the external timestamping mode
 | ||||||
|  | // of the PTP I/O pins.
 | ||||||
|  | func IoctlPtpExttsRequest(fd int, r *PtpExttsRequest) error { | ||||||
|  | 	return ioctlPtr(fd, PTP_EXTTS_REQUEST2, unsafe.Pointer(r)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // IoctlGetWatchdogInfo fetches information about a watchdog device from the
 | // IoctlGetWatchdogInfo fetches information about a watchdog device from the
 | ||||||
| // Linux watchdog API. For more information, see:
 | // Linux watchdog API. For more information, see:
 | ||||||
| // https://www.kernel.org/doc/html/latest/watchdog/watchdog-api.html.
 | // https://www.kernel.org/doc/html/latest/watchdog/watchdog-api.html.
 | ||||||
|  |  | ||||||
|  | @ -158,6 +158,16 @@ includes_Linux=' | ||||||
| #endif | #endif | ||||||
| #define _GNU_SOURCE | #define _GNU_SOURCE | ||||||
| 
 | 
 | ||||||
|  | // See the description in unix/linux/types.go | ||||||
|  | #if defined(__ARM_EABI__) || \ | ||||||
|  | 	(defined(__mips__) && (_MIPS_SIM == _ABIO32)) || \ | ||||||
|  | 	(defined(__powerpc__) && (!defined(__powerpc64__))) | ||||||
|  | # ifdef   _TIME_BITS | ||||||
|  | #  undef  _TIME_BITS | ||||||
|  | # endif | ||||||
|  | # define  _TIME_BITS 32 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| // <sys/ioctl.h> is broken on powerpc64, as it fails to include definitions of | // <sys/ioctl.h> is broken on powerpc64, as it fails to include definitions of | ||||||
| // these structures. We just include them copied from <bits/termios.h>. | // these structures. We just include them copied from <bits/termios.h>. | ||||||
| #if defined(__powerpc__) | #if defined(__powerpc__) | ||||||
|  | @ -256,6 +266,7 @@ struct ltchars { | ||||||
| #include <linux/nsfs.h> | #include <linux/nsfs.h> | ||||||
| #include <linux/perf_event.h> | #include <linux/perf_event.h> | ||||||
| #include <linux/pps.h> | #include <linux/pps.h> | ||||||
|  | #include <linux/ptp_clock.h> | ||||||
| #include <linux/ptrace.h> | #include <linux/ptrace.h> | ||||||
| #include <linux/random.h> | #include <linux/random.h> | ||||||
| #include <linux/reboot.h> | #include <linux/reboot.h> | ||||||
|  | @ -527,6 +538,7 @@ ccflags="$@" | ||||||
| 		$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || | 		$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || | ||||||
| 		$2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ || | 		$2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ || | ||||||
| 		$2 ~ /^NFC_.*_(MAX)?SIZE$/ || | 		$2 ~ /^NFC_.*_(MAX)?SIZE$/ || | ||||||
|  | 		$2 ~ /^PTP_/ || | ||||||
| 		$2 ~ /^RAW_PAYLOAD_/ || | 		$2 ~ /^RAW_PAYLOAD_/ || | ||||||
| 		$2 ~ /^[US]F_/ || | 		$2 ~ /^[US]F_/ || | ||||||
| 		$2 ~ /^TP_STATUS_/ || | 		$2 ~ /^TP_STATUS_/ || | ||||||
|  |  | ||||||
|  | @ -1860,6 +1860,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e | ||||||
| //sys	ClockAdjtime(clockid int32, buf *Timex) (state int, err error)
 | //sys	ClockAdjtime(clockid int32, buf *Timex) (state int, err error)
 | ||||||
| //sys	ClockGetres(clockid int32, res *Timespec) (err error)
 | //sys	ClockGetres(clockid int32, res *Timespec) (err error)
 | ||||||
| //sys	ClockGettime(clockid int32, time *Timespec) (err error)
 | //sys	ClockGettime(clockid int32, time *Timespec) (err error)
 | ||||||
|  | //sys	ClockSettime(clockid int32, time *Timespec) (err error)
 | ||||||
| //sys	ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error)
 | //sys	ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error)
 | ||||||
| //sys	Close(fd int) (err error)
 | //sys	Close(fd int) (err error)
 | ||||||
| //sys	CloseRange(first uint, last uint, flags uint) (err error)
 | //sys	CloseRange(first uint, last uint, flags uint) (err error)
 | ||||||
|  |  | ||||||
|  | @ -768,6 +768,15 @@ func Munmap(b []byte) (err error) { | ||||||
| 	return mapper.Munmap(b) | 	return mapper.Munmap(b) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func MmapPtr(fd int, offset int64, addr unsafe.Pointer, length uintptr, prot int, flags int) (ret unsafe.Pointer, err error) { | ||||||
|  | 	xaddr, err := mapper.mmap(uintptr(addr), length, prot, flags, fd, offset) | ||||||
|  | 	return unsafe.Pointer(xaddr), err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func MunmapPtr(addr unsafe.Pointer, length uintptr) (err error) { | ||||||
|  | 	return mapper.munmap(uintptr(addr), length) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| //sys   Gethostname(buf []byte) (err error) = SYS___GETHOSTNAME_A
 | //sys   Gethostname(buf []byte) (err error) = SYS___GETHOSTNAME_A
 | ||||||
| //sysnb	Getgid() (gid int)
 | //sysnb	Getgid() (gid int)
 | ||||||
| //sysnb	Getpid() (pid int)
 | //sysnb	Getpid() (pid int)
 | ||||||
|  | @ -816,10 +825,10 @@ func Lstat(path string, stat *Stat_t) (err error) { | ||||||
| // for checking symlinks begins with $VERSION/ $SYSNAME/ $SYSSYMR/ $SYSSYMA/
 | // for checking symlinks begins with $VERSION/ $SYSNAME/ $SYSSYMR/ $SYSSYMA/
 | ||||||
| func isSpecialPath(path []byte) (v bool) { | func isSpecialPath(path []byte) (v bool) { | ||||||
| 	var special = [4][8]byte{ | 	var special = [4][8]byte{ | ||||||
| 		[8]byte{'V', 'E', 'R', 'S', 'I', 'O', 'N', '/'}, | 		{'V', 'E', 'R', 'S', 'I', 'O', 'N', '/'}, | ||||||
| 		[8]byte{'S', 'Y', 'S', 'N', 'A', 'M', 'E', '/'}, | 		{'S', 'Y', 'S', 'N', 'A', 'M', 'E', '/'}, | ||||||
| 		[8]byte{'S', 'Y', 'S', 'S', 'Y', 'M', 'R', '/'}, | 		{'S', 'Y', 'S', 'S', 'Y', 'M', 'R', '/'}, | ||||||
| 		[8]byte{'S', 'Y', 'S', 'S', 'Y', 'M', 'A', '/'}} | 		{'S', 'Y', 'S', 'S', 'Y', 'M', 'A', '/'}} | ||||||
| 
 | 
 | ||||||
| 	var i, j int | 	var i, j int | ||||||
| 	for i = 0; i < len(special); i++ { | 	for i = 0; i < len(special); i++ { | ||||||
|  | @ -3115,3 +3124,90 @@ func legacy_Mkfifoat(dirfd int, path string, mode uint32) (err error) { | ||||||
| //sys	Posix_openpt(oflag int) (fd int, err error) = SYS_POSIX_OPENPT
 | //sys	Posix_openpt(oflag int) (fd int, err error) = SYS_POSIX_OPENPT
 | ||||||
| //sys	Grantpt(fildes int) (rc int, err error) = SYS_GRANTPT
 | //sys	Grantpt(fildes int) (rc int, err error) = SYS_GRANTPT
 | ||||||
| //sys	Unlockpt(fildes int) (rc int, err error) = SYS_UNLOCKPT
 | //sys	Unlockpt(fildes int) (rc int, err error) = SYS_UNLOCKPT
 | ||||||
|  | 
 | ||||||
|  | func fcntlAsIs(fd uintptr, cmd int, arg uintptr) (val int, err error) { | ||||||
|  | 	runtime.EnterSyscall() | ||||||
|  | 	r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS_FCNTL<<4, uintptr(fd), uintptr(cmd), arg) | ||||||
|  | 	runtime.ExitSyscall() | ||||||
|  | 	val = int(r0) | ||||||
|  | 	if int64(r0) == -1 { | ||||||
|  | 		err = errnoErr2(e1, e2) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Fcntl(fd uintptr, cmd int, op interface{}) (ret int, err error) { | ||||||
|  | 	switch op.(type) { | ||||||
|  | 	case *Flock_t: | ||||||
|  | 		err = FcntlFlock(fd, cmd, op.(*Flock_t)) | ||||||
|  | 		if err != nil { | ||||||
|  | 			ret = -1 | ||||||
|  | 		} | ||||||
|  | 		return | ||||||
|  | 	case int: | ||||||
|  | 		return FcntlInt(fd, cmd, op.(int)) | ||||||
|  | 	case *F_cnvrt: | ||||||
|  | 		return fcntlAsIs(fd, cmd, uintptr(unsafe.Pointer(op.(*F_cnvrt)))) | ||||||
|  | 	case unsafe.Pointer: | ||||||
|  | 		return fcntlAsIs(fd, cmd, uintptr(op.(unsafe.Pointer))) | ||||||
|  | 	default: | ||||||
|  | 		return -1, EINVAL | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { | ||||||
|  | 	if raceenabled { | ||||||
|  | 		raceReleaseMerge(unsafe.Pointer(&ioSync)) | ||||||
|  | 	} | ||||||
|  | 	return sendfile(outfd, infd, offset, count) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { | ||||||
|  | 	// TODO: use LE call instead if the call is implemented
 | ||||||
|  | 	originalOffset, err := Seek(infd, 0, SEEK_CUR) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return -1, err | ||||||
|  | 	} | ||||||
|  | 	//start reading data from in_fd
 | ||||||
|  | 	if offset != nil { | ||||||
|  | 		_, err := Seek(infd, *offset, SEEK_SET) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return -1, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	buf := make([]byte, count) | ||||||
|  | 	readBuf := make([]byte, 0) | ||||||
|  | 	var n int = 0 | ||||||
|  | 	for i := 0; i < count; i += n { | ||||||
|  | 		n, err := Read(infd, buf) | ||||||
|  | 		if n == 0 { | ||||||
|  | 			if err != nil { | ||||||
|  | 				return -1, err | ||||||
|  | 			} else { // EOF
 | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		readBuf = append(readBuf, buf...) | ||||||
|  | 		buf = buf[0:0] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	n2, err := Write(outfd, readBuf) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return -1, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	//When sendfile() returns, this variable will be set to the
 | ||||||
|  | 	// offset of the byte following the last byte that was read.
 | ||||||
|  | 	if offset != nil { | ||||||
|  | 		*offset = *offset + int64(n) | ||||||
|  | 		// If offset is not NULL, then sendfile() does not modify the file
 | ||||||
|  | 		// offset of in_fd
 | ||||||
|  | 		_, err := Seek(infd, originalOffset, SEEK_SET) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return -1, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return n2, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -2625,6 +2625,28 @@ const ( | ||||||
| 	PR_UNALIGN_NOPRINT                          = 0x1 | 	PR_UNALIGN_NOPRINT                          = 0x1 | ||||||
| 	PR_UNALIGN_SIGBUS                           = 0x2 | 	PR_UNALIGN_SIGBUS                           = 0x2 | ||||||
| 	PSTOREFS_MAGIC                              = 0x6165676c | 	PSTOREFS_MAGIC                              = 0x6165676c | ||||||
|  | 	PTP_CLK_MAGIC                               = '=' | ||||||
|  | 	PTP_ENABLE_FEATURE                          = 0x1 | ||||||
|  | 	PTP_EXTTS_EDGES                             = 0x6 | ||||||
|  | 	PTP_EXTTS_EVENT_VALID                       = 0x1 | ||||||
|  | 	PTP_EXTTS_V1_VALID_FLAGS                    = 0x7 | ||||||
|  | 	PTP_EXTTS_VALID_FLAGS                       = 0x1f | ||||||
|  | 	PTP_EXT_OFFSET                              = 0x10 | ||||||
|  | 	PTP_FALLING_EDGE                            = 0x4 | ||||||
|  | 	PTP_MAX_SAMPLES                             = 0x19 | ||||||
|  | 	PTP_PEROUT_DUTY_CYCLE                       = 0x2 | ||||||
|  | 	PTP_PEROUT_ONE_SHOT                         = 0x1 | ||||||
|  | 	PTP_PEROUT_PHASE                            = 0x4 | ||||||
|  | 	PTP_PEROUT_V1_VALID_FLAGS                   = 0x0 | ||||||
|  | 	PTP_PEROUT_VALID_FLAGS                      = 0x7 | ||||||
|  | 	PTP_PIN_GETFUNC                             = 0xc0603d06 | ||||||
|  | 	PTP_PIN_GETFUNC2                            = 0xc0603d0f | ||||||
|  | 	PTP_RISING_EDGE                             = 0x2 | ||||||
|  | 	PTP_STRICT_FLAGS                            = 0x8 | ||||||
|  | 	PTP_SYS_OFFSET_EXTENDED                     = 0xc4c03d09 | ||||||
|  | 	PTP_SYS_OFFSET_EXTENDED2                    = 0xc4c03d12 | ||||||
|  | 	PTP_SYS_OFFSET_PRECISE                      = 0xc0403d08 | ||||||
|  | 	PTP_SYS_OFFSET_PRECISE2                     = 0xc0403d11 | ||||||
| 	PTRACE_ATTACH                               = 0x10 | 	PTRACE_ATTACH                               = 0x10 | ||||||
| 	PTRACE_CONT                                 = 0x7 | 	PTRACE_CONT                                 = 0x7 | ||||||
| 	PTRACE_DETACH                               = 0x11 | 	PTRACE_DETACH                               = 0x11 | ||||||
|  |  | ||||||
|  | @ -237,6 +237,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x7434 | 	PPPIOCUNBRIDGECHAN               = 0x7434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x744e | 	PPPIOCXFERUNIT                   = 0x744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x80503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x80503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x40043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x40043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x40103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x40103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x3d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x40043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x40383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x40383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x40603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x40603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x43403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x43403d0e | ||||||
| 	PTRACE_GETFPREGS                 = 0xe | 	PTRACE_GETFPREGS                 = 0xe | ||||||
| 	PTRACE_GETFPXREGS                = 0x12 | 	PTRACE_GETFPXREGS                = 0x12 | ||||||
| 	PTRACE_GET_THREAD_AREA           = 0x19 | 	PTRACE_GET_THREAD_AREA           = 0x19 | ||||||
|  |  | ||||||
|  | @ -237,6 +237,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x7434 | 	PPPIOCUNBRIDGECHAN               = 0x7434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x744e | 	PPPIOCXFERUNIT                   = 0x744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x80503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x80503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x40043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x40043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x40103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x40103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x3d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x40043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x40383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x40383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x40603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x40603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x43403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x43403d0e | ||||||
| 	PTRACE_ARCH_PRCTL                = 0x1e | 	PTRACE_ARCH_PRCTL                = 0x1e | ||||||
| 	PTRACE_GETFPREGS                 = 0xe | 	PTRACE_GETFPREGS                 = 0xe | ||||||
| 	PTRACE_GETFPXREGS                = 0x12 | 	PTRACE_GETFPXREGS                = 0x12 | ||||||
|  |  | ||||||
|  | @ -234,6 +234,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x7434 | 	PPPIOCUNBRIDGECHAN               = 0x7434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x744e | 	PPPIOCXFERUNIT                   = 0x744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x80503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x80503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x40043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x40043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x40103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x40103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x3d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x40043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x40383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x40383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x40603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x40603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x43403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x43403d0e | ||||||
| 	PTRACE_GETCRUNCHREGS             = 0x19 | 	PTRACE_GETCRUNCHREGS             = 0x19 | ||||||
| 	PTRACE_GETFDPIC                  = 0x1f | 	PTRACE_GETFDPIC                  = 0x1f | ||||||
| 	PTRACE_GETFDPIC_EXEC             = 0x0 | 	PTRACE_GETFDPIC_EXEC             = 0x0 | ||||||
|  |  | ||||||
|  | @ -240,6 +240,20 @@ const ( | ||||||
| 	PROT_BTI                         = 0x10 | 	PROT_BTI                         = 0x10 | ||||||
| 	PROT_MTE                         = 0x20 | 	PROT_MTE                         = 0x20 | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x80503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x80503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x40043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x40043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x40103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x40103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x3d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x40043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x40383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x40383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x40603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x40603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x43403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x43403d0e | ||||||
| 	PTRACE_PEEKMTETAGS               = 0x21 | 	PTRACE_PEEKMTETAGS               = 0x21 | ||||||
| 	PTRACE_POKEMTETAGS               = 0x22 | 	PTRACE_POKEMTETAGS               = 0x22 | ||||||
| 	PTRACE_SYSEMU                    = 0x1f | 	PTRACE_SYSEMU                    = 0x1f | ||||||
|  |  | ||||||
|  | @ -238,6 +238,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x7434 | 	PPPIOCUNBRIDGECHAN               = 0x7434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x744e | 	PPPIOCXFERUNIT                   = 0x744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x80503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x80503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x40043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x40043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x40103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x40103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x3d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x40043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x40383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x40383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x40603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x40603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x43403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x43403d0e | ||||||
| 	PTRACE_SYSEMU                    = 0x1f | 	PTRACE_SYSEMU                    = 0x1f | ||||||
| 	PTRACE_SYSEMU_SINGLESTEP         = 0x20 | 	PTRACE_SYSEMU_SINGLESTEP         = 0x20 | ||||||
| 	RLIMIT_AS                        = 0x9 | 	RLIMIT_AS                        = 0x9 | ||||||
|  |  | ||||||
|  | @ -234,6 +234,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x20007434 | 	PPPIOCUNBRIDGECHAN               = 0x20007434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x2000744e | 	PPPIOCXFERUNIT                   = 0x2000744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x40503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x40503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x80043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x80043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x80103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x80103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x20003d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x80043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x80383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x80383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x80603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x80603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x83403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x83403d0e | ||||||
| 	PTRACE_GETFPREGS                 = 0xe | 	PTRACE_GETFPREGS                 = 0xe | ||||||
| 	PTRACE_GET_THREAD_AREA           = 0x19 | 	PTRACE_GET_THREAD_AREA           = 0x19 | ||||||
| 	PTRACE_GET_THREAD_AREA_3264      = 0xc4 | 	PTRACE_GET_THREAD_AREA_3264      = 0xc4 | ||||||
|  |  | ||||||
|  | @ -234,6 +234,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x20007434 | 	PPPIOCUNBRIDGECHAN               = 0x20007434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x2000744e | 	PPPIOCXFERUNIT                   = 0x2000744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x40503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x40503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x80043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x80043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x80103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x80103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x20003d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x80043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x80383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x80383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x80603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x80603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x83403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x83403d0e | ||||||
| 	PTRACE_GETFPREGS                 = 0xe | 	PTRACE_GETFPREGS                 = 0xe | ||||||
| 	PTRACE_GET_THREAD_AREA           = 0x19 | 	PTRACE_GET_THREAD_AREA           = 0x19 | ||||||
| 	PTRACE_GET_THREAD_AREA_3264      = 0xc4 | 	PTRACE_GET_THREAD_AREA_3264      = 0xc4 | ||||||
|  |  | ||||||
|  | @ -234,6 +234,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x20007434 | 	PPPIOCUNBRIDGECHAN               = 0x20007434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x2000744e | 	PPPIOCXFERUNIT                   = 0x2000744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x40503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x40503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x80043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x80043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x80103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x80103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x20003d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x80043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x80383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x80383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x80603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x80603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x83403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x83403d0e | ||||||
| 	PTRACE_GETFPREGS                 = 0xe | 	PTRACE_GETFPREGS                 = 0xe | ||||||
| 	PTRACE_GET_THREAD_AREA           = 0x19 | 	PTRACE_GET_THREAD_AREA           = 0x19 | ||||||
| 	PTRACE_GET_THREAD_AREA_3264      = 0xc4 | 	PTRACE_GET_THREAD_AREA_3264      = 0xc4 | ||||||
|  |  | ||||||
|  | @ -234,6 +234,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x20007434 | 	PPPIOCUNBRIDGECHAN               = 0x20007434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x2000744e | 	PPPIOCXFERUNIT                   = 0x2000744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x40503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x40503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x80043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x80043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x80103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x80103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x20003d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x80043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x80383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x80383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x80603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x80603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x83403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x83403d0e | ||||||
| 	PTRACE_GETFPREGS                 = 0xe | 	PTRACE_GETFPREGS                 = 0xe | ||||||
| 	PTRACE_GET_THREAD_AREA           = 0x19 | 	PTRACE_GET_THREAD_AREA           = 0x19 | ||||||
| 	PTRACE_GET_THREAD_AREA_3264      = 0xc4 | 	PTRACE_GET_THREAD_AREA_3264      = 0xc4 | ||||||
|  |  | ||||||
|  | @ -237,6 +237,20 @@ const ( | ||||||
| 	PPPIOCXFERUNIT                   = 0x2000744e | 	PPPIOCXFERUNIT                   = 0x2000744e | ||||||
| 	PROT_SAO                         = 0x10 | 	PROT_SAO                         = 0x10 | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x40503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x40503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x80043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x80043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x80103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x80103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x20003d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x80043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x80383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x80383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x80603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x80603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x83403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x83403d0e | ||||||
| 	PTRACE_GETEVRREGS                = 0x14 | 	PTRACE_GETEVRREGS                = 0x14 | ||||||
| 	PTRACE_GETFPREGS                 = 0xe | 	PTRACE_GETFPREGS                 = 0xe | ||||||
| 	PTRACE_GETREGS64                 = 0x16 | 	PTRACE_GETREGS64                 = 0x16 | ||||||
|  |  | ||||||
|  | @ -237,6 +237,20 @@ const ( | ||||||
| 	PPPIOCXFERUNIT                   = 0x2000744e | 	PPPIOCXFERUNIT                   = 0x2000744e | ||||||
| 	PROT_SAO                         = 0x10 | 	PROT_SAO                         = 0x10 | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x40503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x40503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x80043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x80043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x80103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x80103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x20003d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x80043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x80383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x80383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x80603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x80603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x83403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x83403d0e | ||||||
| 	PTRACE_GETEVRREGS                = 0x14 | 	PTRACE_GETEVRREGS                = 0x14 | ||||||
| 	PTRACE_GETFPREGS                 = 0xe | 	PTRACE_GETFPREGS                 = 0xe | ||||||
| 	PTRACE_GETREGS64                 = 0x16 | 	PTRACE_GETREGS64                 = 0x16 | ||||||
|  |  | ||||||
|  | @ -237,6 +237,20 @@ const ( | ||||||
| 	PPPIOCXFERUNIT                   = 0x2000744e | 	PPPIOCXFERUNIT                   = 0x2000744e | ||||||
| 	PROT_SAO                         = 0x10 | 	PROT_SAO                         = 0x10 | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x40503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x40503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x80043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x80043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x80103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x80103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x20003d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x80043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x80383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x80383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x80603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x80603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x83403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x83403d0e | ||||||
| 	PTRACE_GETEVRREGS                = 0x14 | 	PTRACE_GETEVRREGS                = 0x14 | ||||||
| 	PTRACE_GETFPREGS                 = 0xe | 	PTRACE_GETFPREGS                 = 0xe | ||||||
| 	PTRACE_GETREGS64                 = 0x16 | 	PTRACE_GETREGS64                 = 0x16 | ||||||
|  |  | ||||||
|  | @ -234,6 +234,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x7434 | 	PPPIOCUNBRIDGECHAN               = 0x7434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x744e | 	PPPIOCXFERUNIT                   = 0x744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x80503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x80503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x40043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x40043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x40103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x40103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x3d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x40043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x40383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x40383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x40603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x40603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x43403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x43403d0e | ||||||
| 	PTRACE_GETFDPIC                  = 0x21 | 	PTRACE_GETFDPIC                  = 0x21 | ||||||
| 	PTRACE_GETFDPIC_EXEC             = 0x0 | 	PTRACE_GETFDPIC_EXEC             = 0x0 | ||||||
| 	PTRACE_GETFDPIC_INTERP           = 0x1 | 	PTRACE_GETFDPIC_INTERP           = 0x1 | ||||||
|  |  | ||||||
|  | @ -234,6 +234,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x7434 | 	PPPIOCUNBRIDGECHAN               = 0x7434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x744e | 	PPPIOCXFERUNIT                   = 0x744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x80503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x80503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x40043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x40043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x40103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x40103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x3d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x40043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x40383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x40383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x40603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x40603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x43403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x43403d0e | ||||||
| 	PTRACE_DISABLE_TE                = 0x5010 | 	PTRACE_DISABLE_TE                = 0x5010 | ||||||
| 	PTRACE_ENABLE_TE                 = 0x5009 | 	PTRACE_ENABLE_TE                 = 0x5009 | ||||||
| 	PTRACE_GET_LAST_BREAK            = 0x5006 | 	PTRACE_GET_LAST_BREAK            = 0x5006 | ||||||
|  |  | ||||||
|  | @ -239,6 +239,20 @@ const ( | ||||||
| 	PPPIOCUNBRIDGECHAN               = 0x20007434 | 	PPPIOCUNBRIDGECHAN               = 0x20007434 | ||||||
| 	PPPIOCXFERUNIT                   = 0x2000744e | 	PPPIOCXFERUNIT                   = 0x2000744e | ||||||
| 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | 	PR_SET_PTRACER_ANY               = 0xffffffffffffffff | ||||||
|  | 	PTP_CLOCK_GETCAPS                = 0x40503d01 | ||||||
|  | 	PTP_CLOCK_GETCAPS2               = 0x40503d0a | ||||||
|  | 	PTP_ENABLE_PPS                   = 0x80043d04 | ||||||
|  | 	PTP_ENABLE_PPS2                  = 0x80043d0d | ||||||
|  | 	PTP_EXTTS_REQUEST                = 0x80103d02 | ||||||
|  | 	PTP_EXTTS_REQUEST2               = 0x80103d0b | ||||||
|  | 	PTP_MASK_CLEAR_ALL               = 0x20003d13 | ||||||
|  | 	PTP_MASK_EN_SINGLE               = 0x80043d14 | ||||||
|  | 	PTP_PEROUT_REQUEST               = 0x80383d03 | ||||||
|  | 	PTP_PEROUT_REQUEST2              = 0x80383d0c | ||||||
|  | 	PTP_PIN_SETFUNC                  = 0x80603d07 | ||||||
|  | 	PTP_PIN_SETFUNC2                 = 0x80603d10 | ||||||
|  | 	PTP_SYS_OFFSET                   = 0x83403d05 | ||||||
|  | 	PTP_SYS_OFFSET2                  = 0x83403d0e | ||||||
| 	PTRACE_GETFPAREGS                = 0x14 | 	PTRACE_GETFPAREGS                = 0x14 | ||||||
| 	PTRACE_GETFPREGS                 = 0xe | 	PTRACE_GETFPREGS                 = 0xe | ||||||
| 	PTRACE_GETFPREGS64               = 0x19 | 	PTRACE_GETFPREGS64               = 0x19 | ||||||
|  |  | ||||||
|  | @ -592,6 +592,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { | ||||||
| 
 | 
 | ||||||
| // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | ||||||
| 
 | 
 | ||||||
|  | func ClockSettime(clockid int32, time *Timespec) (err error) { | ||||||
|  | 	_, _, e1 := Syscall(SYS_CLOCK_SETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) | ||||||
|  | 	if e1 != 0 { | ||||||
|  | 		err = errnoErr(e1) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 | ||||||
|  | 
 | ||||||
| func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { | func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { | ||||||
| 	_, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) | 	_, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) | ||||||
| 	if e1 != 0 { | 	if e1 != 0 { | ||||||
|  |  | ||||||
|  | @ -1752,12 +1752,6 @@ const ( | ||||||
| 	IFLA_IPVLAN_UNSPEC                         = 0x0 | 	IFLA_IPVLAN_UNSPEC                         = 0x0 | ||||||
| 	IFLA_IPVLAN_MODE                           = 0x1 | 	IFLA_IPVLAN_MODE                           = 0x1 | ||||||
| 	IFLA_IPVLAN_FLAGS                          = 0x2 | 	IFLA_IPVLAN_FLAGS                          = 0x2 | ||||||
| 	NETKIT_NEXT                                = -0x1 |  | ||||||
| 	NETKIT_PASS                                = 0x0 |  | ||||||
| 	NETKIT_DROP                                = 0x2 |  | ||||||
| 	NETKIT_REDIRECT                            = 0x7 |  | ||||||
| 	NETKIT_L2                                  = 0x0 |  | ||||||
| 	NETKIT_L3                                  = 0x1 |  | ||||||
| 	IFLA_NETKIT_UNSPEC                         = 0x0 | 	IFLA_NETKIT_UNSPEC                         = 0x0 | ||||||
| 	IFLA_NETKIT_PEER_INFO                      = 0x1 | 	IFLA_NETKIT_PEER_INFO                      = 0x1 | ||||||
| 	IFLA_NETKIT_PRIMARY                        = 0x2 | 	IFLA_NETKIT_PRIMARY                        = 0x2 | ||||||
|  | @ -1796,6 +1790,7 @@ const ( | ||||||
| 	IFLA_VXLAN_DF                              = 0x1d | 	IFLA_VXLAN_DF                              = 0x1d | ||||||
| 	IFLA_VXLAN_VNIFILTER                       = 0x1e | 	IFLA_VXLAN_VNIFILTER                       = 0x1e | ||||||
| 	IFLA_VXLAN_LOCALBYPASS                     = 0x1f | 	IFLA_VXLAN_LOCALBYPASS                     = 0x1f | ||||||
|  | 	IFLA_VXLAN_LABEL_POLICY                    = 0x20 | ||||||
| 	IFLA_GENEVE_UNSPEC                         = 0x0 | 	IFLA_GENEVE_UNSPEC                         = 0x0 | ||||||
| 	IFLA_GENEVE_ID                             = 0x1 | 	IFLA_GENEVE_ID                             = 0x1 | ||||||
| 	IFLA_GENEVE_REMOTE                         = 0x2 | 	IFLA_GENEVE_REMOTE                         = 0x2 | ||||||
|  | @ -1825,6 +1820,8 @@ const ( | ||||||
| 	IFLA_GTP_ROLE                              = 0x4 | 	IFLA_GTP_ROLE                              = 0x4 | ||||||
| 	IFLA_GTP_CREATE_SOCKETS                    = 0x5 | 	IFLA_GTP_CREATE_SOCKETS                    = 0x5 | ||||||
| 	IFLA_GTP_RESTART_COUNT                     = 0x6 | 	IFLA_GTP_RESTART_COUNT                     = 0x6 | ||||||
|  | 	IFLA_GTP_LOCAL                             = 0x7 | ||||||
|  | 	IFLA_GTP_LOCAL6                            = 0x8 | ||||||
| 	IFLA_BOND_UNSPEC                           = 0x0 | 	IFLA_BOND_UNSPEC                           = 0x0 | ||||||
| 	IFLA_BOND_MODE                             = 0x1 | 	IFLA_BOND_MODE                             = 0x1 | ||||||
| 	IFLA_BOND_ACTIVE_SLAVE                     = 0x2 | 	IFLA_BOND_ACTIVE_SLAVE                     = 0x2 | ||||||
|  | @ -1857,6 +1854,7 @@ const ( | ||||||
| 	IFLA_BOND_AD_LACP_ACTIVE                   = 0x1d | 	IFLA_BOND_AD_LACP_ACTIVE                   = 0x1d | ||||||
| 	IFLA_BOND_MISSED_MAX                       = 0x1e | 	IFLA_BOND_MISSED_MAX                       = 0x1e | ||||||
| 	IFLA_BOND_NS_IP6_TARGET                    = 0x1f | 	IFLA_BOND_NS_IP6_TARGET                    = 0x1f | ||||||
|  | 	IFLA_BOND_COUPLED_CONTROL                  = 0x20 | ||||||
| 	IFLA_BOND_AD_INFO_UNSPEC                   = 0x0 | 	IFLA_BOND_AD_INFO_UNSPEC                   = 0x0 | ||||||
| 	IFLA_BOND_AD_INFO_AGGREGATOR               = 0x1 | 	IFLA_BOND_AD_INFO_AGGREGATOR               = 0x1 | ||||||
| 	IFLA_BOND_AD_INFO_NUM_PORTS                = 0x2 | 	IFLA_BOND_AD_INFO_NUM_PORTS                = 0x2 | ||||||
|  | @ -1925,6 +1923,7 @@ const ( | ||||||
| 	IFLA_HSR_SEQ_NR                            = 0x5 | 	IFLA_HSR_SEQ_NR                            = 0x5 | ||||||
| 	IFLA_HSR_VERSION                           = 0x6 | 	IFLA_HSR_VERSION                           = 0x6 | ||||||
| 	IFLA_HSR_PROTOCOL                          = 0x7 | 	IFLA_HSR_PROTOCOL                          = 0x7 | ||||||
|  | 	IFLA_HSR_INTERLINK                         = 0x8 | ||||||
| 	IFLA_STATS_UNSPEC                          = 0x0 | 	IFLA_STATS_UNSPEC                          = 0x0 | ||||||
| 	IFLA_STATS_LINK_64                         = 0x1 | 	IFLA_STATS_LINK_64                         = 0x1 | ||||||
| 	IFLA_STATS_LINK_XSTATS                     = 0x2 | 	IFLA_STATS_LINK_XSTATS                     = 0x2 | ||||||
|  | @ -1977,6 +1976,15 @@ const ( | ||||||
| 	IFLA_DSA_MASTER                            = 0x1 | 	IFLA_DSA_MASTER                            = 0x1 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | const ( | ||||||
|  | 	NETKIT_NEXT     = -0x1 | ||||||
|  | 	NETKIT_PASS     = 0x0 | ||||||
|  | 	NETKIT_DROP     = 0x2 | ||||||
|  | 	NETKIT_REDIRECT = 0x7 | ||||||
|  | 	NETKIT_L2       = 0x0 | ||||||
|  | 	NETKIT_L3       = 0x1 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| const ( | const ( | ||||||
| 	NF_INET_PRE_ROUTING  = 0x0 | 	NF_INET_PRE_ROUTING  = 0x0 | ||||||
| 	NF_INET_LOCAL_IN     = 0x1 | 	NF_INET_LOCAL_IN     = 0x1 | ||||||
|  | @ -4110,6 +4118,106 @@ type EthtoolDrvinfo struct { | ||||||
| 	Regdump_len  uint32 | 	Regdump_len  uint32 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type EthtoolTsInfo struct { | ||||||
|  | 	Cmd             uint32 | ||||||
|  | 	So_timestamping uint32 | ||||||
|  | 	Phc_index       int32 | ||||||
|  | 	Tx_types        uint32 | ||||||
|  | 	Tx_reserved     [3]uint32 | ||||||
|  | 	Rx_filters      uint32 | ||||||
|  | 	Rx_reserved     [3]uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type HwTstampConfig struct { | ||||||
|  | 	Flags     int32 | ||||||
|  | 	Tx_type   int32 | ||||||
|  | 	Rx_filter int32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	HWTSTAMP_FILTER_NONE            = 0x0 | ||||||
|  | 	HWTSTAMP_FILTER_ALL             = 0x1 | ||||||
|  | 	HWTSTAMP_FILTER_SOME            = 0x2 | ||||||
|  | 	HWTSTAMP_FILTER_PTP_V1_L4_EVENT = 0x3 | ||||||
|  | 	HWTSTAMP_FILTER_PTP_V2_L4_EVENT = 0x6 | ||||||
|  | 	HWTSTAMP_FILTER_PTP_V2_L2_EVENT = 0x9 | ||||||
|  | 	HWTSTAMP_FILTER_PTP_V2_EVENT    = 0xc | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	HWTSTAMP_TX_OFF          = 0x0 | ||||||
|  | 	HWTSTAMP_TX_ON           = 0x1 | ||||||
|  | 	HWTSTAMP_TX_ONESTEP_SYNC = 0x2 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type ( | ||||||
|  | 	PtpClockCaps struct { | ||||||
|  | 		Max_adj            int32 | ||||||
|  | 		N_alarm            int32 | ||||||
|  | 		N_ext_ts           int32 | ||||||
|  | 		N_per_out          int32 | ||||||
|  | 		Pps                int32 | ||||||
|  | 		N_pins             int32 | ||||||
|  | 		Cross_timestamping int32 | ||||||
|  | 		Adjust_phase       int32 | ||||||
|  | 		Max_phase_adj      int32 | ||||||
|  | 		Rsv                [11]int32 | ||||||
|  | 	} | ||||||
|  | 	PtpClockTime struct { | ||||||
|  | 		Sec      int64 | ||||||
|  | 		Nsec     uint32 | ||||||
|  | 		Reserved uint32 | ||||||
|  | 	} | ||||||
|  | 	PtpExttsEvent struct { | ||||||
|  | 		T     PtpClockTime | ||||||
|  | 		Index uint32 | ||||||
|  | 		Flags uint32 | ||||||
|  | 		Rsv   [2]uint32 | ||||||
|  | 	} | ||||||
|  | 	PtpExttsRequest struct { | ||||||
|  | 		Index uint32 | ||||||
|  | 		Flags uint32 | ||||||
|  | 		Rsv   [2]uint32 | ||||||
|  | 	} | ||||||
|  | 	PtpPeroutRequest struct { | ||||||
|  | 		StartOrPhase PtpClockTime | ||||||
|  | 		Period       PtpClockTime | ||||||
|  | 		Index        uint32 | ||||||
|  | 		Flags        uint32 | ||||||
|  | 		On           PtpClockTime | ||||||
|  | 	} | ||||||
|  | 	PtpPinDesc struct { | ||||||
|  | 		Name  [64]byte | ||||||
|  | 		Index uint32 | ||||||
|  | 		Func  uint32 | ||||||
|  | 		Chan  uint32 | ||||||
|  | 		Rsv   [5]uint32 | ||||||
|  | 	} | ||||||
|  | 	PtpSysOffset struct { | ||||||
|  | 		Samples uint32 | ||||||
|  | 		Rsv     [3]uint32 | ||||||
|  | 		Ts      [51]PtpClockTime | ||||||
|  | 	} | ||||||
|  | 	PtpSysOffsetExtended struct { | ||||||
|  | 		Samples uint32 | ||||||
|  | 		Rsv     [3]uint32 | ||||||
|  | 		Ts      [25][3]PtpClockTime | ||||||
|  | 	} | ||||||
|  | 	PtpSysOffsetPrecise struct { | ||||||
|  | 		Device   PtpClockTime | ||||||
|  | 		Realtime PtpClockTime | ||||||
|  | 		Monoraw  PtpClockTime | ||||||
|  | 		Rsv      [4]uint32 | ||||||
|  | 	} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	PTP_PF_NONE    = 0x0 | ||||||
|  | 	PTP_PF_EXTTS   = 0x1 | ||||||
|  | 	PTP_PF_PEROUT  = 0x2 | ||||||
|  | 	PTP_PF_PHYSYNC = 0x3 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| type ( | type ( | ||||||
| 	HIDRawReportDescriptor struct { | 	HIDRawReportDescriptor struct { | ||||||
| 		Size  uint32 | 		Size  uint32 | ||||||
|  |  | ||||||
|  | @ -377,6 +377,12 @@ type Flock_t struct { | ||||||
| 	Pid    int32 | 	Pid    int32 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type F_cnvrt struct { | ||||||
|  | 	Cvtcmd int32 | ||||||
|  | 	Pccsid int16 | ||||||
|  | 	Fccsid int16 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type Termios struct { | type Termios struct { | ||||||
| 	Cflag uint32 | 	Cflag uint32 | ||||||
| 	Iflag uint32 | 	Iflag uint32 | ||||||
|  |  | ||||||
|  | @ -725,20 +725,12 @@ func DurationSinceBoot() time.Duration { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Ftruncate(fd Handle, length int64) (err error) { | func Ftruncate(fd Handle, length int64) (err error) { | ||||||
| 	curoffset, e := Seek(fd, 0, 1) | 	type _FILE_END_OF_FILE_INFO struct { | ||||||
| 	if e != nil { | 		EndOfFile int64 | ||||||
| 		return e |  | ||||||
| 	} | 	} | ||||||
| 	defer Seek(fd, curoffset, 0) | 	var info _FILE_END_OF_FILE_INFO | ||||||
| 	_, e = Seek(fd, length, 0) | 	info.EndOfFile = length | ||||||
| 	if e != nil { | 	return SetFileInformationByHandle(fd, FileEndOfFileInfo, (*byte)(unsafe.Pointer(&info)), uint32(unsafe.Sizeof(info))) | ||||||
| 		return e |  | ||||||
| 	} |  | ||||||
| 	e = SetEndOfFile(fd) |  | ||||||
| 	if e != nil { |  | ||||||
| 		return e |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Gettimeofday(tv *Timeval) (err error) { | func Gettimeofday(tv *Timeval) (err error) { | ||||||
|  | @ -894,6 +886,11 @@ const socket_error = uintptr(^uint32(0)) | ||||||
| //sys	GetACP() (acp uint32) = kernel32.GetACP
 | //sys	GetACP() (acp uint32) = kernel32.GetACP
 | ||||||
| //sys	MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar
 | //sys	MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar
 | ||||||
| //sys	getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) = iphlpapi.GetBestInterfaceEx
 | //sys	getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) = iphlpapi.GetBestInterfaceEx
 | ||||||
|  | //sys   GetIfEntry2Ex(level uint32, row *MibIfRow2) (errcode error) = iphlpapi.GetIfEntry2Ex
 | ||||||
|  | //sys   GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) = iphlpapi.GetUnicastIpAddressEntry
 | ||||||
|  | //sys   NotifyIpInterfaceChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyIpInterfaceChange
 | ||||||
|  | //sys   NotifyUnicastIpAddressChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyUnicastIpAddressChange
 | ||||||
|  | //sys   CancelMibChangeNotify2(notificationHandle Handle) (errcode error) = iphlpapi.CancelMibChangeNotify2
 | ||||||
| 
 | 
 | ||||||
| // For testing: clients can set this flag to force
 | // For testing: clients can set this flag to force
 | ||||||
| // creation of IPv6 sockets to return EAFNOSUPPORT.
 | // creation of IPv6 sockets to return EAFNOSUPPORT.
 | ||||||
|  | @ -1685,13 +1682,16 @@ func (s NTStatus) Error() string { | ||||||
| // do not use NTUnicodeString, and instead UTF16PtrFromString should be used for
 | // do not use NTUnicodeString, and instead UTF16PtrFromString should be used for
 | ||||||
| // the more common *uint16 string type.
 | // the more common *uint16 string type.
 | ||||||
| func NewNTUnicodeString(s string) (*NTUnicodeString, error) { | func NewNTUnicodeString(s string) (*NTUnicodeString, error) { | ||||||
| 	var u NTUnicodeString | 	s16, err := UTF16FromString(s) | ||||||
| 	s16, err := UTF16PtrFromString(s) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	RtlInitUnicodeString(&u, s16) | 	n := uint16(len(s16) * 2) | ||||||
| 	return &u, nil | 	return &NTUnicodeString{ | ||||||
|  | 		Length:        n - 2, // subtract 2 bytes for the NULL terminator
 | ||||||
|  | 		MaximumLength: n, | ||||||
|  | 		Buffer:        &s16[0], | ||||||
|  | 	}, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Slice returns a uint16 slice that aliases the data in the NTUnicodeString.
 | // Slice returns a uint16 slice that aliases the data in the NTUnicodeString.
 | ||||||
|  |  | ||||||
|  | @ -2203,6 +2203,132 @@ const ( | ||||||
| 	IfOperStatusLowerLayerDown = 7 | 	IfOperStatusLowerLayerDown = 7 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | const ( | ||||||
|  | 	IF_MAX_PHYS_ADDRESS_LENGTH = 32 | ||||||
|  | 	IF_MAX_STRING_SIZE         = 256 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // MIB_IF_ENTRY_LEVEL enumeration from netioapi.h or
 | ||||||
|  | // https://learn.microsoft.com/en-us/windows/win32/api/netioapi/nf-netioapi-getifentry2ex.
 | ||||||
|  | const ( | ||||||
|  | 	MibIfEntryNormal                  = 0 | ||||||
|  | 	MibIfEntryNormalWithoutStatistics = 2 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // MIB_NOTIFICATION_TYPE enumeration from netioapi.h or
 | ||||||
|  | // https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ne-netioapi-mib_notification_type.
 | ||||||
|  | const ( | ||||||
|  | 	MibParameterNotification = 0 | ||||||
|  | 	MibAddInstance           = 1 | ||||||
|  | 	MibDeleteInstance        = 2 | ||||||
|  | 	MibInitialNotification   = 3 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // MibIfRow2 stores information about a particular interface. See
 | ||||||
|  | // https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_if_row2.
 | ||||||
|  | type MibIfRow2 struct { | ||||||
|  | 	InterfaceLuid               uint64 | ||||||
|  | 	InterfaceIndex              uint32 | ||||||
|  | 	InterfaceGuid               GUID | ||||||
|  | 	Alias                       [IF_MAX_STRING_SIZE + 1]uint16 | ||||||
|  | 	Description                 [IF_MAX_STRING_SIZE + 1]uint16 | ||||||
|  | 	PhysicalAddressLength       uint32 | ||||||
|  | 	PhysicalAddress             [IF_MAX_PHYS_ADDRESS_LENGTH]uint8 | ||||||
|  | 	PermanentPhysicalAddress    [IF_MAX_PHYS_ADDRESS_LENGTH]uint8 | ||||||
|  | 	Mtu                         uint32 | ||||||
|  | 	Type                        uint32 | ||||||
|  | 	TunnelType                  uint32 | ||||||
|  | 	MediaType                   uint32 | ||||||
|  | 	PhysicalMediumType          uint32 | ||||||
|  | 	AccessType                  uint32 | ||||||
|  | 	DirectionType               uint32 | ||||||
|  | 	InterfaceAndOperStatusFlags uint8 | ||||||
|  | 	OperStatus                  uint32 | ||||||
|  | 	AdminStatus                 uint32 | ||||||
|  | 	MediaConnectState           uint32 | ||||||
|  | 	NetworkGuid                 GUID | ||||||
|  | 	ConnectionType              uint32 | ||||||
|  | 	TransmitLinkSpeed           uint64 | ||||||
|  | 	ReceiveLinkSpeed            uint64 | ||||||
|  | 	InOctets                    uint64 | ||||||
|  | 	InUcastPkts                 uint64 | ||||||
|  | 	InNUcastPkts                uint64 | ||||||
|  | 	InDiscards                  uint64 | ||||||
|  | 	InErrors                    uint64 | ||||||
|  | 	InUnknownProtos             uint64 | ||||||
|  | 	InUcastOctets               uint64 | ||||||
|  | 	InMulticastOctets           uint64 | ||||||
|  | 	InBroadcastOctets           uint64 | ||||||
|  | 	OutOctets                   uint64 | ||||||
|  | 	OutUcastPkts                uint64 | ||||||
|  | 	OutNUcastPkts               uint64 | ||||||
|  | 	OutDiscards                 uint64 | ||||||
|  | 	OutErrors                   uint64 | ||||||
|  | 	OutUcastOctets              uint64 | ||||||
|  | 	OutMulticastOctets          uint64 | ||||||
|  | 	OutBroadcastOctets          uint64 | ||||||
|  | 	OutQLen                     uint64 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // MIB_UNICASTIPADDRESS_ROW stores information about a unicast IP address. See
 | ||||||
|  | // https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_unicastipaddress_row.
 | ||||||
|  | type MibUnicastIpAddressRow struct { | ||||||
|  | 	Address            RawSockaddrInet6 // SOCKADDR_INET union
 | ||||||
|  | 	InterfaceLuid      uint64 | ||||||
|  | 	InterfaceIndex     uint32 | ||||||
|  | 	PrefixOrigin       uint32 | ||||||
|  | 	SuffixOrigin       uint32 | ||||||
|  | 	ValidLifetime      uint32 | ||||||
|  | 	PreferredLifetime  uint32 | ||||||
|  | 	OnLinkPrefixLength uint8 | ||||||
|  | 	SkipAsSource       uint8 | ||||||
|  | 	DadState           uint32 | ||||||
|  | 	ScopeId            uint32 | ||||||
|  | 	CreationTimeStamp  Filetime | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ScopeLevelCount = 16 | ||||||
|  | 
 | ||||||
|  | // MIB_IPINTERFACE_ROW stores interface management information for a particular IP address family on a network interface.
 | ||||||
|  | // See https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_ipinterface_row.
 | ||||||
|  | type MibIpInterfaceRow struct { | ||||||
|  | 	Family                               uint16 | ||||||
|  | 	InterfaceLuid                        uint64 | ||||||
|  | 	InterfaceIndex                       uint32 | ||||||
|  | 	MaxReassemblySize                    uint32 | ||||||
|  | 	InterfaceIdentifier                  uint64 | ||||||
|  | 	MinRouterAdvertisementInterval       uint32 | ||||||
|  | 	MaxRouterAdvertisementInterval       uint32 | ||||||
|  | 	AdvertisingEnabled                   uint8 | ||||||
|  | 	ForwardingEnabled                    uint8 | ||||||
|  | 	WeakHostSend                         uint8 | ||||||
|  | 	WeakHostReceive                      uint8 | ||||||
|  | 	UseAutomaticMetric                   uint8 | ||||||
|  | 	UseNeighborUnreachabilityDetection   uint8 | ||||||
|  | 	ManagedAddressConfigurationSupported uint8 | ||||||
|  | 	OtherStatefulConfigurationSupported  uint8 | ||||||
|  | 	AdvertiseDefaultRoute                uint8 | ||||||
|  | 	RouterDiscoveryBehavior              uint32 | ||||||
|  | 	DadTransmits                         uint32 | ||||||
|  | 	BaseReachableTime                    uint32 | ||||||
|  | 	RetransmitTime                       uint32 | ||||||
|  | 	PathMtuDiscoveryTimeout              uint32 | ||||||
|  | 	LinkLocalAddressBehavior             uint32 | ||||||
|  | 	LinkLocalAddressTimeout              uint32 | ||||||
|  | 	ZoneIndices                          [ScopeLevelCount]uint32 | ||||||
|  | 	SitePrefixLength                     uint32 | ||||||
|  | 	Metric                               uint32 | ||||||
|  | 	NlMtu                                uint32 | ||||||
|  | 	Connected                            uint8 | ||||||
|  | 	SupportsWakeUpPatterns               uint8 | ||||||
|  | 	SupportsNeighborDiscovery            uint8 | ||||||
|  | 	SupportsRouterDiscovery              uint8 | ||||||
|  | 	ReachableTime                        uint32 | ||||||
|  | 	TransmitOffload                      uint32 | ||||||
|  | 	ReceiveOffload                       uint32 | ||||||
|  | 	DisableDefaultRoutes                 uint8 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Console related constants used for the mode parameter to SetConsoleMode. See
 | // Console related constants used for the mode parameter to SetConsoleMode. See
 | ||||||
| // https://docs.microsoft.com/en-us/windows/console/setconsolemode for details.
 | // https://docs.microsoft.com/en-us/windows/console/setconsolemode for details.
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -181,10 +181,15 @@ var ( | ||||||
| 	procDnsRecordListFree                                    = moddnsapi.NewProc("DnsRecordListFree") | 	procDnsRecordListFree                                    = moddnsapi.NewProc("DnsRecordListFree") | ||||||
| 	procDwmGetWindowAttribute                                = moddwmapi.NewProc("DwmGetWindowAttribute") | 	procDwmGetWindowAttribute                                = moddwmapi.NewProc("DwmGetWindowAttribute") | ||||||
| 	procDwmSetWindowAttribute                                = moddwmapi.NewProc("DwmSetWindowAttribute") | 	procDwmSetWindowAttribute                                = moddwmapi.NewProc("DwmSetWindowAttribute") | ||||||
|  | 	procCancelMibChangeNotify2                               = modiphlpapi.NewProc("CancelMibChangeNotify2") | ||||||
| 	procGetAdaptersAddresses                                 = modiphlpapi.NewProc("GetAdaptersAddresses") | 	procGetAdaptersAddresses                                 = modiphlpapi.NewProc("GetAdaptersAddresses") | ||||||
| 	procGetAdaptersInfo                                      = modiphlpapi.NewProc("GetAdaptersInfo") | 	procGetAdaptersInfo                                      = modiphlpapi.NewProc("GetAdaptersInfo") | ||||||
| 	procGetBestInterfaceEx                                   = modiphlpapi.NewProc("GetBestInterfaceEx") | 	procGetBestInterfaceEx                                   = modiphlpapi.NewProc("GetBestInterfaceEx") | ||||||
| 	procGetIfEntry                                           = modiphlpapi.NewProc("GetIfEntry") | 	procGetIfEntry                                           = modiphlpapi.NewProc("GetIfEntry") | ||||||
|  | 	procGetIfEntry2Ex                                        = modiphlpapi.NewProc("GetIfEntry2Ex") | ||||||
|  | 	procGetUnicastIpAddressEntry                             = modiphlpapi.NewProc("GetUnicastIpAddressEntry") | ||||||
|  | 	procNotifyIpInterfaceChange                              = modiphlpapi.NewProc("NotifyIpInterfaceChange") | ||||||
|  | 	procNotifyUnicastIpAddressChange                         = modiphlpapi.NewProc("NotifyUnicastIpAddressChange") | ||||||
| 	procAddDllDirectory                                      = modkernel32.NewProc("AddDllDirectory") | 	procAddDllDirectory                                      = modkernel32.NewProc("AddDllDirectory") | ||||||
| 	procAssignProcessToJobObject                             = modkernel32.NewProc("AssignProcessToJobObject") | 	procAssignProcessToJobObject                             = modkernel32.NewProc("AssignProcessToJobObject") | ||||||
| 	procCancelIo                                             = modkernel32.NewProc("CancelIo") | 	procCancelIo                                             = modkernel32.NewProc("CancelIo") | ||||||
|  | @ -1606,6 +1611,14 @@ func DwmSetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, si | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func CancelMibChangeNotify2(notificationHandle Handle) (errcode error) { | ||||||
|  | 	r0, _, _ := syscall.SyscallN(procCancelMibChangeNotify2.Addr(), uintptr(notificationHandle)) | ||||||
|  | 	if r0 != 0 { | ||||||
|  | 		errcode = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) { | func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) { | ||||||
| 	r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0) | 	r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0) | ||||||
| 	if r0 != 0 { | 	if r0 != 0 { | ||||||
|  | @ -1638,6 +1651,46 @@ func GetIfEntry(pIfRow *MibIfRow) (errcode error) { | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func GetIfEntry2Ex(level uint32, row *MibIfRow2) (errcode error) { | ||||||
|  | 	r0, _, _ := syscall.SyscallN(procGetIfEntry2Ex.Addr(), uintptr(level), uintptr(unsafe.Pointer(row))) | ||||||
|  | 	if r0 != 0 { | ||||||
|  | 		errcode = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) { | ||||||
|  | 	r0, _, _ := syscall.SyscallN(procGetUnicastIpAddressEntry.Addr(), uintptr(unsafe.Pointer(row))) | ||||||
|  | 	if r0 != 0 { | ||||||
|  | 		errcode = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NotifyIpInterfaceChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) { | ||||||
|  | 	var _p0 uint32 | ||||||
|  | 	if initialNotification { | ||||||
|  | 		_p0 = 1 | ||||||
|  | 	} | ||||||
|  | 	r0, _, _ := syscall.SyscallN(procNotifyIpInterfaceChange.Addr(), uintptr(family), uintptr(callback), uintptr(callerContext), uintptr(_p0), uintptr(unsafe.Pointer(notificationHandle))) | ||||||
|  | 	if r0 != 0 { | ||||||
|  | 		errcode = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NotifyUnicastIpAddressChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) { | ||||||
|  | 	var _p0 uint32 | ||||||
|  | 	if initialNotification { | ||||||
|  | 		_p0 = 1 | ||||||
|  | 	} | ||||||
|  | 	r0, _, _ := syscall.SyscallN(procNotifyUnicastIpAddressChange.Addr(), uintptr(family), uintptr(callback), uintptr(callerContext), uintptr(_p0), uintptr(unsafe.Pointer(notificationHandle))) | ||||||
|  | 	if r0 != 0 { | ||||||
|  | 		errcode = syscall.Errno(r0) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func AddDllDirectory(path *uint16) (cookie uintptr, err error) { | func AddDllDirectory(path *uint16) (cookie uintptr, err error) { | ||||||
| 	r0, _, e1 := syscall.Syscall(procAddDllDirectory.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) | 	r0, _, e1 := syscall.Syscall(procAddDllDirectory.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) | ||||||
| 	cookie = uintptr(r0) | 	cookie = uintptr(r0) | ||||||
|  |  | ||||||
|  | @ -4,16 +4,13 @@ | ||||||
| 
 | 
 | ||||||
| This repository provides Go terminal and console support packages. | This repository provides Go terminal and console support packages. | ||||||
| 
 | 
 | ||||||
| ## Download/Install |  | ||||||
| 
 |  | ||||||
| The easiest way to install is to run `go get -u golang.org/x/term`. You can |  | ||||||
| also manually git clone the repository to `$GOPATH/src/golang.org/x/term`. |  | ||||||
| 
 |  | ||||||
| ## Report Issues / Send Patches | ## Report Issues / Send Patches | ||||||
| 
 | 
 | ||||||
| This repository uses Gerrit for code changes. To learn how to submit changes to | This repository uses Gerrit for code changes. To learn how to submit changes to | ||||||
| this repository, see https://golang.org/doc/contribute.html. | this repository, see https://go.dev/doc/contribute. | ||||||
|  | 
 | ||||||
|  | The git repository is https://go.googlesource.com/term. | ||||||
| 
 | 
 | ||||||
| The main issue tracker for the term repository is located at | The main issue tracker for the term repository is located at | ||||||
| https://github.com/golang/go/issues. Prefix your issue with "x/term:" in the | https://go.dev/issues. Prefix your issue with "x/term:" in the | ||||||
| subject line, so it is easy to find. | subject line, so it is easy to find. | ||||||
|  |  | ||||||
|  | @ -236,7 +236,7 @@ go.uber.org/zap/zaptest | ||||||
| golang.org/x/mod/internal/lazyregexp | golang.org/x/mod/internal/lazyregexp | ||||||
| golang.org/x/mod/module | golang.org/x/mod/module | ||||||
| golang.org/x/mod/semver | golang.org/x/mod/semver | ||||||
| # golang.org/x/net v0.30.0 | # golang.org/x/net v0.31.0 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| golang.org/x/net/context | golang.org/x/net/context | ||||||
| golang.org/x/net/http/httpguts | golang.org/x/net/http/httpguts | ||||||
|  | @ -252,20 +252,20 @@ golang.org/x/net/trace | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| golang.org/x/oauth2 | golang.org/x/oauth2 | ||||||
| golang.org/x/oauth2/internal | golang.org/x/oauth2/internal | ||||||
| # golang.org/x/sync v0.8.0 | # golang.org/x/sync v0.9.0 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| golang.org/x/sync/errgroup | golang.org/x/sync/errgroup | ||||||
| golang.org/x/sync/semaphore | golang.org/x/sync/semaphore | ||||||
| golang.org/x/sync/singleflight | golang.org/x/sync/singleflight | ||||||
| # golang.org/x/sys v0.26.0 | # golang.org/x/sys v0.27.0 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| golang.org/x/sys/plan9 | golang.org/x/sys/plan9 | ||||||
| golang.org/x/sys/unix | golang.org/x/sys/unix | ||||||
| golang.org/x/sys/windows | golang.org/x/sys/windows | ||||||
| # golang.org/x/term v0.25.0 | # golang.org/x/term v0.26.0 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| golang.org/x/term | golang.org/x/term | ||||||
| # golang.org/x/text v0.19.0 | # golang.org/x/text v0.20.0 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| golang.org/x/text/secure/bidirule | golang.org/x/text/secure/bidirule | ||||||
| golang.org/x/text/transform | golang.org/x/text/transform | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue