Merge pull request #939 from antechrestos/feature/tidy_dependencies
Tidy dependencies
This commit is contained in:
		
						commit
						3b6411d83f
					
				
							
								
								
									
										3
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										3
									
								
								go.mod
								
								
								
								
							|  | @ -34,7 +34,6 @@ require ( | |||
| 	github.com/genuinetools/amicontained v0.4.3 | ||||
| 	github.com/ghodss/yaml v1.0.0 // indirect | ||||
| 	github.com/gliderlabs/ssh v0.2.2 // indirect | ||||
| 	github.com/go-ini/ini v1.38.1 // indirect | ||||
| 	github.com/gogo/protobuf v1.1.1 // indirect | ||||
| 	github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect | ||||
| 	github.com/golang/protobuf v1.1.0 // indirect | ||||
|  | @ -84,7 +83,6 @@ require ( | |||
| 	github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273 // indirect | ||||
| 	github.com/sergi/go-diff v1.0.0 // indirect | ||||
| 	github.com/sirupsen/logrus v1.4.2 | ||||
| 	github.com/smartystreets/goconvey v1.6.4 // indirect | ||||
| 	github.com/spf13/afero v1.2.1 | ||||
| 	github.com/spf13/cobra v0.0.3 | ||||
| 	github.com/spf13/pflag v1.0.1 | ||||
|  | @ -104,7 +102,6 @@ require ( | |||
| 	google.golang.org/genproto v0.0.0-20180731170733-daca94659cb5 // indirect | ||||
| 	google.golang.org/grpc v1.2.1-0.20180320012744-8124abf74e76 // indirect | ||||
| 	gopkg.in/inf.v0 v0.9.1 // indirect | ||||
| 	gopkg.in/ini.v1 v1.51.0 // indirect | ||||
| 	gopkg.in/src-d/go-billy.v4 v4.2.0 // indirect | ||||
| 	gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 // indirect | ||||
| 	gopkg.in/src-d/go-git.v4 v4.6.0 | ||||
|  |  | |||
							
								
								
									
										18
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										18
									
								
								go.sum
								
								
								
								
							|  | @ -22,8 +22,6 @@ github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBb | |||
| github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= | ||||
| github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= | ||||
| github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= | ||||
| github.com/aws/aws-sdk-go v1.15.2 h1:RH309yOKW4FwEHbRmTsY/bVP8RlldMxBvu3u74wnTVc= | ||||
| github.com/aws/aws-sdk-go v1.15.2/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= | ||||
| github.com/aws/aws-sdk-go v1.25.19 h1:sp3xP91qIAVhWufyn9qM6Zhhn6kX06WJQcmhRj7QTXc= | ||||
| github.com/aws/aws-sdk-go v1.25.19/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= | ||||
| github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= | ||||
|  | @ -72,9 +70,6 @@ github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= | |||
| github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | ||||
| github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= | ||||
| github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= | ||||
| github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= | ||||
| github.com/go-ini/ini v1.38.1 h1:hbtfM8emWUVo9GnXSloXYyFbXxZ+tG6sbepSStoe1FY= | ||||
| github.com/go-ini/ini v1.38.1/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= | ||||
| github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= | ||||
| github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= | ||||
| github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= | ||||
|  | @ -108,8 +103,6 @@ github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk | |||
| github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= | ||||
| github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g= | ||||
| github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | ||||
| github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= | ||||
| github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= | ||||
| github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= | ||||
|  | @ -128,15 +121,11 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH | |||
| github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= | ||||
| github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= | ||||
| github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= | ||||
| github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8 h1:12VvqtR6Aowv3l/EQUlocDHW2Cp4G9WJVH7uyH8QFJE= | ||||
| github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= | ||||
| github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= | ||||
| github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= | ||||
| github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||
| github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be h1:AHimNtVIpiBjPUhEF5KNCkrUyqTSA5zWUl8sQ2bfGBE= | ||||
| github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||
| github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= | ||||
| github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= | ||||
| github.com/karrick/godirwalk v1.7.7 h1:lLkPCA+C0u1pI4fLFseaupvh5/THlPJIqSPmnGGViKs= | ||||
| github.com/karrick/godirwalk v1.7.7/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= | ||||
| github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e h1:RgQk53JHp/Cjunrr1WlsXSZpqXn+uREuHvUVcK82CV8= | ||||
|  | @ -214,10 +203,6 @@ github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= | |||
| github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= | ||||
| github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= | ||||
| github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= | ||||
| github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= | ||||
| github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= | ||||
| github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= | ||||
| github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | ||||
| github.com/spf13/afero v1.2.1 h1:qgMbHoJbPbw579P+1zVY+6n4nIFuIchaIjzZ/I/Yq8M= | ||||
| github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= | ||||
| github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= | ||||
|  | @ -265,7 +250,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |||
| golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 h1:+DCIGbF/swA92ohVg0//6X2IVY3KZs6p9mix0ziNYJM= | ||||
| golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| google.golang.org/api v0.0.0-20180730000901-31ca0e01cd79 h1:wCy2/9bhO1JeP2zZUALrj7ZdZuZoR4mRV57kTxjqRpo= | ||||
| google.golang.org/api v0.0.0-20180730000901-31ca0e01cd79/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= | ||||
| google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs= | ||||
|  | @ -279,8 +263,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33 | |||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= | ||||
| gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= | ||||
| gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= | ||||
| gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | ||||
| gopkg.in/src-d/go-billy.v4 v4.2.0 h1:VGbrP1EsYxtvVPEiHui+4//imr4E5MGEFLx66bQtusg= | ||||
| gopkg.in/src-d/go-billy.v4 v4.2.0/go.mod h1:ZHSF0JP+7oD97194otDUCD7Ofbk63+xFcfWP5bT6h+Q= | ||||
| gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= | ||||
|  |  | |||
|  | @ -1,97 +0,0 @@ | |||
| // +build ignore
 | ||||
| 
 | ||||
| // Simple tool to create an archive stream from an old and new directory
 | ||||
| //
 | ||||
| // By default it will stream the comparison of two temporary directories with junk files
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"path" | ||||
| 
 | ||||
| 	"github.com/docker/docker/pkg/archive" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	flDebug  = flag.Bool("D", false, "debugging output") | ||||
| 	flNewDir = flag.String("newdir", "", "") | ||||
| 	flOldDir = flag.String("olddir", "", "") | ||||
| 	log      = logrus.New() | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	flag.Usage = func() { | ||||
| 		fmt.Println("Produce a tar from comparing two directory paths. By default a demo tar is created of around 200 files (including hardlinks)") | ||||
| 		fmt.Printf("%s [OPTIONS]\n", os.Args[0]) | ||||
| 		flag.PrintDefaults() | ||||
| 	} | ||||
| 	flag.Parse() | ||||
| 	log.Out = os.Stderr | ||||
| 	if (len(os.Getenv("DEBUG")) > 0) || *flDebug { | ||||
| 		logrus.SetLevel(logrus.DebugLevel) | ||||
| 	} | ||||
| 	var newDir, oldDir string | ||||
| 
 | ||||
| 	if len(*flNewDir) == 0 { | ||||
| 		var err error | ||||
| 		newDir, err = ioutil.TempDir("", "docker-test-newDir") | ||||
| 		if err != nil { | ||||
| 			log.Fatal(err) | ||||
| 		} | ||||
| 		defer os.RemoveAll(newDir) | ||||
| 		if _, err := prepareUntarSourceDirectory(100, newDir, true); err != nil { | ||||
| 			log.Fatal(err) | ||||
| 		} | ||||
| 	} else { | ||||
| 		newDir = *flNewDir | ||||
| 	} | ||||
| 
 | ||||
| 	if len(*flOldDir) == 0 { | ||||
| 		oldDir, err := ioutil.TempDir("", "docker-test-oldDir") | ||||
| 		if err != nil { | ||||
| 			log.Fatal(err) | ||||
| 		} | ||||
| 		defer os.RemoveAll(oldDir) | ||||
| 	} else { | ||||
| 		oldDir = *flOldDir | ||||
| 	} | ||||
| 
 | ||||
| 	changes, err := archive.ChangesDirs(newDir, oldDir) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 
 | ||||
| 	a, err := archive.ExportChanges(newDir, changes) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 	defer a.Close() | ||||
| 
 | ||||
| 	i, err := io.Copy(os.Stdout, a) | ||||
| 	if err != nil && err != io.EOF { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 	fmt.Fprintf(os.Stderr, "wrote archive of %d bytes", i) | ||||
| } | ||||
| 
 | ||||
| func prepareUntarSourceDirectory(numberOfFiles int, targetPath string, makeLinks bool) (int, error) { | ||||
| 	fileData := []byte("fooo") | ||||
| 	for n := 0; n < numberOfFiles; n++ { | ||||
| 		fileName := fmt.Sprintf("file-%d", n) | ||||
| 		if err := ioutil.WriteFile(path.Join(targetPath, fileName), fileData, 0700); err != nil { | ||||
| 			return 0, err | ||||
| 		} | ||||
| 		if makeLinks { | ||||
| 			if err := os.Link(path.Join(targetPath, fileName), path.Join(targetPath, fileName+"-link")); err != nil { | ||||
| 				return 0, err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	totalSize := numberOfFiles * len(fileData) | ||||
| 	return totalSize, nil | ||||
| } | ||||
|  | @ -1,76 +0,0 @@ | |||
| // Copyright 2014 Google Inc.
 | ||||
| //
 | ||||
| // Licensed under the Apache License, Version 2.0 (the "License");
 | ||||
| // you may not use this file except in compliance with the License.
 | ||||
| // You may obtain a copy of the License at
 | ||||
| //
 | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| //
 | ||||
| // Unless required by applicable law or agreed to in writing, software
 | ||||
| // distributed under the License is distributed on an "AS IS" BASIS,
 | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| // This binary compares memory usage between btree and gollrb.
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"math/rand" | ||||
| 	"runtime" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/google/btree" | ||||
| 	"github.com/petar/GoLLRB/llrb" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	size   = flag.Int("size", 1000000, "size of the tree to build") | ||||
| 	degree = flag.Int("degree", 8, "degree of btree") | ||||
| 	gollrb = flag.Bool("llrb", false, "use llrb instead of btree") | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
| 	vals := rand.Perm(*size) | ||||
| 	var t, v interface{} | ||||
| 	v = vals | ||||
| 	var stats runtime.MemStats | ||||
| 	for i := 0; i < 10; i++ { | ||||
| 		runtime.GC() | ||||
| 	} | ||||
| 	fmt.Println("-------- BEFORE ----------") | ||||
| 	runtime.ReadMemStats(&stats) | ||||
| 	fmt.Printf("%+v\n", stats) | ||||
| 	start := time.Now() | ||||
| 	if *gollrb { | ||||
| 		tr := llrb.New() | ||||
| 		for _, v := range vals { | ||||
| 			tr.ReplaceOrInsert(llrb.Int(v)) | ||||
| 		} | ||||
| 		t = tr // keep it around
 | ||||
| 	} else { | ||||
| 		tr := btree.New(*degree) | ||||
| 		for _, v := range vals { | ||||
| 			tr.ReplaceOrInsert(btree.Int(v)) | ||||
| 		} | ||||
| 		t = tr // keep it around
 | ||||
| 	} | ||||
| 	fmt.Printf("%v inserts in %v\n", *size, time.Since(start)) | ||||
| 	fmt.Println("-------- AFTER ----------") | ||||
| 	runtime.ReadMemStats(&stats) | ||||
| 	fmt.Printf("%+v\n", stats) | ||||
| 	for i := 0; i < 10; i++ { | ||||
| 		runtime.GC() | ||||
| 	} | ||||
| 	fmt.Println("-------- AFTER GC ----------") | ||||
| 	runtime.ReadMemStats(&stats) | ||||
| 	fmt.Printf("%+v\n", stats) | ||||
| 	if t == v { | ||||
| 		fmt.Println("to make sure vals and tree aren't GC'd") | ||||
| 	} | ||||
| } | ||||
|  | @ -1,332 +0,0 @@ | |||
| // Copyright 2017 The go-github AUTHORS. All rights reserved.
 | ||||
| //
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| // gen-accessors generates accessor methods for structs with pointer fields.
 | ||||
| //
 | ||||
| // It is meant to be used by the go-github authors in conjunction with the
 | ||||
| // go generate tool before sending a commit to GitHub.
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"go/ast" | ||||
| 	"go/format" | ||||
| 	"go/parser" | ||||
| 	"go/token" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| 	"text/template" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	fileSuffix = "-accessors.go" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	verbose = flag.Bool("v", false, "Print verbose log messages") | ||||
| 
 | ||||
| 	sourceTmpl = template.Must(template.New("source").Parse(source)) | ||||
| 
 | ||||
| 	// blacklistStructMethod lists "struct.method" combos to skip.
 | ||||
| 	blacklistStructMethod = map[string]bool{ | ||||
| 		"RepositoryContent.GetContent":    true, | ||||
| 		"Client.GetBaseURL":               true, | ||||
| 		"Client.GetUploadURL":             true, | ||||
| 		"ErrorResponse.GetResponse":       true, | ||||
| 		"RateLimitError.GetResponse":      true, | ||||
| 		"AbuseRateLimitError.GetResponse": true, | ||||
| 	} | ||||
| 	// blacklistStruct lists structs to skip.
 | ||||
| 	blacklistStruct = map[string]bool{ | ||||
| 		"Client": true, | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| func logf(fmt string, args ...interface{}) { | ||||
| 	if *verbose { | ||||
| 		log.Printf(fmt, args...) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
| 	fset := token.NewFileSet() | ||||
| 
 | ||||
| 	pkgs, err := parser.ParseDir(fset, ".", sourceFilter, 0) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	for pkgName, pkg := range pkgs { | ||||
| 		t := &templateData{ | ||||
| 			filename: pkgName + fileSuffix, | ||||
| 			Year:     2017, | ||||
| 			Package:  pkgName, | ||||
| 			Imports:  map[string]string{}, | ||||
| 		} | ||||
| 		for filename, f := range pkg.Files { | ||||
| 			logf("Processing %v...", filename) | ||||
| 			if err := t.processAST(f); err != nil { | ||||
| 				log.Fatal(err) | ||||
| 			} | ||||
| 		} | ||||
| 		if err := t.dump(); err != nil { | ||||
| 			log.Fatal(err) | ||||
| 		} | ||||
| 	} | ||||
| 	logf("Done.") | ||||
| } | ||||
| 
 | ||||
| func (t *templateData) processAST(f *ast.File) error { | ||||
| 	for _, decl := range f.Decls { | ||||
| 		gd, ok := decl.(*ast.GenDecl) | ||||
| 		if !ok { | ||||
| 			continue | ||||
| 		} | ||||
| 		for _, spec := range gd.Specs { | ||||
| 			ts, ok := spec.(*ast.TypeSpec) | ||||
| 			if !ok { | ||||
| 				continue | ||||
| 			} | ||||
| 			// Skip unexported identifiers.
 | ||||
| 			if !ts.Name.IsExported() { | ||||
| 				logf("Struct %v is unexported; skipping.", ts.Name) | ||||
| 				continue | ||||
| 			} | ||||
| 			// Check if the struct is blacklisted.
 | ||||
| 			if blacklistStruct[ts.Name.Name] { | ||||
| 				logf("Struct %v is blacklisted; skipping.", ts.Name) | ||||
| 				continue | ||||
| 			} | ||||
| 			st, ok := ts.Type.(*ast.StructType) | ||||
| 			if !ok { | ||||
| 				continue | ||||
| 			} | ||||
| 			for _, field := range st.Fields.List { | ||||
| 				se, ok := field.Type.(*ast.StarExpr) | ||||
| 				if len(field.Names) == 0 || !ok { | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				fieldName := field.Names[0] | ||||
| 				// Skip unexported identifiers.
 | ||||
| 				if !fieldName.IsExported() { | ||||
| 					logf("Field %v is unexported; skipping.", fieldName) | ||||
| 					continue | ||||
| 				} | ||||
| 				// Check if "struct.method" is blacklisted.
 | ||||
| 				if key := fmt.Sprintf("%v.Get%v", ts.Name, fieldName); blacklistStructMethod[key] { | ||||
| 					logf("Method %v is blacklisted; skipping.", key) | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				switch x := se.X.(type) { | ||||
| 				case *ast.ArrayType: | ||||
| 					t.addArrayType(x, ts.Name.String(), fieldName.String()) | ||||
| 				case *ast.Ident: | ||||
| 					t.addIdent(x, ts.Name.String(), fieldName.String()) | ||||
| 				case *ast.MapType: | ||||
| 					t.addMapType(x, ts.Name.String(), fieldName.String()) | ||||
| 				case *ast.SelectorExpr: | ||||
| 					t.addSelectorExpr(x, ts.Name.String(), fieldName.String()) | ||||
| 				default: | ||||
| 					logf("processAST: type %q, field %q, unknown %T: %+v", ts.Name, fieldName, x, x) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func sourceFilter(fi os.FileInfo) bool { | ||||
| 	return !strings.HasSuffix(fi.Name(), "_test.go") && !strings.HasSuffix(fi.Name(), fileSuffix) | ||||
| } | ||||
| 
 | ||||
| func (t *templateData) dump() error { | ||||
| 	if len(t.Getters) == 0 { | ||||
| 		logf("No getters for %v; skipping.", t.filename) | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	// Sort getters by ReceiverType.FieldName.
 | ||||
| 	sort.Sort(byName(t.Getters)) | ||||
| 
 | ||||
| 	var buf bytes.Buffer | ||||
| 	if err := sourceTmpl.Execute(&buf, t); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	clean, err := format.Source(buf.Bytes()) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	logf("Writing %v...", t.filename) | ||||
| 	return ioutil.WriteFile(t.filename, clean, 0644) | ||||
| } | ||||
| 
 | ||||
| func newGetter(receiverType, fieldName, fieldType, zeroValue string, namedStruct bool) *getter { | ||||
| 	return &getter{ | ||||
| 		sortVal:      strings.ToLower(receiverType) + "." + strings.ToLower(fieldName), | ||||
| 		ReceiverVar:  strings.ToLower(receiverType[:1]), | ||||
| 		ReceiverType: receiverType, | ||||
| 		FieldName:    fieldName, | ||||
| 		FieldType:    fieldType, | ||||
| 		ZeroValue:    zeroValue, | ||||
| 		NamedStruct:  namedStruct, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (t *templateData) addArrayType(x *ast.ArrayType, receiverType, fieldName string) { | ||||
| 	var eltType string | ||||
| 	switch elt := x.Elt.(type) { | ||||
| 	case *ast.Ident: | ||||
| 		eltType = elt.String() | ||||
| 	default: | ||||
| 		logf("addArrayType: type %q, field %q: unknown elt type: %T %+v; skipping.", receiverType, fieldName, elt, elt) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	t.Getters = append(t.Getters, newGetter(receiverType, fieldName, "[]"+eltType, "nil", false)) | ||||
| } | ||||
| 
 | ||||
| func (t *templateData) addIdent(x *ast.Ident, receiverType, fieldName string) { | ||||
| 	var zeroValue string | ||||
| 	var namedStruct = false | ||||
| 	switch x.String() { | ||||
| 	case "int", "int64": | ||||
| 		zeroValue = "0" | ||||
| 	case "string": | ||||
| 		zeroValue = `""` | ||||
| 	case "bool": | ||||
| 		zeroValue = "false" | ||||
| 	case "Timestamp": | ||||
| 		zeroValue = "Timestamp{}" | ||||
| 	default: | ||||
| 		zeroValue = "nil" | ||||
| 		namedStruct = true | ||||
| 	} | ||||
| 
 | ||||
| 	t.Getters = append(t.Getters, newGetter(receiverType, fieldName, x.String(), zeroValue, namedStruct)) | ||||
| } | ||||
| 
 | ||||
| func (t *templateData) addMapType(x *ast.MapType, receiverType, fieldName string) { | ||||
| 	var keyType string | ||||
| 	switch key := x.Key.(type) { | ||||
| 	case *ast.Ident: | ||||
| 		keyType = key.String() | ||||
| 	default: | ||||
| 		logf("addMapType: type %q, field %q: unknown key type: %T %+v; skipping.", receiverType, fieldName, key, key) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	var valueType string | ||||
| 	switch value := x.Value.(type) { | ||||
| 	case *ast.Ident: | ||||
| 		valueType = value.String() | ||||
| 	default: | ||||
| 		logf("addMapType: type %q, field %q: unknown value type: %T %+v; skipping.", receiverType, fieldName, value, value) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	fieldType := fmt.Sprintf("map[%v]%v", keyType, valueType) | ||||
| 	zeroValue := fmt.Sprintf("map[%v]%v{}", keyType, valueType) | ||||
| 	t.Getters = append(t.Getters, newGetter(receiverType, fieldName, fieldType, zeroValue, false)) | ||||
| } | ||||
| 
 | ||||
| func (t *templateData) addSelectorExpr(x *ast.SelectorExpr, receiverType, fieldName string) { | ||||
| 	if strings.ToLower(fieldName[:1]) == fieldName[:1] { // Non-exported field.
 | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	var xX string | ||||
| 	if xx, ok := x.X.(*ast.Ident); ok { | ||||
| 		xX = xx.String() | ||||
| 	} | ||||
| 
 | ||||
| 	switch xX { | ||||
| 	case "time", "json": | ||||
| 		if xX == "json" { | ||||
| 			t.Imports["encoding/json"] = "encoding/json" | ||||
| 		} else { | ||||
| 			t.Imports[xX] = xX | ||||
| 		} | ||||
| 		fieldType := fmt.Sprintf("%v.%v", xX, x.Sel.Name) | ||||
| 		zeroValue := fmt.Sprintf("%v.%v{}", xX, x.Sel.Name) | ||||
| 		if xX == "time" && x.Sel.Name == "Duration" { | ||||
| 			zeroValue = "0" | ||||
| 		} | ||||
| 		t.Getters = append(t.Getters, newGetter(receiverType, fieldName, fieldType, zeroValue, false)) | ||||
| 	default: | ||||
| 		logf("addSelectorExpr: xX %q, type %q, field %q: unknown x=%+v; skipping.", xX, receiverType, fieldName, x) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| type templateData struct { | ||||
| 	filename string | ||||
| 	Year     int | ||||
| 	Package  string | ||||
| 	Imports  map[string]string | ||||
| 	Getters  []*getter | ||||
| } | ||||
| 
 | ||||
| type getter struct { | ||||
| 	sortVal      string // Lower-case version of "ReceiverType.FieldName".
 | ||||
| 	ReceiverVar  string // The one-letter variable name to match the ReceiverType.
 | ||||
| 	ReceiverType string | ||||
| 	FieldName    string | ||||
| 	FieldType    string | ||||
| 	ZeroValue    string | ||||
| 	NamedStruct  bool // Getter for named struct.
 | ||||
| } | ||||
| 
 | ||||
| type byName []*getter | ||||
| 
 | ||||
| func (b byName) Len() int           { return len(b) } | ||||
| func (b byName) Less(i, j int) bool { return b[i].sortVal < b[j].sortVal } | ||||
| func (b byName) Swap(i, j int)      { b[i], b[j] = b[j], b[i] } | ||||
| 
 | ||||
| const source = `// Copyright {{.Year}} The go-github AUTHORS. All rights reserved.
 | ||||
| //
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // Code generated by gen-accessors; DO NOT EDIT.
 | ||||
| 
 | ||||
| package {{.Package}} | ||||
| {{with .Imports}} | ||||
| import ( | ||||
|   {{- range . -}} | ||||
|   "{{.}}" | ||||
|   {{end -}} | ||||
| ) | ||||
| {{end}} | ||||
| {{range .Getters}} | ||||
| {{if .NamedStruct}} | ||||
| // Get{{.FieldName}} returns the {{.FieldName}} field.
 | ||||
| func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() *{{.FieldType}} { | ||||
|   if {{.ReceiverVar}} == nil { | ||||
|     return {{.ZeroValue}} | ||||
|   } | ||||
|   return {{.ReceiverVar}}.{{.FieldName}} | ||||
| } | ||||
| {{else}} | ||||
| // Get{{.FieldName}} returns the {{.FieldName}} field if it's non-nil, zero value otherwise.
 | ||||
| func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() {{.FieldType}} { | ||||
|   if {{.ReceiverVar}} == nil || {{.ReceiverVar}}.{{.FieldName}} == nil { | ||||
|     return {{.ZeroValue}} | ||||
|   } | ||||
|   return *{{.ReceiverVar}}.{{.FieldName}} | ||||
| } | ||||
| {{end}} | ||||
| {{end}} | ||||
| ` | ||||
|  | @ -1,61 +0,0 @@ | |||
| // Copyright 2018 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| // mkasm_darwin.go generates assembly trampolines to call libSystem routines from Go.
 | ||||
| //This program must be run after mksyscall.go.
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	in1, err := ioutil.ReadFile("syscall_darwin.go") | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("can't open syscall_darwin.go: %s", err) | ||||
| 	} | ||||
| 	arch := os.Args[1] | ||||
| 	in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_darwin_%s.go", arch)) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("can't open syscall_darwin_%s.go: %s", arch, err) | ||||
| 	} | ||||
| 	in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.go", arch)) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("can't open zsyscall_darwin_%s.go: %s", arch, err) | ||||
| 	} | ||||
| 	in := string(in1) + string(in2) + string(in3) | ||||
| 
 | ||||
| 	trampolines := map[string]bool{} | ||||
| 
 | ||||
| 	var out bytes.Buffer | ||||
| 
 | ||||
| 	fmt.Fprintf(&out, "// go run mkasm_darwin.go %s\n", strings.Join(os.Args[1:], " ")) | ||||
| 	fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n") | ||||
| 	fmt.Fprintf(&out, "\n") | ||||
| 	fmt.Fprintf(&out, "// +build go1.12\n") | ||||
| 	fmt.Fprintf(&out, "\n") | ||||
| 	fmt.Fprintf(&out, "#include \"textflag.h\"\n") | ||||
| 	for _, line := range strings.Split(in, "\n") { | ||||
| 		if !strings.HasPrefix(line, "func ") || !strings.HasSuffix(line, "_trampoline()") { | ||||
| 			continue | ||||
| 		} | ||||
| 		fn := line[5 : len(line)-13] | ||||
| 		if !trampolines[fn] { | ||||
| 			trampolines[fn] = true | ||||
| 			fmt.Fprintf(&out, "TEXT ·%s_trampoline(SB),NOSPLIT,$0-0\n", fn) | ||||
| 			fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn) | ||||
| 		} | ||||
| 	} | ||||
| 	err = ioutil.WriteFile(fmt.Sprintf("zsyscall_darwin_%s.s", arch), out.Bytes(), 0644) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("can't write zsyscall_darwin_%s.s: %s", arch, err) | ||||
| 	} | ||||
| } | ||||
|  | @ -1,106 +0,0 @@ | |||
| // Copyright 2016 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| // mkpost processes the output of cgo -godefs to
 | ||||
| // modify the generated types. It is used to clean up
 | ||||
| // the sys API in an architecture specific manner.
 | ||||
| //
 | ||||
| // mkpost is run after cgo -godefs; see README.md.
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"go/format" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"regexp" | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	// Get the OS and architecture (using GOARCH_TARGET if it exists)
 | ||||
| 	goos := os.Getenv("GOOS") | ||||
| 	goarch := os.Getenv("GOARCH_TARGET") | ||||
| 	if goarch == "" { | ||||
| 		goarch = os.Getenv("GOARCH") | ||||
| 	} | ||||
| 	// Check that we are using the Docker-based build system if we should be.
 | ||||
| 	if goos == "linux" { | ||||
| 		if os.Getenv("GOLANG_SYS_BUILD") != "docker" { | ||||
| 			os.Stderr.WriteString("In the Docker-based build system, mkpost should not be called directly.\n") | ||||
| 			os.Stderr.WriteString("See README.md\n") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	b, err := ioutil.ReadAll(os.Stdin) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 
 | ||||
| 	// Intentionally export __val fields in Fsid and Sigset_t
 | ||||
| 	valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`) | ||||
| 	b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}")) | ||||
| 
 | ||||
| 	// Intentionally export __fds_bits field in FdSet
 | ||||
| 	fdSetRegex := regexp.MustCompile(`type (FdSet) struct {(\s+)X__fds_bits(\s+\S+\s+)}`) | ||||
| 	b = fdSetRegex.ReplaceAll(b, []byte("type $1 struct {${2}Bits$3}")) | ||||
| 
 | ||||
| 	// If we have empty Ptrace structs, we should delete them. Only s390x emits
 | ||||
| 	// nonempty Ptrace structs.
 | ||||
| 	ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) | ||||
| 	b = ptraceRexexp.ReplaceAll(b, nil) | ||||
| 
 | ||||
| 	// Replace the control_regs union with a blank identifier for now.
 | ||||
| 	controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`) | ||||
| 	b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64")) | ||||
| 
 | ||||
| 	// Remove fields that are added by glibc
 | ||||
| 	// Note that this is unstable as the identifers are private.
 | ||||
| 	removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`) | ||||
| 	b = removeFieldsRegex.ReplaceAll(b, []byte("_")) | ||||
| 
 | ||||
| 	// Convert [65]int8 to [65]byte in Utsname members to simplify
 | ||||
| 	// conversion to string; see golang.org/issue/20753
 | ||||
| 	convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) | ||||
| 	b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) | ||||
| 
 | ||||
| 	// Convert [1024]int8 to [1024]byte in Ptmget members
 | ||||
| 	convertPtmget := regexp.MustCompile(`([SC]n)(\s+)\[(\d+)\]u?int8`) | ||||
| 	b = convertPtmget.ReplaceAll(b, []byte("$1[$3]byte")) | ||||
| 
 | ||||
| 	// Remove spare fields (e.g. in Statx_t)
 | ||||
| 	spareFieldsRegex := regexp.MustCompile(`X__spare\S*`) | ||||
| 	b = spareFieldsRegex.ReplaceAll(b, []byte("_")) | ||||
| 
 | ||||
| 	// Remove cgo padding fields
 | ||||
| 	removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`) | ||||
| 	b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_")) | ||||
| 
 | ||||
| 	// Remove padding, hidden, or unused fields
 | ||||
| 	removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`) | ||||
| 	b = removeFieldsRegex.ReplaceAll(b, []byte("_")) | ||||
| 
 | ||||
| 	// Remove the first line of warning from cgo
 | ||||
| 	b = b[bytes.IndexByte(b, '\n')+1:] | ||||
| 	// Modify the command in the header to include:
 | ||||
| 	//  mkpost, our own warning, and a build tag.
 | ||||
| 	replacement := fmt.Sprintf(`$1 | go run mkpost.go | ||||
| // Code generated by the command above; see README.md. DO NOT EDIT.
 | ||||
| 
 | ||||
| // +build %s,%s`, goarch, goos)
 | ||||
| 	cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) | ||||
| 	b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) | ||||
| 
 | ||||
| 	// gofmt
 | ||||
| 	b, err = format.Source(b) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 
 | ||||
| 	os.Stdout.Write(b) | ||||
| } | ||||
|  | @ -1,407 +0,0 @@ | |||
| // Copyright 2018 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| /* | ||||
| This program reads a file containing function prototypes | ||||
| (like syscall_darwin.go) and generates system call bodies. | ||||
| The prototypes are marked by lines beginning with "//sys" | ||||
| and read like func declarations if //sys is replaced by func, but:
 | ||||
| 	* The parameter lists must give a name for each argument. | ||||
| 	  This includes return parameters. | ||||
| 	* The parameter lists must give a type for each argument: | ||||
| 	  the (x, y, z int) shorthand is not allowed. | ||||
| 	* If the return parameter is an error number, it must be named errno. | ||||
| 
 | ||||
| A line beginning with //sysnb is like //sys, except that the
 | ||||
| goroutine will not be suspended during the execution of the system | ||||
| call.  This must only be used for system calls which can never | ||||
| block, as otherwise the system call could cause all goroutines to | ||||
| hang. | ||||
| */ | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	b32       = flag.Bool("b32", false, "32bit big-endian") | ||||
| 	l32       = flag.Bool("l32", false, "32bit little-endian") | ||||
| 	plan9     = flag.Bool("plan9", false, "plan9") | ||||
| 	openbsd   = flag.Bool("openbsd", false, "openbsd") | ||||
| 	netbsd    = flag.Bool("netbsd", false, "netbsd") | ||||
| 	dragonfly = flag.Bool("dragonfly", false, "dragonfly") | ||||
| 	arm       = flag.Bool("arm", false, "arm") // 64-bit value should use (even, odd)-pair
 | ||||
| 	tags      = flag.String("tags", "", "build tags") | ||||
| 	filename  = flag.String("output", "", "output file name (standard output if omitted)") | ||||
| ) | ||||
| 
 | ||||
| // cmdLine returns this programs's commandline arguments
 | ||||
| func cmdLine() string { | ||||
| 	return "go run mksyscall.go " + strings.Join(os.Args[1:], " ") | ||||
| } | ||||
| 
 | ||||
| // buildTags returns build tags
 | ||||
| func buildTags() string { | ||||
| 	return *tags | ||||
| } | ||||
| 
 | ||||
| // Param is function parameter
 | ||||
| type Param struct { | ||||
| 	Name string | ||||
| 	Type string | ||||
| } | ||||
| 
 | ||||
| // usage prints the program usage
 | ||||
| func usage() { | ||||
| 	fmt.Fprintf(os.Stderr, "usage: go run mksyscall.go [-b32 | -l32] [-tags x,y] [file ...]\n") | ||||
| 	os.Exit(1) | ||||
| } | ||||
| 
 | ||||
| // parseParamList parses parameter list and returns a slice of parameters
 | ||||
| func parseParamList(list string) []string { | ||||
| 	list = strings.TrimSpace(list) | ||||
| 	if list == "" { | ||||
| 		return []string{} | ||||
| 	} | ||||
| 	return regexp.MustCompile(`\s*,\s*`).Split(list, -1) | ||||
| } | ||||
| 
 | ||||
| // parseParam splits a parameter into name and type
 | ||||
| func parseParam(p string) Param { | ||||
| 	ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) | ||||
| 	if ps == nil { | ||||
| 		fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| 	return Param{ps[1], ps[2]} | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	// Get the OS and architecture (using GOARCH_TARGET if it exists)
 | ||||
| 	goos := os.Getenv("GOOS") | ||||
| 	if goos == "" { | ||||
| 		fmt.Fprintln(os.Stderr, "GOOS not defined in environment") | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| 	goarch := os.Getenv("GOARCH_TARGET") | ||||
| 	if goarch == "" { | ||||
| 		goarch = os.Getenv("GOARCH") | ||||
| 	} | ||||
| 
 | ||||
| 	// Check that we are using the Docker-based build system if we should
 | ||||
| 	if goos == "linux" { | ||||
| 		if os.Getenv("GOLANG_SYS_BUILD") != "docker" { | ||||
| 			fmt.Fprintf(os.Stderr, "In the Docker-based build system, mksyscall should not be called directly.\n") | ||||
| 			fmt.Fprintf(os.Stderr, "See README.md\n") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	flag.Usage = usage | ||||
| 	flag.Parse() | ||||
| 	if len(flag.Args()) <= 0 { | ||||
| 		fmt.Fprintf(os.Stderr, "no files to parse provided\n") | ||||
| 		usage() | ||||
| 	} | ||||
| 
 | ||||
| 	endianness := "" | ||||
| 	if *b32 { | ||||
| 		endianness = "big-endian" | ||||
| 	} else if *l32 { | ||||
| 		endianness = "little-endian" | ||||
| 	} | ||||
| 
 | ||||
| 	libc := false | ||||
| 	if goos == "darwin" && strings.Contains(buildTags(), ",go1.12") { | ||||
| 		libc = true | ||||
| 	} | ||||
| 	trampolines := map[string]bool{} | ||||
| 
 | ||||
| 	text := "" | ||||
| 	for _, path := range flag.Args() { | ||||
| 		file, err := os.Open(path) | ||||
| 		if err != nil { | ||||
| 			fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		s := bufio.NewScanner(file) | ||||
| 		for s.Scan() { | ||||
| 			t := s.Text() | ||||
| 			t = strings.TrimSpace(t) | ||||
| 			t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) | ||||
| 			nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) | ||||
| 			if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			// Line must be of the form
 | ||||
| 			//	func Open(path string, mode int, perm int) (fd int, errno error)
 | ||||
| 			// Split into name, in params, out params.
 | ||||
| 			f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$`).FindStringSubmatch(t) | ||||
| 			if f == nil { | ||||
| 				fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 			funct, inps, outps, sysname := f[2], f[3], f[4], f[5] | ||||
| 
 | ||||
| 			// ClockGettime doesn't have a syscall number on Darwin, only generate libc wrappers.
 | ||||
| 			if goos == "darwin" && !libc && funct == "ClockGettime" { | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			// Split argument lists on comma.
 | ||||
| 			in := parseParamList(inps) | ||||
| 			out := parseParamList(outps) | ||||
| 
 | ||||
| 			// Try in vain to keep people from editing this file.
 | ||||
| 			// The theory is that they jump into the middle of the file
 | ||||
| 			// without reading the header.
 | ||||
| 			text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" | ||||
| 
 | ||||
| 			// Go function header.
 | ||||
| 			outDecl := "" | ||||
| 			if len(out) > 0 { | ||||
| 				outDecl = fmt.Sprintf(" (%s)", strings.Join(out, ", ")) | ||||
| 			} | ||||
| 			text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outDecl) | ||||
| 
 | ||||
| 			// Check if err return available
 | ||||
| 			errvar := "" | ||||
| 			for _, param := range out { | ||||
| 				p := parseParam(param) | ||||
| 				if p.Type == "error" { | ||||
| 					errvar = p.Name | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			// Prepare arguments to Syscall.
 | ||||
| 			var args []string | ||||
| 			n := 0 | ||||
| 			for _, param := range in { | ||||
| 				p := parseParam(param) | ||||
| 				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { | ||||
| 					args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") | ||||
| 				} else if p.Type == "string" && errvar != "" { | ||||
| 					text += fmt.Sprintf("\tvar _p%d *byte\n", n) | ||||
| 					text += fmt.Sprintf("\t_p%d, %s = BytePtrFromString(%s)\n", n, errvar, p.Name) | ||||
| 					text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) | ||||
| 					args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) | ||||
| 					n++ | ||||
| 				} else if p.Type == "string" { | ||||
| 					fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") | ||||
| 					text += fmt.Sprintf("\tvar _p%d *byte\n", n) | ||||
| 					text += fmt.Sprintf("\t_p%d, _ = BytePtrFromString(%s)\n", n, p.Name) | ||||
| 					args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) | ||||
| 					n++ | ||||
| 				} else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { | ||||
| 					// Convert slice into pointer, length.
 | ||||
| 					// Have to be careful not to take address of &a[0] if len == 0:
 | ||||
| 					// pass dummy pointer in that case.
 | ||||
| 					// Used to pass nil, but some OSes or simulators reject write(fd, nil, 0).
 | ||||
| 					text += fmt.Sprintf("\tvar _p%d unsafe.Pointer\n", n) | ||||
| 					text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = unsafe.Pointer(&%s[0])\n\t}", p.Name, n, p.Name) | ||||
| 					text += fmt.Sprintf(" else {\n\t\t_p%d = unsafe.Pointer(&_zero)\n\t}\n", n) | ||||
| 					args = append(args, fmt.Sprintf("uintptr(_p%d)", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) | ||||
| 					n++ | ||||
| 				} else if p.Type == "int64" && (*openbsd || *netbsd) { | ||||
| 					args = append(args, "0") | ||||
| 					if endianness == "big-endian" { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					} else if endianness == "little-endian" { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) | ||||
| 					} else { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					} | ||||
| 				} else if p.Type == "int64" && *dragonfly { | ||||
| 					if regexp.MustCompile(`^(?i)extp(read|write)`).FindStringSubmatch(funct) == nil { | ||||
| 						args = append(args, "0") | ||||
| 					} | ||||
| 					if endianness == "big-endian" { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					} else if endianness == "little-endian" { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) | ||||
| 					} else { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					} | ||||
| 				} else if (p.Type == "int64" || p.Type == "uint64") && endianness != "" { | ||||
| 					if len(args)%2 == 1 && *arm { | ||||
| 						// arm abi specifies 64-bit argument uses
 | ||||
| 						// (even, odd) pair
 | ||||
| 						args = append(args, "0") | ||||
| 					} | ||||
| 					if endianness == "big-endian" { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					} else { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) | ||||
| 					} | ||||
| 				} else { | ||||
| 					args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			// Determine which form to use; pad args with zeros.
 | ||||
| 			asm := "Syscall" | ||||
| 			if nonblock != nil { | ||||
| 				if errvar == "" && goos == "linux" { | ||||
| 					asm = "RawSyscallNoError" | ||||
| 				} else { | ||||
| 					asm = "RawSyscall" | ||||
| 				} | ||||
| 			} else { | ||||
| 				if errvar == "" && goos == "linux" { | ||||
| 					asm = "SyscallNoError" | ||||
| 				} | ||||
| 			} | ||||
| 			if len(args) <= 3 { | ||||
| 				for len(args) < 3 { | ||||
| 					args = append(args, "0") | ||||
| 				} | ||||
| 			} else if len(args) <= 6 { | ||||
| 				asm += "6" | ||||
| 				for len(args) < 6 { | ||||
| 					args = append(args, "0") | ||||
| 				} | ||||
| 			} else if len(args) <= 9 { | ||||
| 				asm += "9" | ||||
| 				for len(args) < 9 { | ||||
| 					args = append(args, "0") | ||||
| 				} | ||||
| 			} else { | ||||
| 				fmt.Fprintf(os.Stderr, "%s:%s too many arguments to system call\n", path, funct) | ||||
| 			} | ||||
| 
 | ||||
| 			// System call number.
 | ||||
| 			if sysname == "" { | ||||
| 				sysname = "SYS_" + funct | ||||
| 				sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) | ||||
| 				sysname = strings.ToUpper(sysname) | ||||
| 			} | ||||
| 
 | ||||
| 			var libcFn string | ||||
| 			if libc { | ||||
| 				asm = "syscall_" + strings.ToLower(asm[:1]) + asm[1:] // internal syscall call
 | ||||
| 				sysname = strings.TrimPrefix(sysname, "SYS_")         // remove SYS_
 | ||||
| 				sysname = strings.ToLower(sysname)                    // lowercase
 | ||||
| 				if sysname == "getdirentries64" { | ||||
| 					// Special case - libSystem name and
 | ||||
| 					// raw syscall name don't match.
 | ||||
| 					sysname = "__getdirentries64" | ||||
| 				} | ||||
| 				libcFn = sysname | ||||
| 				sysname = "funcPC(libc_" + sysname + "_trampoline)" | ||||
| 			} | ||||
| 
 | ||||
| 			// Actual call.
 | ||||
| 			arglist := strings.Join(args, ", ") | ||||
| 			call := fmt.Sprintf("%s(%s, %s)", asm, sysname, arglist) | ||||
| 
 | ||||
| 			// Assign return values.
 | ||||
| 			body := "" | ||||
| 			ret := []string{"_", "_", "_"} | ||||
| 			doErrno := false | ||||
| 			for i := 0; i < len(out); i++ { | ||||
| 				p := parseParam(out[i]) | ||||
| 				reg := "" | ||||
| 				if p.Name == "err" && !*plan9 { | ||||
| 					reg = "e1" | ||||
| 					ret[2] = reg | ||||
| 					doErrno = true | ||||
| 				} else if p.Name == "err" && *plan9 { | ||||
| 					ret[0] = "r0" | ||||
| 					ret[2] = "e1" | ||||
| 					break | ||||
| 				} else { | ||||
| 					reg = fmt.Sprintf("r%d", i) | ||||
| 					ret[i] = reg | ||||
| 				} | ||||
| 				if p.Type == "bool" { | ||||
| 					reg = fmt.Sprintf("%s != 0", reg) | ||||
| 				} | ||||
| 				if p.Type == "int64" && endianness != "" { | ||||
| 					// 64-bit number in r1:r0 or r0:r1.
 | ||||
| 					if i+2 > len(out) { | ||||
| 						fmt.Fprintf(os.Stderr, "%s:%s not enough registers for int64 return\n", path, funct) | ||||
| 					} | ||||
| 					if endianness == "big-endian" { | ||||
| 						reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) | ||||
| 					} else { | ||||
| 						reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) | ||||
| 					} | ||||
| 					ret[i] = fmt.Sprintf("r%d", i) | ||||
| 					ret[i+1] = fmt.Sprintf("r%d", i+1) | ||||
| 				} | ||||
| 				if reg != "e1" || *plan9 { | ||||
| 					body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) | ||||
| 				} | ||||
| 			} | ||||
| 			if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { | ||||
| 				text += fmt.Sprintf("\t%s\n", call) | ||||
| 			} else { | ||||
| 				if errvar == "" && goos == "linux" { | ||||
| 					// raw syscall without error on Linux, see golang.org/issue/22924
 | ||||
| 					text += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], call) | ||||
| 				} else { | ||||
| 					text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) | ||||
| 				} | ||||
| 			} | ||||
| 			text += body | ||||
| 
 | ||||
| 			if *plan9 && ret[2] == "e1" { | ||||
| 				text += "\tif int32(r0) == -1 {\n" | ||||
| 				text += "\t\terr = e1\n" | ||||
| 				text += "\t}\n" | ||||
| 			} else if doErrno { | ||||
| 				text += "\tif e1 != 0 {\n" | ||||
| 				text += "\t\terr = errnoErr(e1)\n" | ||||
| 				text += "\t}\n" | ||||
| 			} | ||||
| 			text += "\treturn\n" | ||||
| 			text += "}\n\n" | ||||
| 
 | ||||
| 			if libc && !trampolines[libcFn] { | ||||
| 				// some system calls share a trampoline, like read and readlen.
 | ||||
| 				trampolines[libcFn] = true | ||||
| 				// Declare assembly trampoline.
 | ||||
| 				text += fmt.Sprintf("func libc_%s_trampoline()\n", libcFn) | ||||
| 				// Assembly trampoline calls the libc_* function, which this magic
 | ||||
| 				// redirects to use the function from libSystem.
 | ||||
| 				text += fmt.Sprintf("//go:linkname libc_%s libc_%s\n", libcFn, libcFn) | ||||
| 				text += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"/usr/lib/libSystem.B.dylib\"\n", libcFn, libcFn) | ||||
| 				text += "\n" | ||||
| 			} | ||||
| 		} | ||||
| 		if err := s.Err(); err != nil { | ||||
| 			fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		file.Close() | ||||
| 	} | ||||
| 	fmt.Printf(srcTemplate, cmdLine(), buildTags(), text) | ||||
| } | ||||
| 
 | ||||
| const srcTemplate = `// %s
 | ||||
| // Code generated by the command above; see README.md. DO NOT EDIT.
 | ||||
| 
 | ||||
| // +build %s
 | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| import ( | ||||
| 	"syscall" | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| var _ syscall.Errno | ||||
| 
 | ||||
| %s | ||||
| ` | ||||
|  | @ -1,415 +0,0 @@ | |||
| // Copyright 2019 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| /* | ||||
| This program reads a file containing function prototypes | ||||
| (like syscall_aix.go) and generates system call bodies. | ||||
| The prototypes are marked by lines beginning with "//sys" | ||||
| and read like func declarations if //sys is replaced by func, but:
 | ||||
| 	* The parameter lists must give a name for each argument. | ||||
| 	  This includes return parameters. | ||||
| 	* The parameter lists must give a type for each argument: | ||||
| 	  the (x, y, z int) shorthand is not allowed. | ||||
| 	* If the return parameter is an error number, it must be named err. | ||||
| 	* If go func name needs to be different than its libc name, | ||||
| 	* or the function is not in libc, name could be specified | ||||
| 	* at the end, after "=" sign, like | ||||
| 	  //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt
 | ||||
| */ | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	b32  = flag.Bool("b32", false, "32bit big-endian") | ||||
| 	l32  = flag.Bool("l32", false, "32bit little-endian") | ||||
| 	aix  = flag.Bool("aix", false, "aix") | ||||
| 	tags = flag.String("tags", "", "build tags") | ||||
| ) | ||||
| 
 | ||||
| // cmdLine returns this programs's commandline arguments
 | ||||
| func cmdLine() string { | ||||
| 	return "go run mksyscall_aix_ppc.go " + strings.Join(os.Args[1:], " ") | ||||
| } | ||||
| 
 | ||||
| // buildTags returns build tags
 | ||||
| func buildTags() string { | ||||
| 	return *tags | ||||
| } | ||||
| 
 | ||||
| // Param is function parameter
 | ||||
| type Param struct { | ||||
| 	Name string | ||||
| 	Type string | ||||
| } | ||||
| 
 | ||||
| // usage prints the program usage
 | ||||
| func usage() { | ||||
| 	fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc.go [-b32 | -l32] [-tags x,y] [file ...]\n") | ||||
| 	os.Exit(1) | ||||
| } | ||||
| 
 | ||||
| // parseParamList parses parameter list and returns a slice of parameters
 | ||||
| func parseParamList(list string) []string { | ||||
| 	list = strings.TrimSpace(list) | ||||
| 	if list == "" { | ||||
| 		return []string{} | ||||
| 	} | ||||
| 	return regexp.MustCompile(`\s*,\s*`).Split(list, -1) | ||||
| } | ||||
| 
 | ||||
| // parseParam splits a parameter into name and type
 | ||||
| func parseParam(p string) Param { | ||||
| 	ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) | ||||
| 	if ps == nil { | ||||
| 		fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| 	return Param{ps[1], ps[2]} | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	flag.Usage = usage | ||||
| 	flag.Parse() | ||||
| 	if len(flag.Args()) <= 0 { | ||||
| 		fmt.Fprintf(os.Stderr, "no files to parse provided\n") | ||||
| 		usage() | ||||
| 	} | ||||
| 
 | ||||
| 	endianness := "" | ||||
| 	if *b32 { | ||||
| 		endianness = "big-endian" | ||||
| 	} else if *l32 { | ||||
| 		endianness = "little-endian" | ||||
| 	} | ||||
| 
 | ||||
| 	pack := "" | ||||
| 	text := "" | ||||
| 	cExtern := "/*\n#include <stdint.h>\n#include <stddef.h>\n" | ||||
| 	for _, path := range flag.Args() { | ||||
| 		file, err := os.Open(path) | ||||
| 		if err != nil { | ||||
| 			fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		s := bufio.NewScanner(file) | ||||
| 		for s.Scan() { | ||||
| 			t := s.Text() | ||||
| 			t = strings.TrimSpace(t) | ||||
| 			t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) | ||||
| 			if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { | ||||
| 				pack = p[1] | ||||
| 			} | ||||
| 			nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) | ||||
| 			if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			// Line must be of the form
 | ||||
| 			//	func Open(path string, mode int, perm int) (fd int, err error)
 | ||||
| 			// Split into name, in params, out params.
 | ||||
| 			f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) | ||||
| 			if f == nil { | ||||
| 				fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 			funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] | ||||
| 
 | ||||
| 			// Split argument lists on comma.
 | ||||
| 			in := parseParamList(inps) | ||||
| 			out := parseParamList(outps) | ||||
| 
 | ||||
| 			inps = strings.Join(in, ", ") | ||||
| 			outps = strings.Join(out, ", ") | ||||
| 
 | ||||
| 			// Try in vain to keep people from editing this file.
 | ||||
| 			// The theory is that they jump into the middle of the file
 | ||||
| 			// without reading the header.
 | ||||
| 			text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" | ||||
| 
 | ||||
| 			// Check if value return, err return available
 | ||||
| 			errvar := "" | ||||
| 			retvar := "" | ||||
| 			rettype := "" | ||||
| 			for _, param := range out { | ||||
| 				p := parseParam(param) | ||||
| 				if p.Type == "error" { | ||||
| 					errvar = p.Name | ||||
| 				} else { | ||||
| 					retvar = p.Name | ||||
| 					rettype = p.Type | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			// System call name.
 | ||||
| 			if sysname == "" { | ||||
| 				sysname = funct | ||||
| 			} | ||||
| 			sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) | ||||
| 			sysname = strings.ToLower(sysname) // All libc functions are lowercase.
 | ||||
| 
 | ||||
| 			cRettype := "" | ||||
| 			if rettype == "unsafe.Pointer" { | ||||
| 				cRettype = "uintptr_t" | ||||
| 			} else if rettype == "uintptr" { | ||||
| 				cRettype = "uintptr_t" | ||||
| 			} else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { | ||||
| 				cRettype = "uintptr_t" | ||||
| 			} else if rettype == "int" { | ||||
| 				cRettype = "int" | ||||
| 			} else if rettype == "int32" { | ||||
| 				cRettype = "int" | ||||
| 			} else if rettype == "int64" { | ||||
| 				cRettype = "long long" | ||||
| 			} else if rettype == "uint32" { | ||||
| 				cRettype = "unsigned int" | ||||
| 			} else if rettype == "uint64" { | ||||
| 				cRettype = "unsigned long long" | ||||
| 			} else { | ||||
| 				cRettype = "int" | ||||
| 			} | ||||
| 			if sysname == "exit" { | ||||
| 				cRettype = "void" | ||||
| 			} | ||||
| 
 | ||||
| 			// Change p.Types to c
 | ||||
| 			var cIn []string | ||||
| 			for _, param := range in { | ||||
| 				p := parseParam(param) | ||||
| 				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { | ||||
| 					cIn = append(cIn, "uintptr_t") | ||||
| 				} else if p.Type == "string" { | ||||
| 					cIn = append(cIn, "uintptr_t") | ||||
| 				} else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { | ||||
| 					cIn = append(cIn, "uintptr_t", "size_t") | ||||
| 				} else if p.Type == "unsafe.Pointer" { | ||||
| 					cIn = append(cIn, "uintptr_t") | ||||
| 				} else if p.Type == "uintptr" { | ||||
| 					cIn = append(cIn, "uintptr_t") | ||||
| 				} else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { | ||||
| 					cIn = append(cIn, "uintptr_t") | ||||
| 				} else if p.Type == "int" { | ||||
| 					cIn = append(cIn, "int") | ||||
| 				} else if p.Type == "int32" { | ||||
| 					cIn = append(cIn, "int") | ||||
| 				} else if p.Type == "int64" { | ||||
| 					cIn = append(cIn, "long long") | ||||
| 				} else if p.Type == "uint32" { | ||||
| 					cIn = append(cIn, "unsigned int") | ||||
| 				} else if p.Type == "uint64" { | ||||
| 					cIn = append(cIn, "unsigned long long") | ||||
| 				} else { | ||||
| 					cIn = append(cIn, "int") | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			if funct != "fcntl" && funct != "FcntlInt" && funct != "readlen" && funct != "writelen" { | ||||
| 				if sysname == "select" { | ||||
| 					// select is a keyword of Go. Its name is
 | ||||
| 					// changed to c_select.
 | ||||
| 					cExtern += "#define c_select select\n" | ||||
| 				} | ||||
| 				// Imports of system calls from libc
 | ||||
| 				cExtern += fmt.Sprintf("%s %s", cRettype, sysname) | ||||
| 				cIn := strings.Join(cIn, ", ") | ||||
| 				cExtern += fmt.Sprintf("(%s);\n", cIn) | ||||
| 			} | ||||
| 
 | ||||
| 			// So file name.
 | ||||
| 			if *aix { | ||||
| 				if modname == "" { | ||||
| 					modname = "libc.a/shr_64.o" | ||||
| 				} else { | ||||
| 					fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) | ||||
| 					os.Exit(1) | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			strconvfunc := "C.CString" | ||||
| 
 | ||||
| 			// Go function header.
 | ||||
| 			if outps != "" { | ||||
| 				outps = fmt.Sprintf(" (%s)", outps) | ||||
| 			} | ||||
| 			if text != "" { | ||||
| 				text += "\n" | ||||
| 			} | ||||
| 
 | ||||
| 			text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) | ||||
| 
 | ||||
| 			// Prepare arguments to Syscall.
 | ||||
| 			var args []string | ||||
| 			n := 0 | ||||
| 			argN := 0 | ||||
| 			for _, param := range in { | ||||
| 				p := parseParam(param) | ||||
| 				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { | ||||
| 					args = append(args, "C.uintptr_t(uintptr(unsafe.Pointer("+p.Name+")))") | ||||
| 				} else if p.Type == "string" && errvar != "" { | ||||
| 					text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) | ||||
| 					args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) | ||||
| 					n++ | ||||
| 				} else if p.Type == "string" { | ||||
| 					fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") | ||||
| 					text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) | ||||
| 					args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) | ||||
| 					n++ | ||||
| 				} else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { | ||||
| 					// Convert slice into pointer, length.
 | ||||
| 					// Have to be careful not to take address of &a[0] if len == 0:
 | ||||
| 					// pass nil in that case.
 | ||||
| 					text += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) | ||||
| 					text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) | ||||
| 					args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(unsafe.Pointer(_p%d)))", n)) | ||||
| 					n++ | ||||
| 					text += fmt.Sprintf("\tvar _p%d int\n", n) | ||||
| 					text += fmt.Sprintf("\t_p%d = len(%s)\n", n, p.Name) | ||||
| 					args = append(args, fmt.Sprintf("C.size_t(_p%d)", n)) | ||||
| 					n++ | ||||
| 				} else if p.Type == "int64" && endianness != "" { | ||||
| 					if endianness == "big-endian" { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					} else { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) | ||||
| 					} | ||||
| 					n++ | ||||
| 				} else if p.Type == "bool" { | ||||
| 					text += fmt.Sprintf("\tvar _p%d uint32\n", n) | ||||
| 					text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) | ||||
| 					args = append(args, fmt.Sprintf("_p%d", n)) | ||||
| 				} else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { | ||||
| 					args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) | ||||
| 				} else if p.Type == "unsafe.Pointer" { | ||||
| 					args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) | ||||
| 				} else if p.Type == "int" { | ||||
| 					if (argN == 2) && ((funct == "readlen") || (funct == "writelen")) { | ||||
| 						args = append(args, fmt.Sprintf("C.size_t(%s)", p.Name)) | ||||
| 					} else if argN == 0 && funct == "fcntl" { | ||||
| 						args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) | ||||
| 					} else if (argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt")) { | ||||
| 						args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) | ||||
| 					} else { | ||||
| 						args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) | ||||
| 					} | ||||
| 				} else if p.Type == "int32" { | ||||
| 					args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) | ||||
| 				} else if p.Type == "int64" { | ||||
| 					args = append(args, fmt.Sprintf("C.longlong(%s)", p.Name)) | ||||
| 				} else if p.Type == "uint32" { | ||||
| 					args = append(args, fmt.Sprintf("C.uint(%s)", p.Name)) | ||||
| 				} else if p.Type == "uint64" { | ||||
| 					args = append(args, fmt.Sprintf("C.ulonglong(%s)", p.Name)) | ||||
| 				} else if p.Type == "uintptr" { | ||||
| 					args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) | ||||
| 				} else { | ||||
| 					args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) | ||||
| 				} | ||||
| 				argN++ | ||||
| 			} | ||||
| 
 | ||||
| 			// Actual call.
 | ||||
| 			arglist := strings.Join(args, ", ") | ||||
| 			call := "" | ||||
| 			if sysname == "exit" { | ||||
| 				if errvar != "" { | ||||
| 					call += "er :=" | ||||
| 				} else { | ||||
| 					call += "" | ||||
| 				} | ||||
| 			} else if errvar != "" { | ||||
| 				call += "r0,er :=" | ||||
| 			} else if retvar != "" { | ||||
| 				call += "r0,_ :=" | ||||
| 			} else { | ||||
| 				call += "" | ||||
| 			} | ||||
| 			if sysname == "select" { | ||||
| 				// select is a keyword of Go. Its name is
 | ||||
| 				// changed to c_select.
 | ||||
| 				call += fmt.Sprintf("C.c_%s(%s)", sysname, arglist) | ||||
| 			} else { | ||||
| 				call += fmt.Sprintf("C.%s(%s)", sysname, arglist) | ||||
| 			} | ||||
| 
 | ||||
| 			// Assign return values.
 | ||||
| 			body := "" | ||||
| 			for i := 0; i < len(out); i++ { | ||||
| 				p := parseParam(out[i]) | ||||
| 				reg := "" | ||||
| 				if p.Name == "err" { | ||||
| 					reg = "e1" | ||||
| 				} else { | ||||
| 					reg = "r0" | ||||
| 				} | ||||
| 				if reg != "e1" { | ||||
| 					body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			// verify return
 | ||||
| 			if sysname != "exit" && errvar != "" { | ||||
| 				if regexp.MustCompile(`^uintptr`).FindStringSubmatch(cRettype) != nil { | ||||
| 					body += "\tif (uintptr(r0) ==^uintptr(0) && er != nil) {\n" | ||||
| 					body += fmt.Sprintf("\t\t%s = er\n", errvar) | ||||
| 					body += "\t}\n" | ||||
| 				} else { | ||||
| 					body += "\tif (r0 ==-1 && er != nil) {\n" | ||||
| 					body += fmt.Sprintf("\t\t%s = er\n", errvar) | ||||
| 					body += "\t}\n" | ||||
| 				} | ||||
| 			} else if errvar != "" { | ||||
| 				body += "\tif (er != nil) {\n" | ||||
| 				body += fmt.Sprintf("\t\t%s = er\n", errvar) | ||||
| 				body += "\t}\n" | ||||
| 			} | ||||
| 
 | ||||
| 			text += fmt.Sprintf("\t%s\n", call) | ||||
| 			text += body | ||||
| 
 | ||||
| 			text += "\treturn\n" | ||||
| 			text += "}\n" | ||||
| 		} | ||||
| 		if err := s.Err(); err != nil { | ||||
| 			fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		file.Close() | ||||
| 	} | ||||
| 	imp := "" | ||||
| 	if pack != "unix" { | ||||
| 		imp = "import \"golang.org/x/sys/unix\"\n" | ||||
| 
 | ||||
| 	} | ||||
| 	fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, cExtern, imp, text) | ||||
| } | ||||
| 
 | ||||
| const srcTemplate = `// %s
 | ||||
| // Code generated by the command above; see README.md. DO NOT EDIT.
 | ||||
| 
 | ||||
| // +build %s
 | ||||
| 
 | ||||
| package %s | ||||
| 
 | ||||
| 
 | ||||
| %s | ||||
| */ | ||||
| import "C" | ||||
| import ( | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| %s | ||||
| 
 | ||||
| %s | ||||
| ` | ||||
|  | @ -1,614 +0,0 @@ | |||
| // Copyright 2019 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| /* | ||||
| This program reads a file containing function prototypes | ||||
| (like syscall_aix.go) and generates system call bodies. | ||||
| The prototypes are marked by lines beginning with "//sys" | ||||
| and read like func declarations if //sys is replaced by func, but:
 | ||||
| 	* The parameter lists must give a name for each argument. | ||||
| 	  This includes return parameters. | ||||
| 	* The parameter lists must give a type for each argument: | ||||
| 	  the (x, y, z int) shorthand is not allowed. | ||||
| 	* If the return parameter is an error number, it must be named err. | ||||
| 	* If go func name needs to be different than its libc name, | ||||
| 	* or the function is not in libc, name could be specified | ||||
| 	* at the end, after "=" sign, like | ||||
| 	  //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt
 | ||||
| 
 | ||||
| 
 | ||||
| This program will generate three files and handle both gc and gccgo implementation: | ||||
|   - zsyscall_aix_ppc64.go: the common part of each implementation (error handler, pointer creation) | ||||
|   - zsyscall_aix_ppc64_gc.go: gc part with //go_cgo_import_dynamic and a call to syscall6
 | ||||
|   - zsyscall_aix_ppc64_gccgo.go: gccgo part with C function and conversion to C type. | ||||
| 
 | ||||
|  The generated code looks like this | ||||
| 
 | ||||
| zsyscall_aix_ppc64.go | ||||
| func asyscall(...) (n int, err error) { | ||||
| 	 // Pointer Creation
 | ||||
| 	 r1, e1 := callasyscall(...) | ||||
| 	 // Type Conversion
 | ||||
| 	 // Error Handler
 | ||||
| 	 return | ||||
| } | ||||
| 
 | ||||
| zsyscall_aix_ppc64_gc.go | ||||
| //go:cgo_import_dynamic libc_asyscall asyscall "libc.a/shr_64.o"
 | ||||
| //go:linkname libc_asyscall libc_asyscall
 | ||||
| var asyscall syscallFunc | ||||
| 
 | ||||
| func callasyscall(...) (r1 uintptr, e1 Errno) { | ||||
| 	 r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_asyscall)), "nb_args", ... ) | ||||
| 	 return | ||||
| } | ||||
| 
 | ||||
| zsyscall_aix_ppc64_ggcgo.go | ||||
| 
 | ||||
| // int asyscall(...)
 | ||||
| 
 | ||||
| import "C" | ||||
| 
 | ||||
| func callasyscall(...) (r1 uintptr, e1 Errno) { | ||||
| 	 r1 = uintptr(C.asyscall(...)) | ||||
| 	 e1 = syscall.GetErrno() | ||||
| 	 return | ||||
| } | ||||
| */ | ||||
| 
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	b32  = flag.Bool("b32", false, "32bit big-endian") | ||||
| 	l32  = flag.Bool("l32", false, "32bit little-endian") | ||||
| 	aix  = flag.Bool("aix", false, "aix") | ||||
| 	tags = flag.String("tags", "", "build tags") | ||||
| ) | ||||
| 
 | ||||
| // cmdLine returns this programs's commandline arguments
 | ||||
| func cmdLine() string { | ||||
| 	return "go run mksyscall_aix_ppc64.go " + strings.Join(os.Args[1:], " ") | ||||
| } | ||||
| 
 | ||||
| // buildTags returns build tags
 | ||||
| func buildTags() string { | ||||
| 	return *tags | ||||
| } | ||||
| 
 | ||||
| // Param is function parameter
 | ||||
| type Param struct { | ||||
| 	Name string | ||||
| 	Type string | ||||
| } | ||||
| 
 | ||||
| // usage prints the program usage
 | ||||
| func usage() { | ||||
| 	fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc64.go [-b32 | -l32] [-tags x,y] [file ...]\n") | ||||
| 	os.Exit(1) | ||||
| } | ||||
| 
 | ||||
| // parseParamList parses parameter list and returns a slice of parameters
 | ||||
| func parseParamList(list string) []string { | ||||
| 	list = strings.TrimSpace(list) | ||||
| 	if list == "" { | ||||
| 		return []string{} | ||||
| 	} | ||||
| 	return regexp.MustCompile(`\s*,\s*`).Split(list, -1) | ||||
| } | ||||
| 
 | ||||
| // parseParam splits a parameter into name and type
 | ||||
| func parseParam(p string) Param { | ||||
| 	ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) | ||||
| 	if ps == nil { | ||||
| 		fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| 	return Param{ps[1], ps[2]} | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	flag.Usage = usage | ||||
| 	flag.Parse() | ||||
| 	if len(flag.Args()) <= 0 { | ||||
| 		fmt.Fprintf(os.Stderr, "no files to parse provided\n") | ||||
| 		usage() | ||||
| 	} | ||||
| 
 | ||||
| 	endianness := "" | ||||
| 	if *b32 { | ||||
| 		endianness = "big-endian" | ||||
| 	} else if *l32 { | ||||
| 		endianness = "little-endian" | ||||
| 	} | ||||
| 
 | ||||
| 	pack := "" | ||||
| 	// GCCGO
 | ||||
| 	textgccgo := "" | ||||
| 	cExtern := "/*\n#include <stdint.h>\n" | ||||
| 	// GC
 | ||||
| 	textgc := "" | ||||
| 	dynimports := "" | ||||
| 	linknames := "" | ||||
| 	var vars []string | ||||
| 	// COMMON
 | ||||
| 	textcommon := "" | ||||
| 	for _, path := range flag.Args() { | ||||
| 		file, err := os.Open(path) | ||||
| 		if err != nil { | ||||
| 			fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		s := bufio.NewScanner(file) | ||||
| 		for s.Scan() { | ||||
| 			t := s.Text() | ||||
| 			t = strings.TrimSpace(t) | ||||
| 			t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) | ||||
| 			if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { | ||||
| 				pack = p[1] | ||||
| 			} | ||||
| 			nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) | ||||
| 			if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			// Line must be of the form
 | ||||
| 			//	func Open(path string, mode int, perm int) (fd int, err error)
 | ||||
| 			// Split into name, in params, out params.
 | ||||
| 			f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) | ||||
| 			if f == nil { | ||||
| 				fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 			funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] | ||||
| 
 | ||||
| 			// Split argument lists on comma.
 | ||||
| 			in := parseParamList(inps) | ||||
| 			out := parseParamList(outps) | ||||
| 
 | ||||
| 			inps = strings.Join(in, ", ") | ||||
| 			outps = strings.Join(out, ", ") | ||||
| 
 | ||||
| 			if sysname == "" { | ||||
| 				sysname = funct | ||||
| 			} | ||||
| 
 | ||||
| 			onlyCommon := false | ||||
| 			if funct == "readlen" || funct == "writelen" || funct == "FcntlInt" || funct == "FcntlFlock" { | ||||
| 				// This function call another syscall which is already implemented.
 | ||||
| 				// Therefore, the gc and gccgo part must not be generated.
 | ||||
| 				onlyCommon = true | ||||
| 			} | ||||
| 
 | ||||
| 			// Try in vain to keep people from editing this file.
 | ||||
| 			// The theory is that they jump into the middle of the file
 | ||||
| 			// without reading the header.
 | ||||
| 
 | ||||
| 			textcommon += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" | ||||
| 			if !onlyCommon { | ||||
| 				textgccgo += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" | ||||
| 				textgc += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" | ||||
| 			} | ||||
| 
 | ||||
| 			// Check if value return, err return available
 | ||||
| 			errvar := "" | ||||
| 			rettype := "" | ||||
| 			for _, param := range out { | ||||
| 				p := parseParam(param) | ||||
| 				if p.Type == "error" { | ||||
| 					errvar = p.Name | ||||
| 				} else { | ||||
| 					rettype = p.Type | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) | ||||
| 			sysname = strings.ToLower(sysname) // All libc functions are lowercase.
 | ||||
| 
 | ||||
| 			// GCCGO Prototype return type
 | ||||
| 			cRettype := "" | ||||
| 			if rettype == "unsafe.Pointer" { | ||||
| 				cRettype = "uintptr_t" | ||||
| 			} else if rettype == "uintptr" { | ||||
| 				cRettype = "uintptr_t" | ||||
| 			} else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { | ||||
| 				cRettype = "uintptr_t" | ||||
| 			} else if rettype == "int" { | ||||
| 				cRettype = "int" | ||||
| 			} else if rettype == "int32" { | ||||
| 				cRettype = "int" | ||||
| 			} else if rettype == "int64" { | ||||
| 				cRettype = "long long" | ||||
| 			} else if rettype == "uint32" { | ||||
| 				cRettype = "unsigned int" | ||||
| 			} else if rettype == "uint64" { | ||||
| 				cRettype = "unsigned long long" | ||||
| 			} else { | ||||
| 				cRettype = "int" | ||||
| 			} | ||||
| 			if sysname == "exit" { | ||||
| 				cRettype = "void" | ||||
| 			} | ||||
| 
 | ||||
| 			// GCCGO Prototype arguments type
 | ||||
| 			var cIn []string | ||||
| 			for i, param := range in { | ||||
| 				p := parseParam(param) | ||||
| 				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { | ||||
| 					cIn = append(cIn, "uintptr_t") | ||||
| 				} else if p.Type == "string" { | ||||
| 					cIn = append(cIn, "uintptr_t") | ||||
| 				} else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { | ||||
| 					cIn = append(cIn, "uintptr_t", "size_t") | ||||
| 				} else if p.Type == "unsafe.Pointer" { | ||||
| 					cIn = append(cIn, "uintptr_t") | ||||
| 				} else if p.Type == "uintptr" { | ||||
| 					cIn = append(cIn, "uintptr_t") | ||||
| 				} else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { | ||||
| 					cIn = append(cIn, "uintptr_t") | ||||
| 				} else if p.Type == "int" { | ||||
| 					if (i == 0 || i == 2) && funct == "fcntl" { | ||||
| 						// These fcntl arguments needs to be uintptr to be able to call FcntlInt and FcntlFlock
 | ||||
| 						cIn = append(cIn, "uintptr_t") | ||||
| 					} else { | ||||
| 						cIn = append(cIn, "int") | ||||
| 					} | ||||
| 
 | ||||
| 				} else if p.Type == "int32" { | ||||
| 					cIn = append(cIn, "int") | ||||
| 				} else if p.Type == "int64" { | ||||
| 					cIn = append(cIn, "long long") | ||||
| 				} else if p.Type == "uint32" { | ||||
| 					cIn = append(cIn, "unsigned int") | ||||
| 				} else if p.Type == "uint64" { | ||||
| 					cIn = append(cIn, "unsigned long long") | ||||
| 				} else { | ||||
| 					cIn = append(cIn, "int") | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			if !onlyCommon { | ||||
| 				// GCCGO Prototype Generation
 | ||||
| 				// Imports of system calls from libc
 | ||||
| 				if sysname == "select" { | ||||
| 					// select is a keyword of Go. Its name is
 | ||||
| 					// changed to c_select.
 | ||||
| 					cExtern += "#define c_select select\n" | ||||
| 				} | ||||
| 				cExtern += fmt.Sprintf("%s %s", cRettype, sysname) | ||||
| 				cIn := strings.Join(cIn, ", ") | ||||
| 				cExtern += fmt.Sprintf("(%s);\n", cIn) | ||||
| 			} | ||||
| 			// GC Library name
 | ||||
| 			if modname == "" { | ||||
| 				modname = "libc.a/shr_64.o" | ||||
| 			} else { | ||||
| 				fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 			sysvarname := fmt.Sprintf("libc_%s", sysname) | ||||
| 
 | ||||
| 			if !onlyCommon { | ||||
| 				// GC Runtime import of function to allow cross-platform builds.
 | ||||
| 				dynimports += fmt.Sprintf("//go:cgo_import_dynamic %s %s \"%s\"\n", sysvarname, sysname, modname) | ||||
| 				// GC Link symbol to proc address variable.
 | ||||
| 				linknames += fmt.Sprintf("//go:linkname %s %s\n", sysvarname, sysvarname) | ||||
| 				// GC Library proc address variable.
 | ||||
| 				vars = append(vars, sysvarname) | ||||
| 			} | ||||
| 
 | ||||
| 			strconvfunc := "BytePtrFromString" | ||||
| 			strconvtype := "*byte" | ||||
| 
 | ||||
| 			// Go function header.
 | ||||
| 			if outps != "" { | ||||
| 				outps = fmt.Sprintf(" (%s)", outps) | ||||
| 			} | ||||
| 			if textcommon != "" { | ||||
| 				textcommon += "\n" | ||||
| 			} | ||||
| 
 | ||||
| 			textcommon += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) | ||||
| 
 | ||||
| 			// Prepare arguments tocall.
 | ||||
| 			var argscommon []string // Arguments in the common part
 | ||||
| 			var argscall []string   // Arguments for call prototype
 | ||||
| 			var argsgc []string     // Arguments for gc call (with syscall6)
 | ||||
| 			var argsgccgo []string  // Arguments for gccgo call (with C.name_of_syscall)
 | ||||
| 			n := 0 | ||||
| 			argN := 0 | ||||
| 			for _, param := range in { | ||||
| 				p := parseParam(param) | ||||
| 				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { | ||||
| 					argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(%s))", p.Name)) | ||||
| 					argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) | ||||
| 					argsgc = append(argsgc, p.Name) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) | ||||
| 				} else if p.Type == "string" && errvar != "" { | ||||
| 					textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) | ||||
| 					textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) | ||||
| 					textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) | ||||
| 
 | ||||
| 					argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) | ||||
| 					argscall = append(argscall, fmt.Sprintf("_p%d uintptr ", n)) | ||||
| 					argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) | ||||
| 					n++ | ||||
| 				} else if p.Type == "string" { | ||||
| 					fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") | ||||
| 					textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) | ||||
| 					textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) | ||||
| 					textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) | ||||
| 
 | ||||
| 					argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) | ||||
| 					argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n)) | ||||
| 					argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) | ||||
| 					n++ | ||||
| 				} else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { | ||||
| 					// Convert slice into pointer, length.
 | ||||
| 					// Have to be careful not to take address of &a[0] if len == 0:
 | ||||
| 					// pass nil in that case.
 | ||||
| 					textcommon += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) | ||||
| 					textcommon += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) | ||||
| 					argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("len(%s)", p.Name)) | ||||
| 					argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n), fmt.Sprintf("_lenp%d int", n)) | ||||
| 					argsgc = append(argsgc, fmt.Sprintf("_p%d", n), fmt.Sprintf("uintptr(_lenp%d)", n)) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n), fmt.Sprintf("C.size_t(_lenp%d)", n)) | ||||
| 					n++ | ||||
| 				} else if p.Type == "int64" && endianness != "" { | ||||
| 					fmt.Fprintf(os.Stderr, path+":"+funct+" uses int64 with 32 bits mode. Case not yet implemented\n") | ||||
| 				} else if p.Type == "bool" { | ||||
| 					fmt.Fprintf(os.Stderr, path+":"+funct+" uses bool. Case not yet implemented\n") | ||||
| 				} else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil || p.Type == "unsafe.Pointer" { | ||||
| 					argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) | ||||
| 					argsgc = append(argsgc, p.Name) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) | ||||
| 				} else if p.Type == "int" { | ||||
| 					if (argN == 0 || argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt") || (funct == "FcntlFlock")) { | ||||
| 						// These fcntl arguments need to be uintptr to be able to call FcntlInt and FcntlFlock
 | ||||
| 						argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 						argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) | ||||
| 						argsgc = append(argsgc, p.Name) | ||||
| 						argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) | ||||
| 
 | ||||
| 					} else { | ||||
| 						argscommon = append(argscommon, p.Name) | ||||
| 						argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) | ||||
| 						argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 						argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) | ||||
| 					} | ||||
| 				} else if p.Type == "int32" { | ||||
| 					argscommon = append(argscommon, p.Name) | ||||
| 					argscall = append(argscall, fmt.Sprintf("%s int32", p.Name)) | ||||
| 					argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) | ||||
| 				} else if p.Type == "int64" { | ||||
| 					argscommon = append(argscommon, p.Name) | ||||
| 					argscall = append(argscall, fmt.Sprintf("%s int64", p.Name)) | ||||
| 					argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.longlong(%s)", p.Name)) | ||||
| 				} else if p.Type == "uint32" { | ||||
| 					argscommon = append(argscommon, p.Name) | ||||
| 					argscall = append(argscall, fmt.Sprintf("%s uint32", p.Name)) | ||||
| 					argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uint(%s)", p.Name)) | ||||
| 				} else if p.Type == "uint64" { | ||||
| 					argscommon = append(argscommon, p.Name) | ||||
| 					argscall = append(argscall, fmt.Sprintf("%s uint64", p.Name)) | ||||
| 					argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.ulonglong(%s)", p.Name)) | ||||
| 				} else if p.Type == "uintptr" { | ||||
| 					argscommon = append(argscommon, p.Name) | ||||
| 					argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) | ||||
| 					argsgc = append(argsgc, p.Name) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) | ||||
| 				} else { | ||||
| 					argscommon = append(argscommon, fmt.Sprintf("int(%s)", p.Name)) | ||||
| 					argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) | ||||
| 					argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) | ||||
| 				} | ||||
| 				argN++ | ||||
| 			} | ||||
| 			nargs := len(argsgc) | ||||
| 
 | ||||
| 			// COMMON function generation
 | ||||
| 			argscommonlist := strings.Join(argscommon, ", ") | ||||
| 			callcommon := fmt.Sprintf("call%s(%s)", sysname, argscommonlist) | ||||
| 			ret := []string{"_", "_"} | ||||
| 			body := "" | ||||
| 			doErrno := false | ||||
| 			for i := 0; i < len(out); i++ { | ||||
| 				p := parseParam(out[i]) | ||||
| 				reg := "" | ||||
| 				if p.Name == "err" { | ||||
| 					reg = "e1" | ||||
| 					ret[1] = reg | ||||
| 					doErrno = true | ||||
| 				} else { | ||||
| 					reg = "r0" | ||||
| 					ret[0] = reg | ||||
| 				} | ||||
| 				if p.Type == "bool" { | ||||
| 					reg = fmt.Sprintf("%s != 0", reg) | ||||
| 				} | ||||
| 				if reg != "e1" { | ||||
| 					body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) | ||||
| 				} | ||||
| 			} | ||||
| 			if ret[0] == "_" && ret[1] == "_" { | ||||
| 				textcommon += fmt.Sprintf("\t%s\n", callcommon) | ||||
| 			} else { | ||||
| 				textcommon += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], callcommon) | ||||
| 			} | ||||
| 			textcommon += body | ||||
| 
 | ||||
| 			if doErrno { | ||||
| 				textcommon += "\tif e1 != 0 {\n" | ||||
| 				textcommon += "\t\terr = errnoErr(e1)\n" | ||||
| 				textcommon += "\t}\n" | ||||
| 			} | ||||
| 			textcommon += "\treturn\n" | ||||
| 			textcommon += "}\n" | ||||
| 
 | ||||
| 			if onlyCommon { | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			// CALL Prototype
 | ||||
| 			callProto := fmt.Sprintf("func call%s(%s) (r1 uintptr, e1 Errno) {\n", sysname, strings.Join(argscall, ", ")) | ||||
| 
 | ||||
| 			// GC function generation
 | ||||
| 			asm := "syscall6" | ||||
| 			if nonblock != nil { | ||||
| 				asm = "rawSyscall6" | ||||
| 			} | ||||
| 
 | ||||
| 			if len(argsgc) <= 6 { | ||||
| 				for len(argsgc) < 6 { | ||||
| 					argsgc = append(argsgc, "0") | ||||
| 				} | ||||
| 			} else { | ||||
| 				fmt.Fprintf(os.Stderr, "%s: too many arguments to system call", funct) | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 			argsgclist := strings.Join(argsgc, ", ") | ||||
| 			callgc := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, argsgclist) | ||||
| 
 | ||||
| 			textgc += callProto | ||||
| 			textgc += fmt.Sprintf("\tr1, _, e1 = %s\n", callgc) | ||||
| 			textgc += "\treturn\n}\n" | ||||
| 
 | ||||
| 			// GCCGO function generation
 | ||||
| 			argsgccgolist := strings.Join(argsgccgo, ", ") | ||||
| 			var callgccgo string | ||||
| 			if sysname == "select" { | ||||
| 				// select is a keyword of Go. Its name is
 | ||||
| 				// changed to c_select.
 | ||||
| 				callgccgo = fmt.Sprintf("C.c_%s(%s)", sysname, argsgccgolist) | ||||
| 			} else { | ||||
| 				callgccgo = fmt.Sprintf("C.%s(%s)", sysname, argsgccgolist) | ||||
| 			} | ||||
| 			textgccgo += callProto | ||||
| 			textgccgo += fmt.Sprintf("\tr1 = uintptr(%s)\n", callgccgo) | ||||
| 			textgccgo += "\te1 = syscall.GetErrno()\n" | ||||
| 			textgccgo += "\treturn\n}\n" | ||||
| 		} | ||||
| 		if err := s.Err(); err != nil { | ||||
| 			fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		file.Close() | ||||
| 	} | ||||
| 	imp := "" | ||||
| 	if pack != "unix" { | ||||
| 		imp = "import \"golang.org/x/sys/unix\"\n" | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	// Print zsyscall_aix_ppc64.go
 | ||||
| 	err := ioutil.WriteFile("zsyscall_aix_ppc64.go", | ||||
| 		[]byte(fmt.Sprintf(srcTemplate1, cmdLine(), buildTags(), pack, imp, textcommon)), | ||||
| 		0644) | ||||
| 	if err != nil { | ||||
| 		fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| 
 | ||||
| 	// Print zsyscall_aix_ppc64_gc.go
 | ||||
| 	vardecls := "\t" + strings.Join(vars, ",\n\t") | ||||
| 	vardecls += " syscallFunc" | ||||
| 	err = ioutil.WriteFile("zsyscall_aix_ppc64_gc.go", | ||||
| 		[]byte(fmt.Sprintf(srcTemplate2, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, textgc)), | ||||
| 		0644) | ||||
| 	if err != nil { | ||||
| 		fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| 
 | ||||
| 	// Print zsyscall_aix_ppc64_gccgo.go
 | ||||
| 	err = ioutil.WriteFile("zsyscall_aix_ppc64_gccgo.go", | ||||
| 		[]byte(fmt.Sprintf(srcTemplate3, cmdLine(), buildTags(), pack, cExtern, imp, textgccgo)), | ||||
| 		0644) | ||||
| 	if err != nil { | ||||
| 		fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| const srcTemplate1 = `// %s
 | ||||
| // Code generated by the command above; see README.md. DO NOT EDIT.
 | ||||
| 
 | ||||
| // +build %s
 | ||||
| 
 | ||||
| package %s | ||||
| 
 | ||||
| import ( | ||||
| 	"unsafe" | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| %s | ||||
| 
 | ||||
| %s | ||||
| ` | ||||
| const srcTemplate2 = `// %s
 | ||||
| // Code generated by the command above; see README.md. DO NOT EDIT.
 | ||||
| 
 | ||||
| // +build %s
 | ||||
| // +build !gccgo
 | ||||
| 
 | ||||
| package %s | ||||
| 
 | ||||
| import ( | ||||
| 	"unsafe" | ||||
| ) | ||||
| %s | ||||
| %s | ||||
| %s | ||||
| type syscallFunc uintptr | ||||
| 
 | ||||
| var ( | ||||
| %s | ||||
| ) | ||||
| 
 | ||||
| // Implemented in runtime/syscall_aix.go.
 | ||||
| func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) | ||||
| func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) | ||||
| 
 | ||||
| %s | ||||
| ` | ||||
| const srcTemplate3 = `// %s
 | ||||
| // Code generated by the command above; see README.md. DO NOT EDIT.
 | ||||
| 
 | ||||
| // +build %s
 | ||||
| // +build gccgo
 | ||||
| 
 | ||||
| package %s | ||||
| 
 | ||||
| %s | ||||
| */ | ||||
| import "C" | ||||
| import ( | ||||
| 	"syscall" | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| %s | ||||
| 
 | ||||
| %s | ||||
| ` | ||||
|  | @ -1,335 +0,0 @@ | |||
| // Copyright 2019 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| /* | ||||
|  This program reads a file containing function prototypes | ||||
|  (like syscall_solaris.go) and generates system call bodies. | ||||
|  The prototypes are marked by lines beginning with "//sys" | ||||
|  and read like func declarations if //sys is replaced by func, but:
 | ||||
| 	* The parameter lists must give a name for each argument. | ||||
| 	  This includes return parameters. | ||||
| 	* The parameter lists must give a type for each argument: | ||||
| 	  the (x, y, z int) shorthand is not allowed. | ||||
| 	* If the return parameter is an error number, it must be named err. | ||||
| 	* If go func name needs to be different than its libc name, | ||||
| 	* or the function is not in libc, name could be specified | ||||
| 	* at the end, after "=" sign, like | ||||
| 	  //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt
 | ||||
| */ | ||||
| 
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	b32  = flag.Bool("b32", false, "32bit big-endian") | ||||
| 	l32  = flag.Bool("l32", false, "32bit little-endian") | ||||
| 	tags = flag.String("tags", "", "build tags") | ||||
| ) | ||||
| 
 | ||||
| // cmdLine returns this programs's commandline arguments
 | ||||
| func cmdLine() string { | ||||
| 	return "go run mksyscall_solaris.go " + strings.Join(os.Args[1:], " ") | ||||
| } | ||||
| 
 | ||||
| // buildTags returns build tags
 | ||||
| func buildTags() string { | ||||
| 	return *tags | ||||
| } | ||||
| 
 | ||||
| // Param is function parameter
 | ||||
| type Param struct { | ||||
| 	Name string | ||||
| 	Type string | ||||
| } | ||||
| 
 | ||||
| // usage prints the program usage
 | ||||
| func usage() { | ||||
| 	fmt.Fprintf(os.Stderr, "usage: go run mksyscall_solaris.go [-b32 | -l32] [-tags x,y] [file ...]\n") | ||||
| 	os.Exit(1) | ||||
| } | ||||
| 
 | ||||
| // parseParamList parses parameter list and returns a slice of parameters
 | ||||
| func parseParamList(list string) []string { | ||||
| 	list = strings.TrimSpace(list) | ||||
| 	if list == "" { | ||||
| 		return []string{} | ||||
| 	} | ||||
| 	return regexp.MustCompile(`\s*,\s*`).Split(list, -1) | ||||
| } | ||||
| 
 | ||||
| // parseParam splits a parameter into name and type
 | ||||
| func parseParam(p string) Param { | ||||
| 	ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) | ||||
| 	if ps == nil { | ||||
| 		fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| 	return Param{ps[1], ps[2]} | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	flag.Usage = usage | ||||
| 	flag.Parse() | ||||
| 	if len(flag.Args()) <= 0 { | ||||
| 		fmt.Fprintf(os.Stderr, "no files to parse provided\n") | ||||
| 		usage() | ||||
| 	} | ||||
| 
 | ||||
| 	endianness := "" | ||||
| 	if *b32 { | ||||
| 		endianness = "big-endian" | ||||
| 	} else if *l32 { | ||||
| 		endianness = "little-endian" | ||||
| 	} | ||||
| 
 | ||||
| 	pack := "" | ||||
| 	text := "" | ||||
| 	dynimports := "" | ||||
| 	linknames := "" | ||||
| 	var vars []string | ||||
| 	for _, path := range flag.Args() { | ||||
| 		file, err := os.Open(path) | ||||
| 		if err != nil { | ||||
| 			fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		s := bufio.NewScanner(file) | ||||
| 		for s.Scan() { | ||||
| 			t := s.Text() | ||||
| 			t = strings.TrimSpace(t) | ||||
| 			t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) | ||||
| 			if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { | ||||
| 				pack = p[1] | ||||
| 			} | ||||
| 			nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) | ||||
| 			if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			// Line must be of the form
 | ||||
| 			//	func Open(path string, mode int, perm int) (fd int, err error)
 | ||||
| 			// Split into name, in params, out params.
 | ||||
| 			f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) | ||||
| 			if f == nil { | ||||
| 				fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 			funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] | ||||
| 
 | ||||
| 			// Split argument lists on comma.
 | ||||
| 			in := parseParamList(inps) | ||||
| 			out := parseParamList(outps) | ||||
| 
 | ||||
| 			inps = strings.Join(in, ", ") | ||||
| 			outps = strings.Join(out, ", ") | ||||
| 
 | ||||
| 			// Try in vain to keep people from editing this file.
 | ||||
| 			// The theory is that they jump into the middle of the file
 | ||||
| 			// without reading the header.
 | ||||
| 			text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" | ||||
| 
 | ||||
| 			// So file name.
 | ||||
| 			if modname == "" { | ||||
| 				modname = "libc" | ||||
| 			} | ||||
| 
 | ||||
| 			// System call name.
 | ||||
| 			if sysname == "" { | ||||
| 				sysname = funct | ||||
| 			} | ||||
| 
 | ||||
| 			// System call pointer variable name.
 | ||||
| 			sysvarname := fmt.Sprintf("proc%s", sysname) | ||||
| 
 | ||||
| 			strconvfunc := "BytePtrFromString" | ||||
| 			strconvtype := "*byte" | ||||
| 
 | ||||
| 			sysname = strings.ToLower(sysname) // All libc functions are lowercase.
 | ||||
| 
 | ||||
| 			// Runtime import of function to allow cross-platform builds.
 | ||||
| 			dynimports += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"%s.so\"\n", sysname, sysname, modname) | ||||
| 			// Link symbol to proc address variable.
 | ||||
| 			linknames += fmt.Sprintf("//go:linkname %s libc_%s\n", sysvarname, sysname) | ||||
| 			// Library proc address variable.
 | ||||
| 			vars = append(vars, sysvarname) | ||||
| 
 | ||||
| 			// Go function header.
 | ||||
| 			outlist := strings.Join(out, ", ") | ||||
| 			if outlist != "" { | ||||
| 				outlist = fmt.Sprintf(" (%s)", outlist) | ||||
| 			} | ||||
| 			if text != "" { | ||||
| 				text += "\n" | ||||
| 			} | ||||
| 			text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outlist) | ||||
| 
 | ||||
| 			// Check if err return available
 | ||||
| 			errvar := "" | ||||
| 			for _, param := range out { | ||||
| 				p := parseParam(param) | ||||
| 				if p.Type == "error" { | ||||
| 					errvar = p.Name | ||||
| 					continue | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			// Prepare arguments to Syscall.
 | ||||
| 			var args []string | ||||
| 			n := 0 | ||||
| 			for _, param := range in { | ||||
| 				p := parseParam(param) | ||||
| 				if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { | ||||
| 					args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") | ||||
| 				} else if p.Type == "string" && errvar != "" { | ||||
| 					text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) | ||||
| 					text += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) | ||||
| 					text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) | ||||
| 					args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) | ||||
| 					n++ | ||||
| 				} else if p.Type == "string" { | ||||
| 					fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") | ||||
| 					text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) | ||||
| 					text += fmt.Sprintf("\t_p%d, _ = %s(%s)\n", n, strconvfunc, p.Name) | ||||
| 					args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) | ||||
| 					n++ | ||||
| 				} else if s := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); s != nil { | ||||
| 					// Convert slice into pointer, length.
 | ||||
| 					// Have to be careful not to take address of &a[0] if len == 0:
 | ||||
| 					// pass nil in that case.
 | ||||
| 					text += fmt.Sprintf("\tvar _p%d *%s\n", n, s[1]) | ||||
| 					text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) | ||||
| 					args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) | ||||
| 					n++ | ||||
| 				} else if p.Type == "int64" && endianness != "" { | ||||
| 					if endianness == "big-endian" { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 					} else { | ||||
| 						args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) | ||||
| 					} | ||||
| 				} else if p.Type == "bool" { | ||||
| 					text += fmt.Sprintf("\tvar _p%d uint32\n", n) | ||||
| 					text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) | ||||
| 					args = append(args, fmt.Sprintf("uintptr(_p%d)", n)) | ||||
| 					n++ | ||||
| 				} else { | ||||
| 					args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) | ||||
| 				} | ||||
| 			} | ||||
| 			nargs := len(args) | ||||
| 
 | ||||
| 			// Determine which form to use; pad args with zeros.
 | ||||
| 			asm := "sysvicall6" | ||||
| 			if nonblock != nil { | ||||
| 				asm = "rawSysvicall6" | ||||
| 			} | ||||
| 			if len(args) <= 6 { | ||||
| 				for len(args) < 6 { | ||||
| 					args = append(args, "0") | ||||
| 				} | ||||
| 			} else { | ||||
| 				fmt.Fprintf(os.Stderr, "%s: too many arguments to system call\n", path) | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			// Actual call.
 | ||||
| 			arglist := strings.Join(args, ", ") | ||||
| 			call := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, arglist) | ||||
| 
 | ||||
| 			// Assign return values.
 | ||||
| 			body := "" | ||||
| 			ret := []string{"_", "_", "_"} | ||||
| 			doErrno := false | ||||
| 			for i := 0; i < len(out); i++ { | ||||
| 				p := parseParam(out[i]) | ||||
| 				reg := "" | ||||
| 				if p.Name == "err" { | ||||
| 					reg = "e1" | ||||
| 					ret[2] = reg | ||||
| 					doErrno = true | ||||
| 				} else { | ||||
| 					reg = fmt.Sprintf("r%d", i) | ||||
| 					ret[i] = reg | ||||
| 				} | ||||
| 				if p.Type == "bool" { | ||||
| 					reg = fmt.Sprintf("%d != 0", reg) | ||||
| 				} | ||||
| 				if p.Type == "int64" && endianness != "" { | ||||
| 					// 64-bit number in r1:r0 or r0:r1.
 | ||||
| 					if i+2 > len(out) { | ||||
| 						fmt.Fprintf(os.Stderr, "%s: not enough registers for int64 return\n", path) | ||||
| 						os.Exit(1) | ||||
| 					} | ||||
| 					if endianness == "big-endian" { | ||||
| 						reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) | ||||
| 					} else { | ||||
| 						reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) | ||||
| 					} | ||||
| 					ret[i] = fmt.Sprintf("r%d", i) | ||||
| 					ret[i+1] = fmt.Sprintf("r%d", i+1) | ||||
| 				} | ||||
| 				if reg != "e1" { | ||||
| 					body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) | ||||
| 				} | ||||
| 			} | ||||
| 			if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { | ||||
| 				text += fmt.Sprintf("\t%s\n", call) | ||||
| 			} else { | ||||
| 				text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) | ||||
| 			} | ||||
| 			text += body | ||||
| 
 | ||||
| 			if doErrno { | ||||
| 				text += "\tif e1 != 0 {\n" | ||||
| 				text += "\t\terr = e1\n" | ||||
| 				text += "\t}\n" | ||||
| 			} | ||||
| 			text += "\treturn\n" | ||||
| 			text += "}\n" | ||||
| 		} | ||||
| 		if err := s.Err(); err != nil { | ||||
| 			fmt.Fprintf(os.Stderr, err.Error()) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		file.Close() | ||||
| 	} | ||||
| 	imp := "" | ||||
| 	if pack != "unix" { | ||||
| 		imp = "import \"golang.org/x/sys/unix\"\n" | ||||
| 
 | ||||
| 	} | ||||
| 	vardecls := "\t" + strings.Join(vars, ",\n\t") | ||||
| 	vardecls += " syscallFunc" | ||||
| 	fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, text) | ||||
| } | ||||
| 
 | ||||
| const srcTemplate = `// %s
 | ||||
| // Code generated by the command above; see README.md. DO NOT EDIT.
 | ||||
| 
 | ||||
| // +build %s
 | ||||
| 
 | ||||
| package %s | ||||
| 
 | ||||
| import ( | ||||
| 	"syscall" | ||||
| 	"unsafe" | ||||
| ) | ||||
| %s | ||||
| %s | ||||
| %s | ||||
| var ( | ||||
| %s	 | ||||
| ) | ||||
| 
 | ||||
| %s | ||||
| ` | ||||
|  | @ -1,190 +0,0 @@ | |||
| // Copyright 2018 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| // Generate system call table for DragonFly, NetBSD,
 | ||||
| // FreeBSD, OpenBSD or Darwin from master list
 | ||||
| // (for example, /usr/src/sys/kern/syscalls.master or
 | ||||
| // sys/syscall.h).
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	goos, goarch string | ||||
| ) | ||||
| 
 | ||||
| // cmdLine returns this programs's commandline arguments
 | ||||
| func cmdLine() string { | ||||
| 	return "go run mksysnum.go " + strings.Join(os.Args[1:], " ") | ||||
| } | ||||
| 
 | ||||
| // buildTags returns build tags
 | ||||
| func buildTags() string { | ||||
| 	return fmt.Sprintf("%s,%s", goarch, goos) | ||||
| } | ||||
| 
 | ||||
| func checkErr(err error) { | ||||
| 	if err != nil { | ||||
| 		fmt.Fprintf(os.Stderr, "%v\n", err) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // source string and substring slice for regexp
 | ||||
| type re struct { | ||||
| 	str string   // source string
 | ||||
| 	sub []string // matched sub-string
 | ||||
| } | ||||
| 
 | ||||
| // Match performs regular expression match
 | ||||
| func (r *re) Match(exp string) bool { | ||||
| 	r.sub = regexp.MustCompile(exp).FindStringSubmatch(r.str) | ||||
| 	if r.sub != nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // fetchFile fetches a text file from URL
 | ||||
| func fetchFile(URL string) io.Reader { | ||||
| 	resp, err := http.Get(URL) | ||||
| 	checkErr(err) | ||||
| 	defer resp.Body.Close() | ||||
| 	body, err := ioutil.ReadAll(resp.Body) | ||||
| 	checkErr(err) | ||||
| 	return strings.NewReader(string(body)) | ||||
| } | ||||
| 
 | ||||
| // readFile reads a text file from path
 | ||||
| func readFile(path string) io.Reader { | ||||
| 	file, err := os.Open(os.Args[1]) | ||||
| 	checkErr(err) | ||||
| 	return file | ||||
| } | ||||
| 
 | ||||
| func format(name, num, proto string) string { | ||||
| 	name = strings.ToUpper(name) | ||||
| 	// There are multiple entries for enosys and nosys, so comment them out.
 | ||||
| 	nm := re{str: name} | ||||
| 	if nm.Match(`^SYS_E?NOSYS$`) { | ||||
| 		name = fmt.Sprintf("// %s", name) | ||||
| 	} | ||||
| 	if name == `SYS_SYS_EXIT` { | ||||
| 		name = `SYS_EXIT` | ||||
| 	} | ||||
| 	return fmt.Sprintf("	%s = %s;  // %s\n", name, num, proto) | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	// Get the OS (using GOOS_TARGET if it exist)
 | ||||
| 	goos = os.Getenv("GOOS_TARGET") | ||||
| 	if goos == "" { | ||||
| 		goos = os.Getenv("GOOS") | ||||
| 	} | ||||
| 	// Get the architecture (using GOARCH_TARGET if it exists)
 | ||||
| 	goarch = os.Getenv("GOARCH_TARGET") | ||||
| 	if goarch == "" { | ||||
| 		goarch = os.Getenv("GOARCH") | ||||
| 	} | ||||
| 	// Check if GOOS and GOARCH environment variables are defined
 | ||||
| 	if goarch == "" || goos == "" { | ||||
| 		fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n") | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| 
 | ||||
| 	file := strings.TrimSpace(os.Args[1]) | ||||
| 	var syscalls io.Reader | ||||
| 	if strings.HasPrefix(file, "https://") || strings.HasPrefix(file, "http://") { | ||||
| 		// Download syscalls.master file
 | ||||
| 		syscalls = fetchFile(file) | ||||
| 	} else { | ||||
| 		syscalls = readFile(file) | ||||
| 	} | ||||
| 
 | ||||
| 	var text, line string | ||||
| 	s := bufio.NewScanner(syscalls) | ||||
| 	for s.Scan() { | ||||
| 		t := re{str: line} | ||||
| 		if t.Match(`^(.*)\\$`) { | ||||
| 			// Handle continuation
 | ||||
| 			line = t.sub[1] | ||||
| 			line += strings.TrimLeft(s.Text(), " \t") | ||||
| 		} else { | ||||
| 			// New line
 | ||||
| 			line = s.Text() | ||||
| 		} | ||||
| 		t = re{str: line} | ||||
| 		if t.Match(`\\$`) { | ||||
| 			continue | ||||
| 		} | ||||
| 		t = re{str: line} | ||||
| 
 | ||||
| 		switch goos { | ||||
| 		case "dragonfly": | ||||
| 			if t.Match(`^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$`) { | ||||
| 				num, proto := t.sub[1], t.sub[2] | ||||
| 				name := fmt.Sprintf("SYS_%s", t.sub[3]) | ||||
| 				text += format(name, num, proto) | ||||
| 			} | ||||
| 		case "freebsd": | ||||
| 			if t.Match(`^([0-9]+)\s+\S+\s+(?:NO)?STD\s+({ \S+\s+(\w+).*)$`) { | ||||
| 				num, proto := t.sub[1], t.sub[2] | ||||
| 				name := fmt.Sprintf("SYS_%s", t.sub[3]) | ||||
| 				text += format(name, num, proto) | ||||
| 			} | ||||
| 		case "openbsd": | ||||
| 			if t.Match(`^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$`) { | ||||
| 				num, proto, name := t.sub[1], t.sub[3], t.sub[4] | ||||
| 				text += format(name, num, proto) | ||||
| 			} | ||||
| 		case "netbsd": | ||||
| 			if t.Match(`^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$`) { | ||||
| 				num, proto, compat := t.sub[1], t.sub[6], t.sub[8] | ||||
| 				name := t.sub[7] + "_" + t.sub[9] | ||||
| 				if t.sub[11] != "" { | ||||
| 					name = t.sub[7] + "_" + t.sub[11] | ||||
| 				} | ||||
| 				name = strings.ToUpper(name) | ||||
| 				if compat == "" || compat == "13" || compat == "30" || compat == "50" { | ||||
| 					text += fmt.Sprintf("	%s = %s;  // %s\n", name, num, proto) | ||||
| 				} | ||||
| 			} | ||||
| 		case "darwin": | ||||
| 			if t.Match(`^#define\s+SYS_(\w+)\s+([0-9]+)`) { | ||||
| 				name, num := t.sub[1], t.sub[2] | ||||
| 				name = strings.ToUpper(name) | ||||
| 				text += fmt.Sprintf("	SYS_%s = %s;\n", name, num) | ||||
| 			} | ||||
| 		default: | ||||
| 			fmt.Fprintf(os.Stderr, "unrecognized GOOS=%s\n", goos) | ||||
| 			os.Exit(1) | ||||
| 
 | ||||
| 		} | ||||
| 	} | ||||
| 	err := s.Err() | ||||
| 	checkErr(err) | ||||
| 
 | ||||
| 	fmt.Printf(template, cmdLine(), buildTags(), text) | ||||
| } | ||||
| 
 | ||||
| const template = `// %s
 | ||||
| // Code generated by the command above; see README.md. DO NOT EDIT.
 | ||||
| 
 | ||||
| // +build %s
 | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| const( | ||||
| %s)` | ||||
|  | @ -1,236 +0,0 @@ | |||
| // Copyright 2018 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| // +build aix
 | ||||
| 
 | ||||
| /* | ||||
| Input to cgo -godefs.  See also mkerrors.sh and mkall.sh | ||||
| */ | ||||
| 
 | ||||
| // +godefs map struct_in_addr [4]byte /* in_addr */
 | ||||
| // +godefs map struct_in6_addr [16]byte /* in6_addr */
 | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| /* | ||||
| #include <sys/types.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/limits.h> | ||||
| #include <sys/un.h> | ||||
| #include <utime.h> | ||||
| #include <sys/utsname.h> | ||||
| #include <sys/poll.h> | ||||
| #include <sys/resource.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/statfs.h> | ||||
| #include <sys/termio.h> | ||||
| #include <sys/ioctl.h> | ||||
| 
 | ||||
| #include <termios.h> | ||||
| 
 | ||||
| #include <net/if.h> | ||||
| #include <net/if_dl.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netinet/icmp6.h> | ||||
| 
 | ||||
| 
 | ||||
| #include <dirent.h> | ||||
| #include <fcntl.h> | ||||
| 
 | ||||
| enum { | ||||
| 	sizeofPtr = sizeof(void*), | ||||
| }; | ||||
| 
 | ||||
| union sockaddr_all { | ||||
| 	struct sockaddr s1;     // this one gets used for fields
 | ||||
| 	struct sockaddr_in s2;  // these pad it out
 | ||||
| 	struct sockaddr_in6 s3; | ||||
| 	struct sockaddr_un s4; | ||||
| 	struct sockaddr_dl s5; | ||||
| }; | ||||
| 
 | ||||
| struct sockaddr_any { | ||||
| 	struct sockaddr addr; | ||||
| 	char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; | ||||
| }; | ||||
| 
 | ||||
| */ | ||||
| import "C" | ||||
| 
 | ||||
| // Machine characteristics
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofPtr      = C.sizeofPtr | ||||
| 	SizeofShort    = C.sizeof_short | ||||
| 	SizeofInt      = C.sizeof_int | ||||
| 	SizeofLong     = C.sizeof_long | ||||
| 	SizeofLongLong = C.sizeof_longlong | ||||
| 	PathMax        = C.PATH_MAX | ||||
| ) | ||||
| 
 | ||||
| // Basic types
 | ||||
| 
 | ||||
| type ( | ||||
| 	_C_short     C.short | ||||
| 	_C_int       C.int | ||||
| 	_C_long      C.long | ||||
| 	_C_long_long C.longlong | ||||
| ) | ||||
| 
 | ||||
| type off64 C.off64_t | ||||
| type off C.off_t | ||||
| type Mode_t C.mode_t | ||||
| 
 | ||||
| // Time
 | ||||
| 
 | ||||
| type Timespec C.struct_timespec | ||||
| 
 | ||||
| type StTimespec C.struct_st_timespec | ||||
| 
 | ||||
| type Timeval C.struct_timeval | ||||
| 
 | ||||
| type Timeval32 C.struct_timeval32 | ||||
| 
 | ||||
| type Timex C.struct_timex | ||||
| 
 | ||||
| type Time_t C.time_t | ||||
| 
 | ||||
| type Tms C.struct_tms | ||||
| 
 | ||||
| type Utimbuf C.struct_utimbuf | ||||
| 
 | ||||
| type Timezone C.struct_timezone | ||||
| 
 | ||||
| // Processes
 | ||||
| 
 | ||||
| type Rusage C.struct_rusage | ||||
| 
 | ||||
| type Rlimit C.struct_rlimit64 | ||||
| 
 | ||||
| type Pid_t C.pid_t | ||||
| 
 | ||||
| type _Gid_t C.gid_t | ||||
| 
 | ||||
| type dev_t C.dev_t | ||||
| 
 | ||||
| // Files
 | ||||
| 
 | ||||
| type Stat_t C.struct_stat | ||||
| 
 | ||||
| type StatxTimestamp C.struct_statx_timestamp | ||||
| 
 | ||||
| type Statx_t C.struct_statx | ||||
| 
 | ||||
| type Dirent C.struct_dirent | ||||
| 
 | ||||
| // Sockets
 | ||||
| 
 | ||||
| type RawSockaddrInet4 C.struct_sockaddr_in | ||||
| 
 | ||||
| type RawSockaddrInet6 C.struct_sockaddr_in6 | ||||
| 
 | ||||
| type RawSockaddrUnix C.struct_sockaddr_un | ||||
| 
 | ||||
| type RawSockaddr C.struct_sockaddr | ||||
| 
 | ||||
| type RawSockaddrAny C.struct_sockaddr_any | ||||
| 
 | ||||
| type _Socklen C.socklen_t | ||||
| 
 | ||||
| type Cmsghdr C.struct_cmsghdr | ||||
| 
 | ||||
| type ICMPv6Filter C.struct_icmp6_filter | ||||
| 
 | ||||
| type Iovec C.struct_iovec | ||||
| 
 | ||||
| type IPMreq C.struct_ip_mreq | ||||
| 
 | ||||
| type IPv6Mreq C.struct_ipv6_mreq | ||||
| 
 | ||||
| type IPv6MTUInfo C.struct_ip6_mtuinfo | ||||
| 
 | ||||
| type Linger C.struct_linger | ||||
| 
 | ||||
| type Msghdr C.struct_msghdr | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in | ||||
| 	SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 | ||||
| 	SizeofSockaddrAny   = C.sizeof_struct_sockaddr_any | ||||
| 	SizeofSockaddrUnix  = C.sizeof_struct_sockaddr_un | ||||
| 	SizeofLinger        = C.sizeof_struct_linger | ||||
| 	SizeofIPMreq        = C.sizeof_struct_ip_mreq | ||||
| 	SizeofIPv6Mreq      = C.sizeof_struct_ipv6_mreq | ||||
| 	SizeofIPv6MTUInfo   = C.sizeof_struct_ip6_mtuinfo | ||||
| 	SizeofMsghdr        = C.sizeof_struct_msghdr | ||||
| 	SizeofCmsghdr       = C.sizeof_struct_cmsghdr | ||||
| 	SizeofICMPv6Filter  = C.sizeof_struct_icmp6_filter | ||||
| ) | ||||
| 
 | ||||
| // Routing and interface messages
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofIfMsghdr = C.sizeof_struct_if_msghdr | ||||
| ) | ||||
| 
 | ||||
| type IfMsgHdr C.struct_if_msghdr | ||||
| 
 | ||||
| // Misc
 | ||||
| 
 | ||||
| type FdSet C.fd_set | ||||
| 
 | ||||
| type Utsname C.struct_utsname | ||||
| 
 | ||||
| type Ustat_t C.struct_ustat | ||||
| 
 | ||||
| type Sigset_t C.sigset_t | ||||
| 
 | ||||
| const ( | ||||
| 	AT_FDCWD            = C.AT_FDCWD | ||||
| 	AT_REMOVEDIR        = C.AT_REMOVEDIR | ||||
| 	AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW | ||||
| ) | ||||
| 
 | ||||
| // Terminal handling
 | ||||
| 
 | ||||
| type Termios C.struct_termios | ||||
| 
 | ||||
| type Termio C.struct_termio | ||||
| 
 | ||||
| type Winsize C.struct_winsize | ||||
| 
 | ||||
| //poll
 | ||||
| 
 | ||||
| type PollFd struct { | ||||
| 	Fd      int32 | ||||
| 	Events  uint16 | ||||
| 	Revents uint16 | ||||
| } | ||||
| 
 | ||||
| const ( | ||||
| 	POLLERR    = C.POLLERR | ||||
| 	POLLHUP    = C.POLLHUP | ||||
| 	POLLIN     = C.POLLIN | ||||
| 	POLLNVAL   = C.POLLNVAL | ||||
| 	POLLOUT    = C.POLLOUT | ||||
| 	POLLPRI    = C.POLLPRI | ||||
| 	POLLRDBAND = C.POLLRDBAND | ||||
| 	POLLRDNORM = C.POLLRDNORM | ||||
| 	POLLWRBAND = C.POLLWRBAND | ||||
| 	POLLWRNORM = C.POLLWRNORM | ||||
| ) | ||||
| 
 | ||||
| //flock_t
 | ||||
| 
 | ||||
| type Flock_t C.struct_flock64 | ||||
| 
 | ||||
| // Statfs
 | ||||
| 
 | ||||
| type Fsid_t C.struct_fsid_t | ||||
| type Fsid64_t C.struct_fsid64_t | ||||
| 
 | ||||
| type Statfs_t C.struct_statfs | ||||
| 
 | ||||
| const RNDGETENTCNT = 0x80045200 | ||||
|  | @ -1,283 +0,0 @@ | |||
| // Copyright 2009 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| /* | ||||
| Input to cgo -godefs.  See README.md | ||||
| */ | ||||
| 
 | ||||
| // +godefs map struct_in_addr [4]byte /* in_addr */
 | ||||
| // +godefs map struct_in6_addr [16]byte /* in6_addr */
 | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| /* | ||||
| #define __DARWIN_UNIX03 0 | ||||
| #define KERNEL | ||||
| #define _DARWIN_USE_64_BIT_INODE | ||||
| #include <dirent.h> | ||||
| #include <fcntl.h> | ||||
| #include <poll.h> | ||||
| #include <signal.h> | ||||
| #include <termios.h> | ||||
| #include <unistd.h> | ||||
| #include <mach/mach.h> | ||||
| #include <mach/message.h> | ||||
| #include <sys/event.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/mount.h> | ||||
| #include <sys/param.h> | ||||
| #include <sys/ptrace.h> | ||||
| #include <sys/resource.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/signal.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/uio.h> | ||||
| #include <sys/un.h> | ||||
| #include <sys/utsname.h> | ||||
| #include <sys/wait.h> | ||||
| #include <net/bpf.h> | ||||
| #include <net/if.h> | ||||
| #include <net/if_dl.h> | ||||
| #include <net/if_var.h> | ||||
| #include <net/route.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netinet/icmp6.h> | ||||
| #include <netinet/tcp.h> | ||||
| 
 | ||||
| enum { | ||||
| 	sizeofPtr = sizeof(void*), | ||||
| }; | ||||
| 
 | ||||
| union sockaddr_all { | ||||
| 	struct sockaddr s1;	// this one gets used for fields
 | ||||
| 	struct sockaddr_in s2;	// these pad it out
 | ||||
| 	struct sockaddr_in6 s3; | ||||
| 	struct sockaddr_un s4; | ||||
| 	struct sockaddr_dl s5; | ||||
| }; | ||||
| 
 | ||||
| struct sockaddr_any { | ||||
| 	struct sockaddr addr; | ||||
| 	char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; | ||||
| }; | ||||
| 
 | ||||
| */ | ||||
| import "C" | ||||
| 
 | ||||
| // Machine characteristics
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofPtr      = C.sizeofPtr | ||||
| 	SizeofShort    = C.sizeof_short | ||||
| 	SizeofInt      = C.sizeof_int | ||||
| 	SizeofLong     = C.sizeof_long | ||||
| 	SizeofLongLong = C.sizeof_longlong | ||||
| ) | ||||
| 
 | ||||
| // Basic types
 | ||||
| 
 | ||||
| type ( | ||||
| 	_C_short     C.short | ||||
| 	_C_int       C.int | ||||
| 	_C_long      C.long | ||||
| 	_C_long_long C.longlong | ||||
| ) | ||||
| 
 | ||||
| // Time
 | ||||
| 
 | ||||
| type Timespec C.struct_timespec | ||||
| 
 | ||||
| type Timeval C.struct_timeval | ||||
| 
 | ||||
| type Timeval32 C.struct_timeval32 | ||||
| 
 | ||||
| // Processes
 | ||||
| 
 | ||||
| type Rusage C.struct_rusage | ||||
| 
 | ||||
| type Rlimit C.struct_rlimit | ||||
| 
 | ||||
| type _Gid_t C.gid_t | ||||
| 
 | ||||
| // Files
 | ||||
| 
 | ||||
| type Stat_t C.struct_stat64 | ||||
| 
 | ||||
| type Statfs_t C.struct_statfs64 | ||||
| 
 | ||||
| type Flock_t C.struct_flock | ||||
| 
 | ||||
| type Fstore_t C.struct_fstore | ||||
| 
 | ||||
| type Radvisory_t C.struct_radvisory | ||||
| 
 | ||||
| type Fbootstraptransfer_t C.struct_fbootstraptransfer | ||||
| 
 | ||||
| type Log2phys_t C.struct_log2phys | ||||
| 
 | ||||
| type Fsid C.struct_fsid | ||||
| 
 | ||||
| type Dirent C.struct_dirent | ||||
| 
 | ||||
| // Sockets
 | ||||
| 
 | ||||
| type RawSockaddrInet4 C.struct_sockaddr_in | ||||
| 
 | ||||
| type RawSockaddrInet6 C.struct_sockaddr_in6 | ||||
| 
 | ||||
| type RawSockaddrUnix C.struct_sockaddr_un | ||||
| 
 | ||||
| type RawSockaddrDatalink C.struct_sockaddr_dl | ||||
| 
 | ||||
| type RawSockaddr C.struct_sockaddr | ||||
| 
 | ||||
| type RawSockaddrAny C.struct_sockaddr_any | ||||
| 
 | ||||
| type _Socklen C.socklen_t | ||||
| 
 | ||||
| type Linger C.struct_linger | ||||
| 
 | ||||
| type Iovec C.struct_iovec | ||||
| 
 | ||||
| type IPMreq C.struct_ip_mreq | ||||
| 
 | ||||
| type IPv6Mreq C.struct_ipv6_mreq | ||||
| 
 | ||||
| type Msghdr C.struct_msghdr | ||||
| 
 | ||||
| type Cmsghdr C.struct_cmsghdr | ||||
| 
 | ||||
| type Inet4Pktinfo C.struct_in_pktinfo | ||||
| 
 | ||||
| type Inet6Pktinfo C.struct_in6_pktinfo | ||||
| 
 | ||||
| type IPv6MTUInfo C.struct_ip6_mtuinfo | ||||
| 
 | ||||
| type ICMPv6Filter C.struct_icmp6_filter | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in | ||||
| 	SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6 | ||||
| 	SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any | ||||
| 	SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un | ||||
| 	SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl | ||||
| 	SizeofLinger           = C.sizeof_struct_linger | ||||
| 	SizeofIPMreq           = C.sizeof_struct_ip_mreq | ||||
| 	SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq | ||||
| 	SizeofMsghdr           = C.sizeof_struct_msghdr | ||||
| 	SizeofCmsghdr          = C.sizeof_struct_cmsghdr | ||||
| 	SizeofInet4Pktinfo     = C.sizeof_struct_in_pktinfo | ||||
| 	SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo | ||||
| 	SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo | ||||
| 	SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter | ||||
| ) | ||||
| 
 | ||||
| // Ptrace requests
 | ||||
| 
 | ||||
| const ( | ||||
| 	PTRACE_TRACEME = C.PT_TRACE_ME | ||||
| 	PTRACE_CONT    = C.PT_CONTINUE | ||||
| 	PTRACE_KILL    = C.PT_KILL | ||||
| ) | ||||
| 
 | ||||
| // Events (kqueue, kevent)
 | ||||
| 
 | ||||
| type Kevent_t C.struct_kevent | ||||
| 
 | ||||
| // Select
 | ||||
| 
 | ||||
| type FdSet C.fd_set | ||||
| 
 | ||||
| // Routing and interface messages
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofIfMsghdr    = C.sizeof_struct_if_msghdr | ||||
| 	SizeofIfData      = C.sizeof_struct_if_data | ||||
| 	SizeofIfaMsghdr   = C.sizeof_struct_ifa_msghdr | ||||
| 	SizeofIfmaMsghdr  = C.sizeof_struct_ifma_msghdr | ||||
| 	SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 | ||||
| 	SizeofRtMsghdr    = C.sizeof_struct_rt_msghdr | ||||
| 	SizeofRtMetrics   = C.sizeof_struct_rt_metrics | ||||
| ) | ||||
| 
 | ||||
| type IfMsghdr C.struct_if_msghdr | ||||
| 
 | ||||
| type IfData C.struct_if_data | ||||
| 
 | ||||
| type IfaMsghdr C.struct_ifa_msghdr | ||||
| 
 | ||||
| type IfmaMsghdr C.struct_ifma_msghdr | ||||
| 
 | ||||
| type IfmaMsghdr2 C.struct_ifma_msghdr2 | ||||
| 
 | ||||
| type RtMsghdr C.struct_rt_msghdr | ||||
| 
 | ||||
| type RtMetrics C.struct_rt_metrics | ||||
| 
 | ||||
| // Berkeley packet filter
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofBpfVersion = C.sizeof_struct_bpf_version | ||||
| 	SizeofBpfStat    = C.sizeof_struct_bpf_stat | ||||
| 	SizeofBpfProgram = C.sizeof_struct_bpf_program | ||||
| 	SizeofBpfInsn    = C.sizeof_struct_bpf_insn | ||||
| 	SizeofBpfHdr     = C.sizeof_struct_bpf_hdr | ||||
| ) | ||||
| 
 | ||||
| type BpfVersion C.struct_bpf_version | ||||
| 
 | ||||
| type BpfStat C.struct_bpf_stat | ||||
| 
 | ||||
| type BpfProgram C.struct_bpf_program | ||||
| 
 | ||||
| type BpfInsn C.struct_bpf_insn | ||||
| 
 | ||||
| type BpfHdr C.struct_bpf_hdr | ||||
| 
 | ||||
| // Terminal handling
 | ||||
| 
 | ||||
| type Termios C.struct_termios | ||||
| 
 | ||||
| type Winsize C.struct_winsize | ||||
| 
 | ||||
| // fchmodat-like syscalls.
 | ||||
| 
 | ||||
| const ( | ||||
| 	AT_FDCWD            = C.AT_FDCWD | ||||
| 	AT_REMOVEDIR        = C.AT_REMOVEDIR | ||||
| 	AT_SYMLINK_FOLLOW   = C.AT_SYMLINK_FOLLOW | ||||
| 	AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW | ||||
| ) | ||||
| 
 | ||||
| // poll
 | ||||
| 
 | ||||
| type PollFd C.struct_pollfd | ||||
| 
 | ||||
| const ( | ||||
| 	POLLERR    = C.POLLERR | ||||
| 	POLLHUP    = C.POLLHUP | ||||
| 	POLLIN     = C.POLLIN | ||||
| 	POLLNVAL   = C.POLLNVAL | ||||
| 	POLLOUT    = C.POLLOUT | ||||
| 	POLLPRI    = C.POLLPRI | ||||
| 	POLLRDBAND = C.POLLRDBAND | ||||
| 	POLLRDNORM = C.POLLRDNORM | ||||
| 	POLLWRBAND = C.POLLWRBAND | ||||
| 	POLLWRNORM = C.POLLWRNORM | ||||
| ) | ||||
| 
 | ||||
| // uname
 | ||||
| 
 | ||||
| type Utsname C.struct_utsname | ||||
| 
 | ||||
| // Clockinfo
 | ||||
| 
 | ||||
| const SizeofClockinfo = C.sizeof_struct_clockinfo | ||||
| 
 | ||||
| type Clockinfo C.struct_clockinfo | ||||
|  | @ -1,263 +0,0 @@ | |||
| // Copyright 2009 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| /* | ||||
| Input to cgo -godefs.  See README.md | ||||
| */ | ||||
| 
 | ||||
| // +godefs map struct_in_addr [4]byte /* in_addr */
 | ||||
| // +godefs map struct_in6_addr [16]byte /* in6_addr */
 | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| /* | ||||
| #define KERNEL | ||||
| #include <dirent.h> | ||||
| #include <fcntl.h> | ||||
| #include <poll.h> | ||||
| #include <signal.h> | ||||
| #include <termios.h> | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/event.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/mount.h> | ||||
| #include <sys/param.h> | ||||
| #include <sys/ptrace.h> | ||||
| #include <sys/resource.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/signal.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/un.h> | ||||
| #include <sys/utsname.h> | ||||
| #include <sys/wait.h> | ||||
| #include <net/bpf.h> | ||||
| #include <net/if.h> | ||||
| #include <net/if_dl.h> | ||||
| #include <net/route.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netinet/icmp6.h> | ||||
| #include <netinet/tcp.h> | ||||
| 
 | ||||
| enum { | ||||
| 	sizeofPtr = sizeof(void*), | ||||
| }; | ||||
| 
 | ||||
| union sockaddr_all { | ||||
| 	struct sockaddr s1;	// this one gets used for fields
 | ||||
| 	struct sockaddr_in s2;	// these pad it out
 | ||||
| 	struct sockaddr_in6 s3; | ||||
| 	struct sockaddr_un s4; | ||||
| 	struct sockaddr_dl s5; | ||||
| }; | ||||
| 
 | ||||
| struct sockaddr_any { | ||||
| 	struct sockaddr addr; | ||||
| 	char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; | ||||
| }; | ||||
| 
 | ||||
| */ | ||||
| import "C" | ||||
| 
 | ||||
| // Machine characteristics
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofPtr      = C.sizeofPtr | ||||
| 	SizeofShort    = C.sizeof_short | ||||
| 	SizeofInt      = C.sizeof_int | ||||
| 	SizeofLong     = C.sizeof_long | ||||
| 	SizeofLongLong = C.sizeof_longlong | ||||
| ) | ||||
| 
 | ||||
| // Basic types
 | ||||
| 
 | ||||
| type ( | ||||
| 	_C_short     C.short | ||||
| 	_C_int       C.int | ||||
| 	_C_long      C.long | ||||
| 	_C_long_long C.longlong | ||||
| ) | ||||
| 
 | ||||
| // Time
 | ||||
| 
 | ||||
| type Timespec C.struct_timespec | ||||
| 
 | ||||
| type Timeval C.struct_timeval | ||||
| 
 | ||||
| // Processes
 | ||||
| 
 | ||||
| type Rusage C.struct_rusage | ||||
| 
 | ||||
| type Rlimit C.struct_rlimit | ||||
| 
 | ||||
| type _Gid_t C.gid_t | ||||
| 
 | ||||
| // Files
 | ||||
| 
 | ||||
| type Stat_t C.struct_stat | ||||
| 
 | ||||
| type Statfs_t C.struct_statfs | ||||
| 
 | ||||
| type Flock_t C.struct_flock | ||||
| 
 | ||||
| type Dirent C.struct_dirent | ||||
| 
 | ||||
| type Fsid C.struct_fsid | ||||
| 
 | ||||
| // File system limits
 | ||||
| 
 | ||||
| const ( | ||||
| 	PathMax = C.PATH_MAX | ||||
| ) | ||||
| 
 | ||||
| // Sockets
 | ||||
| 
 | ||||
| type RawSockaddrInet4 C.struct_sockaddr_in | ||||
| 
 | ||||
| type RawSockaddrInet6 C.struct_sockaddr_in6 | ||||
| 
 | ||||
| type RawSockaddrUnix C.struct_sockaddr_un | ||||
| 
 | ||||
| type RawSockaddrDatalink C.struct_sockaddr_dl | ||||
| 
 | ||||
| type RawSockaddr C.struct_sockaddr | ||||
| 
 | ||||
| type RawSockaddrAny C.struct_sockaddr_any | ||||
| 
 | ||||
| type _Socklen C.socklen_t | ||||
| 
 | ||||
| type Linger C.struct_linger | ||||
| 
 | ||||
| type Iovec C.struct_iovec | ||||
| 
 | ||||
| type IPMreq C.struct_ip_mreq | ||||
| 
 | ||||
| type IPv6Mreq C.struct_ipv6_mreq | ||||
| 
 | ||||
| type Msghdr C.struct_msghdr | ||||
| 
 | ||||
| type Cmsghdr C.struct_cmsghdr | ||||
| 
 | ||||
| type Inet6Pktinfo C.struct_in6_pktinfo | ||||
| 
 | ||||
| type IPv6MTUInfo C.struct_ip6_mtuinfo | ||||
| 
 | ||||
| type ICMPv6Filter C.struct_icmp6_filter | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in | ||||
| 	SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6 | ||||
| 	SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any | ||||
| 	SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un | ||||
| 	SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl | ||||
| 	SizeofLinger           = C.sizeof_struct_linger | ||||
| 	SizeofIPMreq           = C.sizeof_struct_ip_mreq | ||||
| 	SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq | ||||
| 	SizeofMsghdr           = C.sizeof_struct_msghdr | ||||
| 	SizeofCmsghdr          = C.sizeof_struct_cmsghdr | ||||
| 	SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo | ||||
| 	SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo | ||||
| 	SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter | ||||
| ) | ||||
| 
 | ||||
| // Ptrace requests
 | ||||
| 
 | ||||
| const ( | ||||
| 	PTRACE_TRACEME = C.PT_TRACE_ME | ||||
| 	PTRACE_CONT    = C.PT_CONTINUE | ||||
| 	PTRACE_KILL    = C.PT_KILL | ||||
| ) | ||||
| 
 | ||||
| // Events (kqueue, kevent)
 | ||||
| 
 | ||||
| type Kevent_t C.struct_kevent | ||||
| 
 | ||||
| // Select
 | ||||
| 
 | ||||
| type FdSet C.fd_set | ||||
| 
 | ||||
| // Routing and interface messages
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofIfMsghdr         = C.sizeof_struct_if_msghdr | ||||
| 	SizeofIfData           = C.sizeof_struct_if_data | ||||
| 	SizeofIfaMsghdr        = C.sizeof_struct_ifa_msghdr | ||||
| 	SizeofIfmaMsghdr       = C.sizeof_struct_ifma_msghdr | ||||
| 	SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr | ||||
| 	SizeofRtMsghdr         = C.sizeof_struct_rt_msghdr | ||||
| 	SizeofRtMetrics        = C.sizeof_struct_rt_metrics | ||||
| ) | ||||
| 
 | ||||
| type IfMsghdr C.struct_if_msghdr | ||||
| 
 | ||||
| type IfData C.struct_if_data | ||||
| 
 | ||||
| type IfaMsghdr C.struct_ifa_msghdr | ||||
| 
 | ||||
| type IfmaMsghdr C.struct_ifma_msghdr | ||||
| 
 | ||||
| type IfAnnounceMsghdr C.struct_if_announcemsghdr | ||||
| 
 | ||||
| type RtMsghdr C.struct_rt_msghdr | ||||
| 
 | ||||
| type RtMetrics C.struct_rt_metrics | ||||
| 
 | ||||
| // Berkeley packet filter
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofBpfVersion = C.sizeof_struct_bpf_version | ||||
| 	SizeofBpfStat    = C.sizeof_struct_bpf_stat | ||||
| 	SizeofBpfProgram = C.sizeof_struct_bpf_program | ||||
| 	SizeofBpfInsn    = C.sizeof_struct_bpf_insn | ||||
| 	SizeofBpfHdr     = C.sizeof_struct_bpf_hdr | ||||
| ) | ||||
| 
 | ||||
| type BpfVersion C.struct_bpf_version | ||||
| 
 | ||||
| type BpfStat C.struct_bpf_stat | ||||
| 
 | ||||
| type BpfProgram C.struct_bpf_program | ||||
| 
 | ||||
| type BpfInsn C.struct_bpf_insn | ||||
| 
 | ||||
| type BpfHdr C.struct_bpf_hdr | ||||
| 
 | ||||
| // Terminal handling
 | ||||
| 
 | ||||
| type Termios C.struct_termios | ||||
| 
 | ||||
| type Winsize C.struct_winsize | ||||
| 
 | ||||
| // fchmodat-like syscalls.
 | ||||
| 
 | ||||
| const ( | ||||
| 	AT_FDCWD            = C.AT_FDCWD | ||||
| 	AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW | ||||
| ) | ||||
| 
 | ||||
| // poll
 | ||||
| 
 | ||||
| type PollFd C.struct_pollfd | ||||
| 
 | ||||
| const ( | ||||
| 	POLLERR    = C.POLLERR | ||||
| 	POLLHUP    = C.POLLHUP | ||||
| 	POLLIN     = C.POLLIN | ||||
| 	POLLNVAL   = C.POLLNVAL | ||||
| 	POLLOUT    = C.POLLOUT | ||||
| 	POLLPRI    = C.POLLPRI | ||||
| 	POLLRDBAND = C.POLLRDBAND | ||||
| 	POLLRDNORM = C.POLLRDNORM | ||||
| 	POLLWRBAND = C.POLLWRBAND | ||||
| 	POLLWRNORM = C.POLLWRNORM | ||||
| ) | ||||
| 
 | ||||
| // Uname
 | ||||
| 
 | ||||
| type Utsname C.struct_utsname | ||||
|  | @ -1,356 +0,0 @@ | |||
| // Copyright 2009 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| /* | ||||
| Input to cgo -godefs.  See README.md | ||||
| */ | ||||
| 
 | ||||
| // +godefs map struct_in_addr [4]byte /* in_addr */
 | ||||
| // +godefs map struct_in6_addr [16]byte /* in6_addr */
 | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| /* | ||||
| #define	_WANT_FREEBSD11_STAT	1 | ||||
| #define	_WANT_FREEBSD11_STATFS	1 | ||||
| #define	_WANT_FREEBSD11_DIRENT	1 | ||||
| #define	_WANT_FREEBSD11_KEVENT  1 | ||||
| 
 | ||||
| #include <dirent.h> | ||||
| #include <fcntl.h> | ||||
| #include <poll.h> | ||||
| #include <signal.h> | ||||
| #include <termios.h> | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/capsicum.h> | ||||
| #include <sys/event.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/mount.h> | ||||
| #include <sys/param.h> | ||||
| #include <sys/ptrace.h> | ||||
| #include <sys/resource.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/signal.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/un.h> | ||||
| #include <sys/utsname.h> | ||||
| #include <sys/wait.h> | ||||
| #include <net/bpf.h> | ||||
| #include <net/if.h> | ||||
| #include <net/if_dl.h> | ||||
| #include <net/route.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netinet/icmp6.h> | ||||
| #include <netinet/tcp.h> | ||||
| 
 | ||||
| enum { | ||||
| 	sizeofPtr = sizeof(void*), | ||||
| }; | ||||
| 
 | ||||
| union sockaddr_all { | ||||
| 	struct sockaddr s1;	// this one gets used for fields
 | ||||
| 	struct sockaddr_in s2;	// these pad it out
 | ||||
| 	struct sockaddr_in6 s3; | ||||
| 	struct sockaddr_un s4; | ||||
| 	struct sockaddr_dl s5; | ||||
| }; | ||||
| 
 | ||||
| struct sockaddr_any { | ||||
| 	struct sockaddr addr; | ||||
| 	char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; | ||||
| }; | ||||
| 
 | ||||
| // This structure is a duplicate of if_data on FreeBSD 8-STABLE.
 | ||||
| // See /usr/include/net/if.h.
 | ||||
| struct if_data8 { | ||||
| 	u_char  ifi_type; | ||||
| 	u_char  ifi_physical; | ||||
| 	u_char  ifi_addrlen; | ||||
| 	u_char  ifi_hdrlen; | ||||
| 	u_char  ifi_link_state; | ||||
| 	u_char  ifi_spare_char1; | ||||
| 	u_char  ifi_spare_char2; | ||||
| 	u_char  ifi_datalen; | ||||
| 	u_long  ifi_mtu; | ||||
| 	u_long  ifi_metric; | ||||
| 	u_long  ifi_baudrate; | ||||
| 	u_long  ifi_ipackets; | ||||
| 	u_long  ifi_ierrors; | ||||
| 	u_long  ifi_opackets; | ||||
| 	u_long  ifi_oerrors; | ||||
| 	u_long  ifi_collisions; | ||||
| 	u_long  ifi_ibytes; | ||||
| 	u_long  ifi_obytes; | ||||
| 	u_long  ifi_imcasts; | ||||
| 	u_long  ifi_omcasts; | ||||
| 	u_long  ifi_iqdrops; | ||||
| 	u_long  ifi_noproto; | ||||
| 	u_long  ifi_hwassist; | ||||
| // FIXME: these are now unions, so maybe need to change definitions?
 | ||||
| #undef ifi_epoch | ||||
| 	time_t  ifi_epoch; | ||||
| #undef ifi_lastchange | ||||
| 	struct  timeval ifi_lastchange; | ||||
| }; | ||||
| 
 | ||||
| // This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE.
 | ||||
| // See /usr/include/net/if.h.
 | ||||
| struct if_msghdr8 { | ||||
| 	u_short ifm_msglen; | ||||
| 	u_char  ifm_version; | ||||
| 	u_char  ifm_type; | ||||
| 	int     ifm_addrs; | ||||
| 	int     ifm_flags; | ||||
| 	u_short ifm_index; | ||||
| 	struct  if_data8 ifm_data; | ||||
| }; | ||||
| */ | ||||
| import "C" | ||||
| 
 | ||||
| // Machine characteristics
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofPtr      = C.sizeofPtr | ||||
| 	SizeofShort    = C.sizeof_short | ||||
| 	SizeofInt      = C.sizeof_int | ||||
| 	SizeofLong     = C.sizeof_long | ||||
| 	SizeofLongLong = C.sizeof_longlong | ||||
| ) | ||||
| 
 | ||||
| // Basic types
 | ||||
| 
 | ||||
| type ( | ||||
| 	_C_short     C.short | ||||
| 	_C_int       C.int | ||||
| 	_C_long      C.long | ||||
| 	_C_long_long C.longlong | ||||
| ) | ||||
| 
 | ||||
| // Time
 | ||||
| 
 | ||||
| type Timespec C.struct_timespec | ||||
| 
 | ||||
| type Timeval C.struct_timeval | ||||
| 
 | ||||
| // Processes
 | ||||
| 
 | ||||
| type Rusage C.struct_rusage | ||||
| 
 | ||||
| type Rlimit C.struct_rlimit | ||||
| 
 | ||||
| type _Gid_t C.gid_t | ||||
| 
 | ||||
| // Files
 | ||||
| 
 | ||||
| const ( | ||||
| 	_statfsVersion = C.STATFS_VERSION | ||||
| 	_dirblksiz     = C.DIRBLKSIZ | ||||
| ) | ||||
| 
 | ||||
| type Stat_t C.struct_stat | ||||
| 
 | ||||
| type stat_freebsd11_t C.struct_freebsd11_stat | ||||
| 
 | ||||
| type Statfs_t C.struct_statfs | ||||
| 
 | ||||
| type statfs_freebsd11_t C.struct_freebsd11_statfs | ||||
| 
 | ||||
| type Flock_t C.struct_flock | ||||
| 
 | ||||
| type Dirent C.struct_dirent | ||||
| 
 | ||||
| type dirent_freebsd11 C.struct_freebsd11_dirent | ||||
| 
 | ||||
| type Fsid C.struct_fsid | ||||
| 
 | ||||
| // File system limits
 | ||||
| 
 | ||||
| const ( | ||||
| 	PathMax = C.PATH_MAX | ||||
| ) | ||||
| 
 | ||||
| // Advice to Fadvise
 | ||||
| 
 | ||||
| const ( | ||||
| 	FADV_NORMAL     = C.POSIX_FADV_NORMAL | ||||
| 	FADV_RANDOM     = C.POSIX_FADV_RANDOM | ||||
| 	FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL | ||||
| 	FADV_WILLNEED   = C.POSIX_FADV_WILLNEED | ||||
| 	FADV_DONTNEED   = C.POSIX_FADV_DONTNEED | ||||
| 	FADV_NOREUSE    = C.POSIX_FADV_NOREUSE | ||||
| ) | ||||
| 
 | ||||
| // Sockets
 | ||||
| 
 | ||||
| type RawSockaddrInet4 C.struct_sockaddr_in | ||||
| 
 | ||||
| type RawSockaddrInet6 C.struct_sockaddr_in6 | ||||
| 
 | ||||
| type RawSockaddrUnix C.struct_sockaddr_un | ||||
| 
 | ||||
| type RawSockaddrDatalink C.struct_sockaddr_dl | ||||
| 
 | ||||
| type RawSockaddr C.struct_sockaddr | ||||
| 
 | ||||
| type RawSockaddrAny C.struct_sockaddr_any | ||||
| 
 | ||||
| type _Socklen C.socklen_t | ||||
| 
 | ||||
| type Linger C.struct_linger | ||||
| 
 | ||||
| type Iovec C.struct_iovec | ||||
| 
 | ||||
| type IPMreq C.struct_ip_mreq | ||||
| 
 | ||||
| type IPMreqn C.struct_ip_mreqn | ||||
| 
 | ||||
| type IPv6Mreq C.struct_ipv6_mreq | ||||
| 
 | ||||
| type Msghdr C.struct_msghdr | ||||
| 
 | ||||
| type Cmsghdr C.struct_cmsghdr | ||||
| 
 | ||||
| type Inet6Pktinfo C.struct_in6_pktinfo | ||||
| 
 | ||||
| type IPv6MTUInfo C.struct_ip6_mtuinfo | ||||
| 
 | ||||
| type ICMPv6Filter C.struct_icmp6_filter | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in | ||||
| 	SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6 | ||||
| 	SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any | ||||
| 	SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un | ||||
| 	SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl | ||||
| 	SizeofLinger           = C.sizeof_struct_linger | ||||
| 	SizeofIPMreq           = C.sizeof_struct_ip_mreq | ||||
| 	SizeofIPMreqn          = C.sizeof_struct_ip_mreqn | ||||
| 	SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq | ||||
| 	SizeofMsghdr           = C.sizeof_struct_msghdr | ||||
| 	SizeofCmsghdr          = C.sizeof_struct_cmsghdr | ||||
| 	SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo | ||||
| 	SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo | ||||
| 	SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter | ||||
| ) | ||||
| 
 | ||||
| // Ptrace requests
 | ||||
| 
 | ||||
| const ( | ||||
| 	PTRACE_TRACEME = C.PT_TRACE_ME | ||||
| 	PTRACE_CONT    = C.PT_CONTINUE | ||||
| 	PTRACE_KILL    = C.PT_KILL | ||||
| ) | ||||
| 
 | ||||
| // Events (kqueue, kevent)
 | ||||
| 
 | ||||
| type Kevent_t C.struct_kevent_freebsd11 | ||||
| 
 | ||||
| // Select
 | ||||
| 
 | ||||
| type FdSet C.fd_set | ||||
| 
 | ||||
| // Routing and interface messages
 | ||||
| 
 | ||||
| const ( | ||||
| 	sizeofIfMsghdr         = C.sizeof_struct_if_msghdr | ||||
| 	SizeofIfMsghdr         = C.sizeof_struct_if_msghdr8 | ||||
| 	sizeofIfData           = C.sizeof_struct_if_data | ||||
| 	SizeofIfData           = C.sizeof_struct_if_data8 | ||||
| 	SizeofIfaMsghdr        = C.sizeof_struct_ifa_msghdr | ||||
| 	SizeofIfmaMsghdr       = C.sizeof_struct_ifma_msghdr | ||||
| 	SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr | ||||
| 	SizeofRtMsghdr         = C.sizeof_struct_rt_msghdr | ||||
| 	SizeofRtMetrics        = C.sizeof_struct_rt_metrics | ||||
| ) | ||||
| 
 | ||||
| type ifMsghdr C.struct_if_msghdr | ||||
| 
 | ||||
| type IfMsghdr C.struct_if_msghdr8 | ||||
| 
 | ||||
| type ifData C.struct_if_data | ||||
| 
 | ||||
| type IfData C.struct_if_data8 | ||||
| 
 | ||||
| type IfaMsghdr C.struct_ifa_msghdr | ||||
| 
 | ||||
| type IfmaMsghdr C.struct_ifma_msghdr | ||||
| 
 | ||||
| type IfAnnounceMsghdr C.struct_if_announcemsghdr | ||||
| 
 | ||||
| type RtMsghdr C.struct_rt_msghdr | ||||
| 
 | ||||
| type RtMetrics C.struct_rt_metrics | ||||
| 
 | ||||
| // Berkeley packet filter
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofBpfVersion    = C.sizeof_struct_bpf_version | ||||
| 	SizeofBpfStat       = C.sizeof_struct_bpf_stat | ||||
| 	SizeofBpfZbuf       = C.sizeof_struct_bpf_zbuf | ||||
| 	SizeofBpfProgram    = C.sizeof_struct_bpf_program | ||||
| 	SizeofBpfInsn       = C.sizeof_struct_bpf_insn | ||||
| 	SizeofBpfHdr        = C.sizeof_struct_bpf_hdr | ||||
| 	SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header | ||||
| ) | ||||
| 
 | ||||
| type BpfVersion C.struct_bpf_version | ||||
| 
 | ||||
| type BpfStat C.struct_bpf_stat | ||||
| 
 | ||||
| type BpfZbuf C.struct_bpf_zbuf | ||||
| 
 | ||||
| type BpfProgram C.struct_bpf_program | ||||
| 
 | ||||
| type BpfInsn C.struct_bpf_insn | ||||
| 
 | ||||
| type BpfHdr C.struct_bpf_hdr | ||||
| 
 | ||||
| type BpfZbufHeader C.struct_bpf_zbuf_header | ||||
| 
 | ||||
| // Terminal handling
 | ||||
| 
 | ||||
| type Termios C.struct_termios | ||||
| 
 | ||||
| type Winsize C.struct_winsize | ||||
| 
 | ||||
| // fchmodat-like syscalls.
 | ||||
| 
 | ||||
| const ( | ||||
| 	AT_FDCWD            = C.AT_FDCWD | ||||
| 	AT_REMOVEDIR        = C.AT_REMOVEDIR | ||||
| 	AT_SYMLINK_FOLLOW   = C.AT_SYMLINK_FOLLOW | ||||
| 	AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW | ||||
| ) | ||||
| 
 | ||||
| // poll
 | ||||
| 
 | ||||
| type PollFd C.struct_pollfd | ||||
| 
 | ||||
| const ( | ||||
| 	POLLERR      = C.POLLERR | ||||
| 	POLLHUP      = C.POLLHUP | ||||
| 	POLLIN       = C.POLLIN | ||||
| 	POLLINIGNEOF = C.POLLINIGNEOF | ||||
| 	POLLNVAL     = C.POLLNVAL | ||||
| 	POLLOUT      = C.POLLOUT | ||||
| 	POLLPRI      = C.POLLPRI | ||||
| 	POLLRDBAND   = C.POLLRDBAND | ||||
| 	POLLRDNORM   = C.POLLRDNORM | ||||
| 	POLLWRBAND   = C.POLLWRBAND | ||||
| 	POLLWRNORM   = C.POLLWRNORM | ||||
| ) | ||||
| 
 | ||||
| // Capabilities
 | ||||
| 
 | ||||
| type CapRights C.struct_cap_rights | ||||
| 
 | ||||
| // Uname
 | ||||
| 
 | ||||
| type Utsname C.struct_utsname | ||||
|  | @ -1,289 +0,0 @@ | |||
| // Copyright 2009 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| /* | ||||
| Input to cgo -godefs.  See README.md | ||||
| */ | ||||
| 
 | ||||
| // +godefs map struct_in_addr [4]byte /* in_addr */
 | ||||
| // +godefs map struct_in6_addr [16]byte /* in6_addr */
 | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| /* | ||||
| #define KERNEL | ||||
| #include <dirent.h> | ||||
| #include <fcntl.h> | ||||
| #include <poll.h> | ||||
| #include <signal.h> | ||||
| #include <termios.h> | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/param.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/event.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/mount.h> | ||||
| #include <sys/ptrace.h> | ||||
| #include <sys/resource.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/signal.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/sysctl.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/uio.h> | ||||
| #include <sys/un.h> | ||||
| #include <sys/utsname.h> | ||||
| #include <sys/wait.h> | ||||
| #include <net/bpf.h> | ||||
| #include <net/if.h> | ||||
| #include <net/if_dl.h> | ||||
| #include <net/route.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netinet/icmp6.h> | ||||
| #include <netinet/tcp.h> | ||||
| 
 | ||||
| enum { | ||||
| 	sizeofPtr = sizeof(void*), | ||||
| }; | ||||
| 
 | ||||
| union sockaddr_all { | ||||
| 	struct sockaddr s1;	// this one gets used for fields
 | ||||
| 	struct sockaddr_in s2;	// these pad it out
 | ||||
| 	struct sockaddr_in6 s3; | ||||
| 	struct sockaddr_un s4; | ||||
| 	struct sockaddr_dl s5; | ||||
| }; | ||||
| 
 | ||||
| struct sockaddr_any { | ||||
| 	struct sockaddr addr; | ||||
| 	char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; | ||||
| }; | ||||
| 
 | ||||
| */ | ||||
| import "C" | ||||
| 
 | ||||
| // Machine characteristics
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofPtr      = C.sizeofPtr | ||||
| 	SizeofShort    = C.sizeof_short | ||||
| 	SizeofInt      = C.sizeof_int | ||||
| 	SizeofLong     = C.sizeof_long | ||||
| 	SizeofLongLong = C.sizeof_longlong | ||||
| ) | ||||
| 
 | ||||
| // Basic types
 | ||||
| 
 | ||||
| type ( | ||||
| 	_C_short     C.short | ||||
| 	_C_int       C.int | ||||
| 	_C_long      C.long | ||||
| 	_C_long_long C.longlong | ||||
| ) | ||||
| 
 | ||||
| // Time
 | ||||
| 
 | ||||
| type Timespec C.struct_timespec | ||||
| 
 | ||||
| type Timeval C.struct_timeval | ||||
| 
 | ||||
| // Processes
 | ||||
| 
 | ||||
| type Rusage C.struct_rusage | ||||
| 
 | ||||
| type Rlimit C.struct_rlimit | ||||
| 
 | ||||
| type _Gid_t C.gid_t | ||||
| 
 | ||||
| // Files
 | ||||
| 
 | ||||
| type Stat_t C.struct_stat | ||||
| 
 | ||||
| type Statfs_t C.struct_statfs | ||||
| 
 | ||||
| type Flock_t C.struct_flock | ||||
| 
 | ||||
| type Dirent C.struct_dirent | ||||
| 
 | ||||
| type Fsid C.fsid_t | ||||
| 
 | ||||
| // File system limits
 | ||||
| 
 | ||||
| const ( | ||||
| 	PathMax = C.PATH_MAX | ||||
| ) | ||||
| 
 | ||||
| // Advice to Fadvise
 | ||||
| 
 | ||||
| const ( | ||||
| 	FADV_NORMAL     = C.POSIX_FADV_NORMAL | ||||
| 	FADV_RANDOM     = C.POSIX_FADV_RANDOM | ||||
| 	FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL | ||||
| 	FADV_WILLNEED   = C.POSIX_FADV_WILLNEED | ||||
| 	FADV_DONTNEED   = C.POSIX_FADV_DONTNEED | ||||
| 	FADV_NOREUSE    = C.POSIX_FADV_NOREUSE | ||||
| ) | ||||
| 
 | ||||
| // Sockets
 | ||||
| 
 | ||||
| type RawSockaddrInet4 C.struct_sockaddr_in | ||||
| 
 | ||||
| type RawSockaddrInet6 C.struct_sockaddr_in6 | ||||
| 
 | ||||
| type RawSockaddrUnix C.struct_sockaddr_un | ||||
| 
 | ||||
| type RawSockaddrDatalink C.struct_sockaddr_dl | ||||
| 
 | ||||
| type RawSockaddr C.struct_sockaddr | ||||
| 
 | ||||
| type RawSockaddrAny C.struct_sockaddr_any | ||||
| 
 | ||||
| type _Socklen C.socklen_t | ||||
| 
 | ||||
| type Linger C.struct_linger | ||||
| 
 | ||||
| type Iovec C.struct_iovec | ||||
| 
 | ||||
| type IPMreq C.struct_ip_mreq | ||||
| 
 | ||||
| type IPv6Mreq C.struct_ipv6_mreq | ||||
| 
 | ||||
| type Msghdr C.struct_msghdr | ||||
| 
 | ||||
| type Cmsghdr C.struct_cmsghdr | ||||
| 
 | ||||
| type Inet6Pktinfo C.struct_in6_pktinfo | ||||
| 
 | ||||
| type IPv6MTUInfo C.struct_ip6_mtuinfo | ||||
| 
 | ||||
| type ICMPv6Filter C.struct_icmp6_filter | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in | ||||
| 	SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6 | ||||
| 	SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any | ||||
| 	SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un | ||||
| 	SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl | ||||
| 	SizeofLinger           = C.sizeof_struct_linger | ||||
| 	SizeofIPMreq           = C.sizeof_struct_ip_mreq | ||||
| 	SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq | ||||
| 	SizeofMsghdr           = C.sizeof_struct_msghdr | ||||
| 	SizeofCmsghdr          = C.sizeof_struct_cmsghdr | ||||
| 	SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo | ||||
| 	SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo | ||||
| 	SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter | ||||
| ) | ||||
| 
 | ||||
| // Ptrace requests
 | ||||
| 
 | ||||
| const ( | ||||
| 	PTRACE_TRACEME = C.PT_TRACE_ME | ||||
| 	PTRACE_CONT    = C.PT_CONTINUE | ||||
| 	PTRACE_KILL    = C.PT_KILL | ||||
| ) | ||||
| 
 | ||||
| // Events (kqueue, kevent)
 | ||||
| 
 | ||||
| type Kevent_t C.struct_kevent | ||||
| 
 | ||||
| // Select
 | ||||
| 
 | ||||
| type FdSet C.fd_set | ||||
| 
 | ||||
| // Routing and interface messages
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofIfMsghdr         = C.sizeof_struct_if_msghdr | ||||
| 	SizeofIfData           = C.sizeof_struct_if_data | ||||
| 	SizeofIfaMsghdr        = C.sizeof_struct_ifa_msghdr | ||||
| 	SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr | ||||
| 	SizeofRtMsghdr         = C.sizeof_struct_rt_msghdr | ||||
| 	SizeofRtMetrics        = C.sizeof_struct_rt_metrics | ||||
| ) | ||||
| 
 | ||||
| type IfMsghdr C.struct_if_msghdr | ||||
| 
 | ||||
| type IfData C.struct_if_data | ||||
| 
 | ||||
| type IfaMsghdr C.struct_ifa_msghdr | ||||
| 
 | ||||
| type IfAnnounceMsghdr C.struct_if_announcemsghdr | ||||
| 
 | ||||
| type RtMsghdr C.struct_rt_msghdr | ||||
| 
 | ||||
| type RtMetrics C.struct_rt_metrics | ||||
| 
 | ||||
| type Mclpool C.struct_mclpool | ||||
| 
 | ||||
| // Berkeley packet filter
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofBpfVersion = C.sizeof_struct_bpf_version | ||||
| 	SizeofBpfStat    = C.sizeof_struct_bpf_stat | ||||
| 	SizeofBpfProgram = C.sizeof_struct_bpf_program | ||||
| 	SizeofBpfInsn    = C.sizeof_struct_bpf_insn | ||||
| 	SizeofBpfHdr     = C.sizeof_struct_bpf_hdr | ||||
| ) | ||||
| 
 | ||||
| type BpfVersion C.struct_bpf_version | ||||
| 
 | ||||
| type BpfStat C.struct_bpf_stat | ||||
| 
 | ||||
| type BpfProgram C.struct_bpf_program | ||||
| 
 | ||||
| type BpfInsn C.struct_bpf_insn | ||||
| 
 | ||||
| type BpfHdr C.struct_bpf_hdr | ||||
| 
 | ||||
| type BpfTimeval C.struct_bpf_timeval | ||||
| 
 | ||||
| // Terminal handling
 | ||||
| 
 | ||||
| type Termios C.struct_termios | ||||
| 
 | ||||
| type Winsize C.struct_winsize | ||||
| 
 | ||||
| type Ptmget C.struct_ptmget | ||||
| 
 | ||||
| // fchmodat-like syscalls.
 | ||||
| 
 | ||||
| const ( | ||||
| 	AT_FDCWD            = C.AT_FDCWD | ||||
| 	AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW | ||||
| ) | ||||
| 
 | ||||
| // poll
 | ||||
| 
 | ||||
| type PollFd C.struct_pollfd | ||||
| 
 | ||||
| const ( | ||||
| 	POLLERR    = C.POLLERR | ||||
| 	POLLHUP    = C.POLLHUP | ||||
| 	POLLIN     = C.POLLIN | ||||
| 	POLLNVAL   = C.POLLNVAL | ||||
| 	POLLOUT    = C.POLLOUT | ||||
| 	POLLPRI    = C.POLLPRI | ||||
| 	POLLRDBAND = C.POLLRDBAND | ||||
| 	POLLRDNORM = C.POLLRDNORM | ||||
| 	POLLWRBAND = C.POLLWRBAND | ||||
| 	POLLWRNORM = C.POLLWRNORM | ||||
| ) | ||||
| 
 | ||||
| // Sysctl
 | ||||
| 
 | ||||
| type Sysctlnode C.struct_sysctlnode | ||||
| 
 | ||||
| // Uname
 | ||||
| 
 | ||||
| type Utsname C.struct_utsname | ||||
| 
 | ||||
| // Clockinfo
 | ||||
| 
 | ||||
| const SizeofClockinfo = C.sizeof_struct_clockinfo | ||||
| 
 | ||||
| type Clockinfo C.struct_clockinfo | ||||
|  | @ -1,282 +0,0 @@ | |||
| // Copyright 2009 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| /* | ||||
| Input to cgo -godefs.  See README.md | ||||
| */ | ||||
| 
 | ||||
| // +godefs map struct_in_addr [4]byte /* in_addr */
 | ||||
| // +godefs map struct_in6_addr [16]byte /* in6_addr */
 | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| /* | ||||
| #define KERNEL | ||||
| #include <dirent.h> | ||||
| #include <fcntl.h> | ||||
| #include <poll.h> | ||||
| #include <signal.h> | ||||
| #include <termios.h> | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/param.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/event.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/mount.h> | ||||
| #include <sys/ptrace.h> | ||||
| #include <sys/resource.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/signal.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/uio.h> | ||||
| #include <sys/un.h> | ||||
| #include <sys/utsname.h> | ||||
| #include <sys/wait.h> | ||||
| #include <uvm/uvmexp.h> | ||||
| #include <net/bpf.h> | ||||
| #include <net/if.h> | ||||
| #include <net/if_dl.h> | ||||
| #include <net/route.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netinet/icmp6.h> | ||||
| #include <netinet/tcp.h> | ||||
| 
 | ||||
| enum { | ||||
| 	sizeofPtr = sizeof(void*), | ||||
| }; | ||||
| 
 | ||||
| union sockaddr_all { | ||||
| 	struct sockaddr s1;	// this one gets used for fields
 | ||||
| 	struct sockaddr_in s2;	// these pad it out
 | ||||
| 	struct sockaddr_in6 s3; | ||||
| 	struct sockaddr_un s4; | ||||
| 	struct sockaddr_dl s5; | ||||
| }; | ||||
| 
 | ||||
| struct sockaddr_any { | ||||
| 	struct sockaddr addr; | ||||
| 	char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; | ||||
| }; | ||||
| 
 | ||||
| */ | ||||
| import "C" | ||||
| 
 | ||||
| // Machine characteristics
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofPtr      = C.sizeofPtr | ||||
| 	SizeofShort    = C.sizeof_short | ||||
| 	SizeofInt      = C.sizeof_int | ||||
| 	SizeofLong     = C.sizeof_long | ||||
| 	SizeofLongLong = C.sizeof_longlong | ||||
| ) | ||||
| 
 | ||||
| // Basic types
 | ||||
| 
 | ||||
| type ( | ||||
| 	_C_short     C.short | ||||
| 	_C_int       C.int | ||||
| 	_C_long      C.long | ||||
| 	_C_long_long C.longlong | ||||
| ) | ||||
| 
 | ||||
| // Time
 | ||||
| 
 | ||||
| type Timespec C.struct_timespec | ||||
| 
 | ||||
| type Timeval C.struct_timeval | ||||
| 
 | ||||
| // Processes
 | ||||
| 
 | ||||
| type Rusage C.struct_rusage | ||||
| 
 | ||||
| type Rlimit C.struct_rlimit | ||||
| 
 | ||||
| type _Gid_t C.gid_t | ||||
| 
 | ||||
| // Files
 | ||||
| 
 | ||||
| type Stat_t C.struct_stat | ||||
| 
 | ||||
| type Statfs_t C.struct_statfs | ||||
| 
 | ||||
| type Flock_t C.struct_flock | ||||
| 
 | ||||
| type Dirent C.struct_dirent | ||||
| 
 | ||||
| type Fsid C.fsid_t | ||||
| 
 | ||||
| // File system limits
 | ||||
| 
 | ||||
| const ( | ||||
| 	PathMax = C.PATH_MAX | ||||
| ) | ||||
| 
 | ||||
| // Sockets
 | ||||
| 
 | ||||
| type RawSockaddrInet4 C.struct_sockaddr_in | ||||
| 
 | ||||
| type RawSockaddrInet6 C.struct_sockaddr_in6 | ||||
| 
 | ||||
| type RawSockaddrUnix C.struct_sockaddr_un | ||||
| 
 | ||||
| type RawSockaddrDatalink C.struct_sockaddr_dl | ||||
| 
 | ||||
| type RawSockaddr C.struct_sockaddr | ||||
| 
 | ||||
| type RawSockaddrAny C.struct_sockaddr_any | ||||
| 
 | ||||
| type _Socklen C.socklen_t | ||||
| 
 | ||||
| type Linger C.struct_linger | ||||
| 
 | ||||
| type Iovec C.struct_iovec | ||||
| 
 | ||||
| type IPMreq C.struct_ip_mreq | ||||
| 
 | ||||
| type IPv6Mreq C.struct_ipv6_mreq | ||||
| 
 | ||||
| type Msghdr C.struct_msghdr | ||||
| 
 | ||||
| type Cmsghdr C.struct_cmsghdr | ||||
| 
 | ||||
| type Inet6Pktinfo C.struct_in6_pktinfo | ||||
| 
 | ||||
| type IPv6MTUInfo C.struct_ip6_mtuinfo | ||||
| 
 | ||||
| type ICMPv6Filter C.struct_icmp6_filter | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in | ||||
| 	SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6 | ||||
| 	SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any | ||||
| 	SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un | ||||
| 	SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl | ||||
| 	SizeofLinger           = C.sizeof_struct_linger | ||||
| 	SizeofIPMreq           = C.sizeof_struct_ip_mreq | ||||
| 	SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq | ||||
| 	SizeofMsghdr           = C.sizeof_struct_msghdr | ||||
| 	SizeofCmsghdr          = C.sizeof_struct_cmsghdr | ||||
| 	SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo | ||||
| 	SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo | ||||
| 	SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter | ||||
| ) | ||||
| 
 | ||||
| // Ptrace requests
 | ||||
| 
 | ||||
| const ( | ||||
| 	PTRACE_TRACEME = C.PT_TRACE_ME | ||||
| 	PTRACE_CONT    = C.PT_CONTINUE | ||||
| 	PTRACE_KILL    = C.PT_KILL | ||||
| ) | ||||
| 
 | ||||
| // Events (kqueue, kevent)
 | ||||
| 
 | ||||
| type Kevent_t C.struct_kevent | ||||
| 
 | ||||
| // Select
 | ||||
| 
 | ||||
| type FdSet C.fd_set | ||||
| 
 | ||||
| // Routing and interface messages
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofIfMsghdr         = C.sizeof_struct_if_msghdr | ||||
| 	SizeofIfData           = C.sizeof_struct_if_data | ||||
| 	SizeofIfaMsghdr        = C.sizeof_struct_ifa_msghdr | ||||
| 	SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr | ||||
| 	SizeofRtMsghdr         = C.sizeof_struct_rt_msghdr | ||||
| 	SizeofRtMetrics        = C.sizeof_struct_rt_metrics | ||||
| ) | ||||
| 
 | ||||
| type IfMsghdr C.struct_if_msghdr | ||||
| 
 | ||||
| type IfData C.struct_if_data | ||||
| 
 | ||||
| type IfaMsghdr C.struct_ifa_msghdr | ||||
| 
 | ||||
| type IfAnnounceMsghdr C.struct_if_announcemsghdr | ||||
| 
 | ||||
| type RtMsghdr C.struct_rt_msghdr | ||||
| 
 | ||||
| type RtMetrics C.struct_rt_metrics | ||||
| 
 | ||||
| type Mclpool C.struct_mclpool | ||||
| 
 | ||||
| // Berkeley packet filter
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofBpfVersion = C.sizeof_struct_bpf_version | ||||
| 	SizeofBpfStat    = C.sizeof_struct_bpf_stat | ||||
| 	SizeofBpfProgram = C.sizeof_struct_bpf_program | ||||
| 	SizeofBpfInsn    = C.sizeof_struct_bpf_insn | ||||
| 	SizeofBpfHdr     = C.sizeof_struct_bpf_hdr | ||||
| ) | ||||
| 
 | ||||
| type BpfVersion C.struct_bpf_version | ||||
| 
 | ||||
| type BpfStat C.struct_bpf_stat | ||||
| 
 | ||||
| type BpfProgram C.struct_bpf_program | ||||
| 
 | ||||
| type BpfInsn C.struct_bpf_insn | ||||
| 
 | ||||
| type BpfHdr C.struct_bpf_hdr | ||||
| 
 | ||||
| type BpfTimeval C.struct_bpf_timeval | ||||
| 
 | ||||
| // Terminal handling
 | ||||
| 
 | ||||
| type Termios C.struct_termios | ||||
| 
 | ||||
| type Winsize C.struct_winsize | ||||
| 
 | ||||
| // fchmodat-like syscalls.
 | ||||
| 
 | ||||
| const ( | ||||
| 	AT_FDCWD            = C.AT_FDCWD | ||||
| 	AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW | ||||
| ) | ||||
| 
 | ||||
| // poll
 | ||||
| 
 | ||||
| type PollFd C.struct_pollfd | ||||
| 
 | ||||
| const ( | ||||
| 	POLLERR    = C.POLLERR | ||||
| 	POLLHUP    = C.POLLHUP | ||||
| 	POLLIN     = C.POLLIN | ||||
| 	POLLNVAL   = C.POLLNVAL | ||||
| 	POLLOUT    = C.POLLOUT | ||||
| 	POLLPRI    = C.POLLPRI | ||||
| 	POLLRDBAND = C.POLLRDBAND | ||||
| 	POLLRDNORM = C.POLLRDNORM | ||||
| 	POLLWRBAND = C.POLLWRBAND | ||||
| 	POLLWRNORM = C.POLLWRNORM | ||||
| ) | ||||
| 
 | ||||
| // Signal Sets
 | ||||
| 
 | ||||
| type Sigset_t C.sigset_t | ||||
| 
 | ||||
| // Uname
 | ||||
| 
 | ||||
| type Utsname C.struct_utsname | ||||
| 
 | ||||
| // Uvmexp
 | ||||
| 
 | ||||
| const SizeofUvmexp = C.sizeof_struct_uvmexp | ||||
| 
 | ||||
| type Uvmexp C.struct_uvmexp | ||||
| 
 | ||||
| // Clockinfo
 | ||||
| 
 | ||||
| const SizeofClockinfo = C.sizeof_struct_clockinfo | ||||
| 
 | ||||
| type Clockinfo C.struct_clockinfo | ||||
|  | @ -1,266 +0,0 @@ | |||
| // Copyright 2009 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| /* | ||||
| Input to cgo -godefs.  See README.md | ||||
| */ | ||||
| 
 | ||||
| // +godefs map struct_in_addr [4]byte /* in_addr */
 | ||||
| // +godefs map struct_in6_addr [16]byte /* in6_addr */
 | ||||
| 
 | ||||
| package unix | ||||
| 
 | ||||
| /* | ||||
| #define KERNEL | ||||
| // These defines ensure that builds done on newer versions of Solaris are
 | ||||
| // backwards-compatible with older versions of Solaris and
 | ||||
| // OpenSolaris-based derivatives.
 | ||||
| #define __USE_SUNOS_SOCKETS__          // msghdr
 | ||||
| #define __USE_LEGACY_PROTOTYPES__      // iovec
 | ||||
| #include <dirent.h> | ||||
| #include <fcntl.h> | ||||
| #include <netdb.h> | ||||
| #include <limits.h> | ||||
| #include <poll.h> | ||||
| #include <signal.h> | ||||
| #include <termios.h> | ||||
| #include <termio.h> | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/mount.h> | ||||
| #include <sys/param.h> | ||||
| #include <sys/resource.h> | ||||
| #include <sys/select.h> | ||||
| #include <sys/signal.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/statvfs.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/times.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/utsname.h> | ||||
| #include <sys/un.h> | ||||
| #include <sys/wait.h> | ||||
| #include <net/bpf.h> | ||||
| #include <net/if.h> | ||||
| #include <net/if_dl.h> | ||||
| #include <net/route.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netinet/icmp6.h> | ||||
| #include <netinet/tcp.h> | ||||
| #include <ustat.h> | ||||
| #include <utime.h> | ||||
| 
 | ||||
| enum { | ||||
| 	sizeofPtr = sizeof(void*), | ||||
| }; | ||||
| 
 | ||||
| union sockaddr_all { | ||||
| 	struct sockaddr s1;	// this one gets used for fields
 | ||||
| 	struct sockaddr_in s2;	// these pad it out
 | ||||
| 	struct sockaddr_in6 s3; | ||||
| 	struct sockaddr_un s4; | ||||
| 	struct sockaddr_dl s5; | ||||
| }; | ||||
| 
 | ||||
| struct sockaddr_any { | ||||
| 	struct sockaddr addr; | ||||
| 	char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; | ||||
| }; | ||||
| 
 | ||||
| */ | ||||
| import "C" | ||||
| 
 | ||||
| // Machine characteristics
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofPtr      = C.sizeofPtr | ||||
| 	SizeofShort    = C.sizeof_short | ||||
| 	SizeofInt      = C.sizeof_int | ||||
| 	SizeofLong     = C.sizeof_long | ||||
| 	SizeofLongLong = C.sizeof_longlong | ||||
| 	PathMax        = C.PATH_MAX | ||||
| 	MaxHostNameLen = C.MAXHOSTNAMELEN | ||||
| ) | ||||
| 
 | ||||
| // Basic types
 | ||||
| 
 | ||||
| type ( | ||||
| 	_C_short     C.short | ||||
| 	_C_int       C.int | ||||
| 	_C_long      C.long | ||||
| 	_C_long_long C.longlong | ||||
| ) | ||||
| 
 | ||||
| // Time
 | ||||
| 
 | ||||
| type Timespec C.struct_timespec | ||||
| 
 | ||||
| type Timeval C.struct_timeval | ||||
| 
 | ||||
| type Timeval32 C.struct_timeval32 | ||||
| 
 | ||||
| type Tms C.struct_tms | ||||
| 
 | ||||
| type Utimbuf C.struct_utimbuf | ||||
| 
 | ||||
| // Processes
 | ||||
| 
 | ||||
| type Rusage C.struct_rusage | ||||
| 
 | ||||
| type Rlimit C.struct_rlimit | ||||
| 
 | ||||
| type _Gid_t C.gid_t | ||||
| 
 | ||||
| // Files
 | ||||
| 
 | ||||
| type Stat_t C.struct_stat | ||||
| 
 | ||||
| type Flock_t C.struct_flock | ||||
| 
 | ||||
| type Dirent C.struct_dirent | ||||
| 
 | ||||
| // Filesystems
 | ||||
| 
 | ||||
| type _Fsblkcnt_t C.fsblkcnt_t | ||||
| 
 | ||||
| type Statvfs_t C.struct_statvfs | ||||
| 
 | ||||
| // Sockets
 | ||||
| 
 | ||||
| type RawSockaddrInet4 C.struct_sockaddr_in | ||||
| 
 | ||||
| type RawSockaddrInet6 C.struct_sockaddr_in6 | ||||
| 
 | ||||
| type RawSockaddrUnix C.struct_sockaddr_un | ||||
| 
 | ||||
| type RawSockaddrDatalink C.struct_sockaddr_dl | ||||
| 
 | ||||
| type RawSockaddr C.struct_sockaddr | ||||
| 
 | ||||
| type RawSockaddrAny C.struct_sockaddr_any | ||||
| 
 | ||||
| type _Socklen C.socklen_t | ||||
| 
 | ||||
| type Linger C.struct_linger | ||||
| 
 | ||||
| type Iovec C.struct_iovec | ||||
| 
 | ||||
| type IPMreq C.struct_ip_mreq | ||||
| 
 | ||||
| type IPv6Mreq C.struct_ipv6_mreq | ||||
| 
 | ||||
| type Msghdr C.struct_msghdr | ||||
| 
 | ||||
| type Cmsghdr C.struct_cmsghdr | ||||
| 
 | ||||
| type Inet6Pktinfo C.struct_in6_pktinfo | ||||
| 
 | ||||
| type IPv6MTUInfo C.struct_ip6_mtuinfo | ||||
| 
 | ||||
| type ICMPv6Filter C.struct_icmp6_filter | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in | ||||
| 	SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6 | ||||
| 	SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any | ||||
| 	SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un | ||||
| 	SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl | ||||
| 	SizeofLinger           = C.sizeof_struct_linger | ||||
| 	SizeofIPMreq           = C.sizeof_struct_ip_mreq | ||||
| 	SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq | ||||
| 	SizeofMsghdr           = C.sizeof_struct_msghdr | ||||
| 	SizeofCmsghdr          = C.sizeof_struct_cmsghdr | ||||
| 	SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo | ||||
| 	SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo | ||||
| 	SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter | ||||
| ) | ||||
| 
 | ||||
| // Select
 | ||||
| 
 | ||||
| type FdSet C.fd_set | ||||
| 
 | ||||
| // Misc
 | ||||
| 
 | ||||
| type Utsname C.struct_utsname | ||||
| 
 | ||||
| type Ustat_t C.struct_ustat | ||||
| 
 | ||||
| const ( | ||||
| 	AT_FDCWD            = C.AT_FDCWD | ||||
| 	AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW | ||||
| 	AT_SYMLINK_FOLLOW   = C.AT_SYMLINK_FOLLOW | ||||
| 	AT_REMOVEDIR        = C.AT_REMOVEDIR | ||||
| 	AT_EACCESS          = C.AT_EACCESS | ||||
| ) | ||||
| 
 | ||||
| // Routing and interface messages
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofIfMsghdr  = C.sizeof_struct_if_msghdr | ||||
| 	SizeofIfData    = C.sizeof_struct_if_data | ||||
| 	SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr | ||||
| 	SizeofRtMsghdr  = C.sizeof_struct_rt_msghdr | ||||
| 	SizeofRtMetrics = C.sizeof_struct_rt_metrics | ||||
| ) | ||||
| 
 | ||||
| type IfMsghdr C.struct_if_msghdr | ||||
| 
 | ||||
| type IfData C.struct_if_data | ||||
| 
 | ||||
| type IfaMsghdr C.struct_ifa_msghdr | ||||
| 
 | ||||
| type RtMsghdr C.struct_rt_msghdr | ||||
| 
 | ||||
| type RtMetrics C.struct_rt_metrics | ||||
| 
 | ||||
| // Berkeley packet filter
 | ||||
| 
 | ||||
| const ( | ||||
| 	SizeofBpfVersion = C.sizeof_struct_bpf_version | ||||
| 	SizeofBpfStat    = C.sizeof_struct_bpf_stat | ||||
| 	SizeofBpfProgram = C.sizeof_struct_bpf_program | ||||
| 	SizeofBpfInsn    = C.sizeof_struct_bpf_insn | ||||
| 	SizeofBpfHdr     = C.sizeof_struct_bpf_hdr | ||||
| ) | ||||
| 
 | ||||
| type BpfVersion C.struct_bpf_version | ||||
| 
 | ||||
| type BpfStat C.struct_bpf_stat | ||||
| 
 | ||||
| type BpfProgram C.struct_bpf_program | ||||
| 
 | ||||
| type BpfInsn C.struct_bpf_insn | ||||
| 
 | ||||
| type BpfTimeval C.struct_bpf_timeval | ||||
| 
 | ||||
| type BpfHdr C.struct_bpf_hdr | ||||
| 
 | ||||
| // Terminal handling
 | ||||
| 
 | ||||
| type Termios C.struct_termios | ||||
| 
 | ||||
| type Termio C.struct_termio | ||||
| 
 | ||||
| type Winsize C.struct_winsize | ||||
| 
 | ||||
| // poll
 | ||||
| 
 | ||||
| type PollFd C.struct_pollfd | ||||
| 
 | ||||
| const ( | ||||
| 	POLLERR    = C.POLLERR | ||||
| 	POLLHUP    = C.POLLHUP | ||||
| 	POLLIN     = C.POLLIN | ||||
| 	POLLNVAL   = C.POLLNVAL | ||||
| 	POLLOUT    = C.POLLOUT | ||||
| 	POLLPRI    = C.POLLPRI | ||||
| 	POLLRDBAND = C.POLLRDBAND | ||||
| 	POLLRDNORM = C.POLLRDNORM | ||||
| 	POLLWRBAND = C.POLLWRBAND | ||||
| 	POLLWRNORM = C.POLLWRNORM | ||||
| ) | ||||
|  | @ -1,133 +0,0 @@ | |||
| // Copyright 2015 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"log" | ||||
| 
 | ||||
| 	"golang.org/x/text/internal/gen" | ||||
| 	"golang.org/x/text/internal/triegen" | ||||
| 	"golang.org/x/text/internal/ucd" | ||||
| ) | ||||
| 
 | ||||
| var outputFile = flag.String("out", "tables.go", "output file") | ||||
| 
 | ||||
| func main() { | ||||
| 	gen.Init() | ||||
| 	gen.Repackage("gen_trieval.go", "trieval.go", "bidi") | ||||
| 	gen.Repackage("gen_ranges.go", "ranges_test.go", "bidi") | ||||
| 
 | ||||
| 	genTables() | ||||
| } | ||||
| 
 | ||||
| // bidiClass names and codes taken from class "bc" in
 | ||||
| // http://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt
 | ||||
| var bidiClass = map[string]Class{ | ||||
| 	"AL":  AL,  // ArabicLetter
 | ||||
| 	"AN":  AN,  // ArabicNumber
 | ||||
| 	"B":   B,   // ParagraphSeparator
 | ||||
| 	"BN":  BN,  // BoundaryNeutral
 | ||||
| 	"CS":  CS,  // CommonSeparator
 | ||||
| 	"EN":  EN,  // EuropeanNumber
 | ||||
| 	"ES":  ES,  // EuropeanSeparator
 | ||||
| 	"ET":  ET,  // EuropeanTerminator
 | ||||
| 	"L":   L,   // LeftToRight
 | ||||
| 	"NSM": NSM, // NonspacingMark
 | ||||
| 	"ON":  ON,  // OtherNeutral
 | ||||
| 	"R":   R,   // RightToLeft
 | ||||
| 	"S":   S,   // SegmentSeparator
 | ||||
| 	"WS":  WS,  // WhiteSpace
 | ||||
| 
 | ||||
| 	"FSI": Control, | ||||
| 	"PDF": Control, | ||||
| 	"PDI": Control, | ||||
| 	"LRE": Control, | ||||
| 	"LRI": Control, | ||||
| 	"LRO": Control, | ||||
| 	"RLE": Control, | ||||
| 	"RLI": Control, | ||||
| 	"RLO": Control, | ||||
| } | ||||
| 
 | ||||
| func genTables() { | ||||
| 	if numClass > 0x0F { | ||||
| 		log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass) | ||||
| 	} | ||||
| 	w := gen.NewCodeWriter() | ||||
| 	defer w.WriteVersionedGoFile(*outputFile, "bidi") | ||||
| 
 | ||||
| 	gen.WriteUnicodeVersion(w) | ||||
| 
 | ||||
| 	t := triegen.NewTrie("bidi") | ||||
| 
 | ||||
| 	// Build data about bracket mapping. These bits need to be or-ed with
 | ||||
| 	// any other bits.
 | ||||
| 	orMask := map[rune]uint64{} | ||||
| 
 | ||||
| 	xorMap := map[rune]int{} | ||||
| 	xorMasks := []rune{0} // First value is no-op.
 | ||||
| 
 | ||||
| 	ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { | ||||
| 		r1 := p.Rune(0) | ||||
| 		r2 := p.Rune(1) | ||||
| 		xor := r1 ^ r2 | ||||
| 		if _, ok := xorMap[xor]; !ok { | ||||
| 			xorMap[xor] = len(xorMasks) | ||||
| 			xorMasks = append(xorMasks, xor) | ||||
| 		} | ||||
| 		entry := uint64(xorMap[xor]) << xorMaskShift | ||||
| 		switch p.String(2) { | ||||
| 		case "o": | ||||
| 			entry |= openMask | ||||
| 		case "c", "n": | ||||
| 		default: | ||||
| 			log.Fatalf("Unknown bracket class %q.", p.String(2)) | ||||
| 		} | ||||
| 		orMask[r1] = entry | ||||
| 	}) | ||||
| 
 | ||||
| 	w.WriteComment(` | ||||
| 	xorMasks contains masks to be xor-ed with brackets to get the reverse | ||||
| 	version.`) | ||||
| 	w.WriteVar("xorMasks", xorMasks) | ||||
| 
 | ||||
| 	done := map[rune]bool{} | ||||
| 
 | ||||
| 	insert := func(r rune, c Class) { | ||||
| 		if !done[r] { | ||||
| 			t.Insert(r, orMask[r]|uint64(c)) | ||||
| 			done[r] = true | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Insert the derived BiDi properties.
 | ||||
| 	ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { | ||||
| 		r := p.Rune(0) | ||||
| 		class, ok := bidiClass[p.String(1)] | ||||
| 		if !ok { | ||||
| 			log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1)) | ||||
| 		} | ||||
| 		insert(r, class) | ||||
| 	}) | ||||
| 	visitDefaults(insert) | ||||
| 
 | ||||
| 	// TODO: use sparse blocks. This would reduce table size considerably
 | ||||
| 	// from the looks of it.
 | ||||
| 
 | ||||
| 	sz, err := t.Gen(w) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 	w.Size += sz | ||||
| } | ||||
| 
 | ||||
| // dummy values to make methods in gen_common compile. The real versions
 | ||||
| // will be generated by this file to tables.go.
 | ||||
| var ( | ||||
| 	xorMasks []rune | ||||
| ) | ||||
|  | @ -1,57 +0,0 @@ | |||
| // Copyright 2015 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"unicode" | ||||
| 
 | ||||
| 	"golang.org/x/text/internal/gen" | ||||
| 	"golang.org/x/text/internal/ucd" | ||||
| 	"golang.org/x/text/unicode/rangetable" | ||||
| ) | ||||
| 
 | ||||
| // These tables are hand-extracted from:
 | ||||
| // http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt
 | ||||
| func visitDefaults(fn func(r rune, c Class)) { | ||||
| 	// first write default values for ranges listed above.
 | ||||
| 	visitRunes(fn, AL, []rune{ | ||||
| 		0x0600, 0x07BF, // Arabic
 | ||||
| 		0x08A0, 0x08FF, // Arabic Extended-A
 | ||||
| 		0xFB50, 0xFDCF, // Arabic Presentation Forms
 | ||||
| 		0xFDF0, 0xFDFF, | ||||
| 		0xFE70, 0xFEFF, | ||||
| 		0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols
 | ||||
| 	}) | ||||
| 	visitRunes(fn, R, []rune{ | ||||
| 		0x0590, 0x05FF, // Hebrew
 | ||||
| 		0x07C0, 0x089F, // Nko et al.
 | ||||
| 		0xFB1D, 0xFB4F, | ||||
| 		0x00010800, 0x00010FFF, // Cypriot Syllabary et. al.
 | ||||
| 		0x0001E800, 0x0001EDFF, | ||||
| 		0x0001EF00, 0x0001EFFF, | ||||
| 	}) | ||||
| 	visitRunes(fn, ET, []rune{ // European Terminator
 | ||||
| 		0x20A0, 0x20Cf, // Currency symbols
 | ||||
| 	}) | ||||
| 	rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) { | ||||
| 		fn(r, BN) // Boundary Neutral
 | ||||
| 	}) | ||||
| 	ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { | ||||
| 		if p.String(1) == "Default_Ignorable_Code_Point" { | ||||
| 			fn(p.Rune(0), BN) // Boundary Neutral
 | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| func visitRunes(fn func(r rune, c Class), c Class, runes []rune) { | ||||
| 	for i := 0; i < len(runes); i += 2 { | ||||
| 		lo, hi := runes[i], runes[i+1] | ||||
| 		for j := lo; j <= hi; j++ { | ||||
| 			fn(j, c) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -1,64 +0,0 @@ | |||
| // Copyright 2015 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| package main | ||||
| 
 | ||||
| // Class is the Unicode BiDi class. Each rune has a single class.
 | ||||
| type Class uint | ||||
| 
 | ||||
| const ( | ||||
| 	L       Class = iota // LeftToRight
 | ||||
| 	R                    // RightToLeft
 | ||||
| 	EN                   // EuropeanNumber
 | ||||
| 	ES                   // EuropeanSeparator
 | ||||
| 	ET                   // EuropeanTerminator
 | ||||
| 	AN                   // ArabicNumber
 | ||||
| 	CS                   // CommonSeparator
 | ||||
| 	B                    // ParagraphSeparator
 | ||||
| 	S                    // SegmentSeparator
 | ||||
| 	WS                   // WhiteSpace
 | ||||
| 	ON                   // OtherNeutral
 | ||||
| 	BN                   // BoundaryNeutral
 | ||||
| 	NSM                  // NonspacingMark
 | ||||
| 	AL                   // ArabicLetter
 | ||||
| 	Control              // Control LRO - PDI
 | ||||
| 
 | ||||
| 	numClass | ||||
| 
 | ||||
| 	LRO // LeftToRightOverride
 | ||||
| 	RLO // RightToLeftOverride
 | ||||
| 	LRE // LeftToRightEmbedding
 | ||||
| 	RLE // RightToLeftEmbedding
 | ||||
| 	PDF // PopDirectionalFormat
 | ||||
| 	LRI // LeftToRightIsolate
 | ||||
| 	RLI // RightToLeftIsolate
 | ||||
| 	FSI // FirstStrongIsolate
 | ||||
| 	PDI // PopDirectionalIsolate
 | ||||
| 
 | ||||
| 	unknownClass = ^Class(0) | ||||
| ) | ||||
| 
 | ||||
| var controlToClass = map[rune]Class{ | ||||
| 	0x202D: LRO, // LeftToRightOverride,
 | ||||
| 	0x202E: RLO, // RightToLeftOverride,
 | ||||
| 	0x202A: LRE, // LeftToRightEmbedding,
 | ||||
| 	0x202B: RLE, // RightToLeftEmbedding,
 | ||||
| 	0x202C: PDF, // PopDirectionalFormat,
 | ||||
| 	0x2066: LRI, // LeftToRightIsolate,
 | ||||
| 	0x2067: RLI, // RightToLeftIsolate,
 | ||||
| 	0x2068: FSI, // FirstStrongIsolate,
 | ||||
| 	0x2069: PDI, // PopDirectionalIsolate,
 | ||||
| } | ||||
| 
 | ||||
| // A trie entry has the following bits:
 | ||||
| // 7..5  XOR mask for brackets
 | ||||
| // 4     1: Bracket open, 0: Bracket close
 | ||||
| // 3..0  Class type
 | ||||
| 
 | ||||
| const ( | ||||
| 	openMask     = 0x10 | ||||
| 	xorMaskShift = 5 | ||||
| ) | ||||
|  | @ -1,976 +0,0 @@ | |||
| // Copyright 2011 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| // Normalization table generator.
 | ||||
| // Data read from the web.
 | ||||
| // See forminfo.go for a description of the trie values associated with each rune.
 | ||||
| 
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"sort" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"golang.org/x/text/internal/gen" | ||||
| 	"golang.org/x/text/internal/triegen" | ||||
| 	"golang.org/x/text/internal/ucd" | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	gen.Init() | ||||
| 	loadUnicodeData() | ||||
| 	compactCCC() | ||||
| 	loadCompositionExclusions() | ||||
| 	completeCharFields(FCanonical) | ||||
| 	completeCharFields(FCompatibility) | ||||
| 	computeNonStarterCounts() | ||||
| 	verifyComputed() | ||||
| 	printChars() | ||||
| 	testDerived() | ||||
| 	printTestdata() | ||||
| 	makeTables() | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	tablelist = flag.String("tables", | ||||
| 		"all", | ||||
| 		"comma-separated list of which tables to generate; "+ | ||||
| 			"can be 'decomp', 'recomp', 'info' and 'all'") | ||||
| 	test = flag.Bool("test", | ||||
| 		false, | ||||
| 		"test existing tables against DerivedNormalizationProps and generate test data for regression testing") | ||||
| 	verbose = flag.Bool("verbose", | ||||
| 		false, | ||||
| 		"write data to stdout as it is parsed") | ||||
| ) | ||||
| 
 | ||||
| const MaxChar = 0x10FFFF // anything above this shouldn't exist
 | ||||
| 
 | ||||
| // Quick Check properties of runes allow us to quickly
 | ||||
| // determine whether a rune may occur in a normal form.
 | ||||
| // For a given normal form, a rune may be guaranteed to occur
 | ||||
| // verbatim (QC=Yes), may or may not combine with another
 | ||||
| // rune (QC=Maybe), or may not occur (QC=No).
 | ||||
| type QCResult int | ||||
| 
 | ||||
| const ( | ||||
| 	QCUnknown QCResult = iota | ||||
| 	QCYes | ||||
| 	QCNo | ||||
| 	QCMaybe | ||||
| ) | ||||
| 
 | ||||
| func (r QCResult) String() string { | ||||
| 	switch r { | ||||
| 	case QCYes: | ||||
| 		return "Yes" | ||||
| 	case QCNo: | ||||
| 		return "No" | ||||
| 	case QCMaybe: | ||||
| 		return "Maybe" | ||||
| 	} | ||||
| 	return "***UNKNOWN***" | ||||
| } | ||||
| 
 | ||||
| const ( | ||||
| 	FCanonical     = iota // NFC or NFD
 | ||||
| 	FCompatibility        // NFKC or NFKD
 | ||||
| 	FNumberOfFormTypes | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	MComposed   = iota // NFC or NFKC
 | ||||
| 	MDecomposed        // NFD or NFKD
 | ||||
| 	MNumberOfModes | ||||
| ) | ||||
| 
 | ||||
| // This contains only the properties we're interested in.
 | ||||
| type Char struct { | ||||
| 	name          string | ||||
| 	codePoint     rune  // if zero, this index is not a valid code point.
 | ||||
| 	ccc           uint8 // canonical combining class
 | ||||
| 	origCCC       uint8 | ||||
| 	excludeInComp bool // from CompositionExclusions.txt
 | ||||
| 	compatDecomp  bool // it has a compatibility expansion
 | ||||
| 
 | ||||
| 	nTrailingNonStarters uint8 | ||||
| 	nLeadingNonStarters  uint8 // must be equal to trailing if non-zero
 | ||||
| 
 | ||||
| 	forms [FNumberOfFormTypes]FormInfo // For FCanonical and FCompatibility
 | ||||
| 
 | ||||
| 	state State | ||||
| } | ||||
| 
 | ||||
| var chars = make([]Char, MaxChar+1) | ||||
| var cccMap = make(map[uint8]uint8) | ||||
| 
 | ||||
| func (c Char) String() string { | ||||
| 	buf := new(bytes.Buffer) | ||||
| 
 | ||||
| 	fmt.Fprintf(buf, "%U [%s]:\n", c.codePoint, c.name) | ||||
| 	fmt.Fprintf(buf, "  ccc: %v\n", c.ccc) | ||||
| 	fmt.Fprintf(buf, "  excludeInComp: %v\n", c.excludeInComp) | ||||
| 	fmt.Fprintf(buf, "  compatDecomp: %v\n", c.compatDecomp) | ||||
| 	fmt.Fprintf(buf, "  state: %v\n", c.state) | ||||
| 	fmt.Fprintf(buf, "  NFC:\n") | ||||
| 	fmt.Fprint(buf, c.forms[FCanonical]) | ||||
| 	fmt.Fprintf(buf, "  NFKC:\n") | ||||
| 	fmt.Fprint(buf, c.forms[FCompatibility]) | ||||
| 
 | ||||
| 	return buf.String() | ||||
| } | ||||
| 
 | ||||
| // In UnicodeData.txt, some ranges are marked like this:
 | ||||
| //	3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
 | ||||
| //	4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
 | ||||
| // parseCharacter keeps a state variable indicating the weirdness.
 | ||||
| type State int | ||||
| 
 | ||||
| const ( | ||||
| 	SNormal State = iota // known to be zero for the type
 | ||||
| 	SFirst | ||||
| 	SLast | ||||
| 	SMissing | ||||
| ) | ||||
| 
 | ||||
| var lastChar = rune('\u0000') | ||||
| 
 | ||||
| func (c Char) isValid() bool { | ||||
| 	return c.codePoint != 0 && c.state != SMissing | ||||
| } | ||||
| 
 | ||||
| type FormInfo struct { | ||||
| 	quickCheck [MNumberOfModes]QCResult // index: MComposed or MDecomposed
 | ||||
| 	verified   [MNumberOfModes]bool     // index: MComposed or MDecomposed
 | ||||
| 
 | ||||
| 	combinesForward  bool // May combine with rune on the right
 | ||||
| 	combinesBackward bool // May combine with rune on the left
 | ||||
| 	isOneWay         bool // Never appears in result
 | ||||
| 	inDecomp         bool // Some decompositions result in this char.
 | ||||
| 	decomp           Decomposition | ||||
| 	expandedDecomp   Decomposition | ||||
| } | ||||
| 
 | ||||
| func (f FormInfo) String() string { | ||||
| 	buf := bytes.NewBuffer(make([]byte, 0)) | ||||
| 
 | ||||
| 	fmt.Fprintf(buf, "    quickCheck[C]: %v\n", f.quickCheck[MComposed]) | ||||
| 	fmt.Fprintf(buf, "    quickCheck[D]: %v\n", f.quickCheck[MDecomposed]) | ||||
| 	fmt.Fprintf(buf, "    cmbForward: %v\n", f.combinesForward) | ||||
| 	fmt.Fprintf(buf, "    cmbBackward: %v\n", f.combinesBackward) | ||||
| 	fmt.Fprintf(buf, "    isOneWay: %v\n", f.isOneWay) | ||||
| 	fmt.Fprintf(buf, "    inDecomp: %v\n", f.inDecomp) | ||||
| 	fmt.Fprintf(buf, "    decomposition: %X\n", f.decomp) | ||||
| 	fmt.Fprintf(buf, "    expandedDecomp: %X\n", f.expandedDecomp) | ||||
| 
 | ||||
| 	return buf.String() | ||||
| } | ||||
| 
 | ||||
| type Decomposition []rune | ||||
| 
 | ||||
| func parseDecomposition(s string, skipfirst bool) (a []rune, err error) { | ||||
| 	decomp := strings.Split(s, " ") | ||||
| 	if len(decomp) > 0 && skipfirst { | ||||
| 		decomp = decomp[1:] | ||||
| 	} | ||||
| 	for _, d := range decomp { | ||||
| 		point, err := strconv.ParseUint(d, 16, 64) | ||||
| 		if err != nil { | ||||
| 			return a, err | ||||
| 		} | ||||
| 		a = append(a, rune(point)) | ||||
| 	} | ||||
| 	return a, nil | ||||
| } | ||||
| 
 | ||||
| func loadUnicodeData() { | ||||
| 	f := gen.OpenUCDFile("UnicodeData.txt") | ||||
| 	defer f.Close() | ||||
| 	p := ucd.New(f) | ||||
| 	for p.Next() { | ||||
| 		r := p.Rune(ucd.CodePoint) | ||||
| 		char := &chars[r] | ||||
| 
 | ||||
| 		char.ccc = uint8(p.Uint(ucd.CanonicalCombiningClass)) | ||||
| 		decmap := p.String(ucd.DecompMapping) | ||||
| 
 | ||||
| 		exp, err := parseDecomposition(decmap, false) | ||||
| 		isCompat := false | ||||
| 		if err != nil { | ||||
| 			if len(decmap) > 0 { | ||||
| 				exp, err = parseDecomposition(decmap, true) | ||||
| 				if err != nil { | ||||
| 					log.Fatalf(`%U: bad decomp |%v|: "%s"`, r, decmap, err) | ||||
| 				} | ||||
| 				isCompat = true | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		char.name = p.String(ucd.Name) | ||||
| 		char.codePoint = r | ||||
| 		char.forms[FCompatibility].decomp = exp | ||||
| 		if !isCompat { | ||||
| 			char.forms[FCanonical].decomp = exp | ||||
| 		} else { | ||||
| 			char.compatDecomp = true | ||||
| 		} | ||||
| 		if len(decmap) > 0 { | ||||
| 			char.forms[FCompatibility].decomp = exp | ||||
| 		} | ||||
| 	} | ||||
| 	if err := p.Err(); err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // compactCCC converts the sparse set of CCC values to a continguous one,
 | ||||
| // reducing the number of bits needed from 8 to 6.
 | ||||
| func compactCCC() { | ||||
| 	m := make(map[uint8]uint8) | ||||
| 	for i := range chars { | ||||
| 		c := &chars[i] | ||||
| 		m[c.ccc] = 0 | ||||
| 	} | ||||
| 	cccs := []int{} | ||||
| 	for v, _ := range m { | ||||
| 		cccs = append(cccs, int(v)) | ||||
| 	} | ||||
| 	sort.Ints(cccs) | ||||
| 	for i, c := range cccs { | ||||
| 		cccMap[uint8(i)] = uint8(c) | ||||
| 		m[uint8(c)] = uint8(i) | ||||
| 	} | ||||
| 	for i := range chars { | ||||
| 		c := &chars[i] | ||||
| 		c.origCCC = c.ccc | ||||
| 		c.ccc = m[c.ccc] | ||||
| 	} | ||||
| 	if len(m) >= 1<<6 { | ||||
| 		log.Fatalf("too many difference CCC values: %d >= 64", len(m)) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // CompositionExclusions.txt has form:
 | ||||
| // 0958    # ...
 | ||||
| // See http://unicode.org/reports/tr44/ for full explanation
 | ||||
| func loadCompositionExclusions() { | ||||
| 	f := gen.OpenUCDFile("CompositionExclusions.txt") | ||||
| 	defer f.Close() | ||||
| 	p := ucd.New(f) | ||||
| 	for p.Next() { | ||||
| 		c := &chars[p.Rune(0)] | ||||
| 		if c.excludeInComp { | ||||
| 			log.Fatalf("%U: Duplicate entry in exclusions.", c.codePoint) | ||||
| 		} | ||||
| 		c.excludeInComp = true | ||||
| 	} | ||||
| 	if e := p.Err(); e != nil { | ||||
| 		log.Fatal(e) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // hasCompatDecomp returns true if any of the recursive
 | ||||
| // decompositions contains a compatibility expansion.
 | ||||
| // In this case, the character may not occur in NFK*.
 | ||||
| func hasCompatDecomp(r rune) bool { | ||||
| 	c := &chars[r] | ||||
| 	if c.compatDecomp { | ||||
| 		return true | ||||
| 	} | ||||
| 	for _, d := range c.forms[FCompatibility].decomp { | ||||
| 		if hasCompatDecomp(d) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // Hangul related constants.
 | ||||
| const ( | ||||
| 	HangulBase = 0xAC00 | ||||
| 	HangulEnd  = 0xD7A4 // hangulBase + Jamo combinations (19 * 21 * 28)
 | ||||
| 
 | ||||
| 	JamoLBase = 0x1100 | ||||
| 	JamoLEnd  = 0x1113 | ||||
| 	JamoVBase = 0x1161 | ||||
| 	JamoVEnd  = 0x1176 | ||||
| 	JamoTBase = 0x11A8 | ||||
| 	JamoTEnd  = 0x11C3 | ||||
| 
 | ||||
| 	JamoLVTCount = 19 * 21 * 28 | ||||
| 	JamoTCount   = 28 | ||||
| ) | ||||
| 
 | ||||
| func isHangul(r rune) bool { | ||||
| 	return HangulBase <= r && r < HangulEnd | ||||
| } | ||||
| 
 | ||||
| func isHangulWithoutJamoT(r rune) bool { | ||||
| 	if !isHangul(r) { | ||||
| 		return false | ||||
| 	} | ||||
| 	r -= HangulBase | ||||
| 	return r < JamoLVTCount && r%JamoTCount == 0 | ||||
| } | ||||
| 
 | ||||
| func ccc(r rune) uint8 { | ||||
| 	return chars[r].ccc | ||||
| } | ||||
| 
 | ||||
| // Insert a rune in a buffer, ordered by Canonical Combining Class.
 | ||||
| func insertOrdered(b Decomposition, r rune) Decomposition { | ||||
| 	n := len(b) | ||||
| 	b = append(b, 0) | ||||
| 	cc := ccc(r) | ||||
| 	if cc > 0 { | ||||
| 		// Use bubble sort.
 | ||||
| 		for ; n > 0; n-- { | ||||
| 			if ccc(b[n-1]) <= cc { | ||||
| 				break | ||||
| 			} | ||||
| 			b[n] = b[n-1] | ||||
| 		} | ||||
| 	} | ||||
| 	b[n] = r | ||||
| 	return b | ||||
| } | ||||
| 
 | ||||
| // Recursively decompose.
 | ||||
| func decomposeRecursive(form int, r rune, d Decomposition) Decomposition { | ||||
| 	dcomp := chars[r].forms[form].decomp | ||||
| 	if len(dcomp) == 0 { | ||||
| 		return insertOrdered(d, r) | ||||
| 	} | ||||
| 	for _, c := range dcomp { | ||||
| 		d = decomposeRecursive(form, c, d) | ||||
| 	} | ||||
| 	return d | ||||
| } | ||||
| 
 | ||||
| func completeCharFields(form int) { | ||||
| 	// Phase 0: pre-expand decomposition.
 | ||||
| 	for i := range chars { | ||||
| 		f := &chars[i].forms[form] | ||||
| 		if len(f.decomp) == 0 { | ||||
| 			continue | ||||
| 		} | ||||
| 		exp := make(Decomposition, 0) | ||||
| 		for _, c := range f.decomp { | ||||
| 			exp = decomposeRecursive(form, c, exp) | ||||
| 		} | ||||
| 		f.expandedDecomp = exp | ||||
| 	} | ||||
| 
 | ||||
| 	// Phase 1: composition exclusion, mark decomposition.
 | ||||
| 	for i := range chars { | ||||
| 		c := &chars[i] | ||||
| 		f := &c.forms[form] | ||||
| 
 | ||||
| 		// Marks script-specific exclusions and version restricted.
 | ||||
| 		f.isOneWay = c.excludeInComp | ||||
| 
 | ||||
| 		// Singletons
 | ||||
| 		f.isOneWay = f.isOneWay || len(f.decomp) == 1 | ||||
| 
 | ||||
| 		// Non-starter decompositions
 | ||||
| 		if len(f.decomp) > 1 { | ||||
| 			chk := c.ccc != 0 || chars[f.decomp[0]].ccc != 0 | ||||
| 			f.isOneWay = f.isOneWay || chk | ||||
| 		} | ||||
| 
 | ||||
| 		// Runes that decompose into more than two runes.
 | ||||
| 		f.isOneWay = f.isOneWay || len(f.decomp) > 2 | ||||
| 
 | ||||
| 		if form == FCompatibility { | ||||
| 			f.isOneWay = f.isOneWay || hasCompatDecomp(c.codePoint) | ||||
| 		} | ||||
| 
 | ||||
| 		for _, r := range f.decomp { | ||||
| 			chars[r].forms[form].inDecomp = true | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Phase 2: forward and backward combining.
 | ||||
| 	for i := range chars { | ||||
| 		c := &chars[i] | ||||
| 		f := &c.forms[form] | ||||
| 
 | ||||
| 		if !f.isOneWay && len(f.decomp) == 2 { | ||||
| 			f0 := &chars[f.decomp[0]].forms[form] | ||||
| 			f1 := &chars[f.decomp[1]].forms[form] | ||||
| 			if !f0.isOneWay { | ||||
| 				f0.combinesForward = true | ||||
| 			} | ||||
| 			if !f1.isOneWay { | ||||
| 				f1.combinesBackward = true | ||||
| 			} | ||||
| 		} | ||||
| 		if isHangulWithoutJamoT(rune(i)) { | ||||
| 			f.combinesForward = true | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Phase 3: quick check values.
 | ||||
| 	for i := range chars { | ||||
| 		c := &chars[i] | ||||
| 		f := &c.forms[form] | ||||
| 
 | ||||
| 		switch { | ||||
| 		case len(f.decomp) > 0: | ||||
| 			f.quickCheck[MDecomposed] = QCNo | ||||
| 		case isHangul(rune(i)): | ||||
| 			f.quickCheck[MDecomposed] = QCNo | ||||
| 		default: | ||||
| 			f.quickCheck[MDecomposed] = QCYes | ||||
| 		} | ||||
| 		switch { | ||||
| 		case f.isOneWay: | ||||
| 			f.quickCheck[MComposed] = QCNo | ||||
| 		case (i & 0xffff00) == JamoLBase: | ||||
| 			f.quickCheck[MComposed] = QCYes | ||||
| 			if JamoLBase <= i && i < JamoLEnd { | ||||
| 				f.combinesForward = true | ||||
| 			} | ||||
| 			if JamoVBase <= i && i < JamoVEnd { | ||||
| 				f.quickCheck[MComposed] = QCMaybe | ||||
| 				f.combinesBackward = true | ||||
| 				f.combinesForward = true | ||||
| 			} | ||||
| 			if JamoTBase <= i && i < JamoTEnd { | ||||
| 				f.quickCheck[MComposed] = QCMaybe | ||||
| 				f.combinesBackward = true | ||||
| 			} | ||||
| 		case !f.combinesBackward: | ||||
| 			f.quickCheck[MComposed] = QCYes | ||||
| 		default: | ||||
| 			f.quickCheck[MComposed] = QCMaybe | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func computeNonStarterCounts() { | ||||
| 	// Phase 4: leading and trailing non-starter count
 | ||||
| 	for i := range chars { | ||||
| 		c := &chars[i] | ||||
| 
 | ||||
| 		runes := []rune{rune(i)} | ||||
| 		// We always use FCompatibility so that the CGJ insertion points do not
 | ||||
| 		// change for repeated normalizations with different forms.
 | ||||
| 		if exp := c.forms[FCompatibility].expandedDecomp; len(exp) > 0 { | ||||
| 			runes = exp | ||||
| 		} | ||||
| 		// We consider runes that combine backwards to be non-starters for the
 | ||||
| 		// purpose of Stream-Safe Text Processing.
 | ||||
| 		for _, r := range runes { | ||||
| 			if cr := &chars[r]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { | ||||
| 				break | ||||
| 			} | ||||
| 			c.nLeadingNonStarters++ | ||||
| 		} | ||||
| 		for i := len(runes) - 1; i >= 0; i-- { | ||||
| 			if cr := &chars[runes[i]]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { | ||||
| 				break | ||||
| 			} | ||||
| 			c.nTrailingNonStarters++ | ||||
| 		} | ||||
| 		if c.nTrailingNonStarters > 3 { | ||||
| 			log.Fatalf("%U: Decomposition with more than 3 (%d) trailing modifiers (%U)", i, c.nTrailingNonStarters, runes) | ||||
| 		} | ||||
| 
 | ||||
| 		if isHangul(rune(i)) { | ||||
| 			c.nTrailingNonStarters = 2 | ||||
| 			if isHangulWithoutJamoT(rune(i)) { | ||||
| 				c.nTrailingNonStarters = 1 | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if l, t := c.nLeadingNonStarters, c.nTrailingNonStarters; l > 0 && l != t { | ||||
| 			log.Fatalf("%U: number of leading and trailing non-starters should be equal (%d vs %d)", i, l, t) | ||||
| 		} | ||||
| 		if t := c.nTrailingNonStarters; t > 3 { | ||||
| 			log.Fatalf("%U: number of trailing non-starters is %d > 3", t) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func printBytes(w io.Writer, b []byte, name string) { | ||||
| 	fmt.Fprintf(w, "// %s: %d bytes\n", name, len(b)) | ||||
| 	fmt.Fprintf(w, "var %s = [...]byte {", name) | ||||
| 	for i, c := range b { | ||||
| 		switch { | ||||
| 		case i%64 == 0: | ||||
| 			fmt.Fprintf(w, "\n// Bytes %x - %x\n", i, i+63) | ||||
| 		case i%8 == 0: | ||||
| 			fmt.Fprintf(w, "\n") | ||||
| 		} | ||||
| 		fmt.Fprintf(w, "0x%.2X, ", c) | ||||
| 	} | ||||
| 	fmt.Fprint(w, "\n}\n\n") | ||||
| } | ||||
| 
 | ||||
| // See forminfo.go for format.
 | ||||
| func makeEntry(f *FormInfo, c *Char) uint16 { | ||||
| 	e := uint16(0) | ||||
| 	if r := c.codePoint; HangulBase <= r && r < HangulEnd { | ||||
| 		e |= 0x40 | ||||
| 	} | ||||
| 	if f.combinesForward { | ||||
| 		e |= 0x20 | ||||
| 	} | ||||
| 	if f.quickCheck[MDecomposed] == QCNo { | ||||
| 		e |= 0x4 | ||||
| 	} | ||||
| 	switch f.quickCheck[MComposed] { | ||||
| 	case QCYes: | ||||
| 	case QCNo: | ||||
| 		e |= 0x10 | ||||
| 	case QCMaybe: | ||||
| 		e |= 0x18 | ||||
| 	default: | ||||
| 		log.Fatalf("Illegal quickcheck value %v.", f.quickCheck[MComposed]) | ||||
| 	} | ||||
| 	e |= uint16(c.nTrailingNonStarters) | ||||
| 	return e | ||||
| } | ||||
| 
 | ||||
| // decompSet keeps track of unique decompositions, grouped by whether
 | ||||
| // the decomposition is followed by a trailing and/or leading CCC.
 | ||||
| type decompSet [7]map[string]bool | ||||
| 
 | ||||
| const ( | ||||
| 	normalDecomp = iota | ||||
| 	firstMulti | ||||
| 	firstCCC | ||||
| 	endMulti | ||||
| 	firstLeadingCCC | ||||
| 	firstCCCZeroExcept | ||||
| 	firstStarterWithNLead | ||||
| 	lastDecomp | ||||
| ) | ||||
| 
 | ||||
| var cname = []string{"firstMulti", "firstCCC", "endMulti", "firstLeadingCCC", "firstCCCZeroExcept", "firstStarterWithNLead", "lastDecomp"} | ||||
| 
 | ||||
| func makeDecompSet() decompSet { | ||||
| 	m := decompSet{} | ||||
| 	for i := range m { | ||||
| 		m[i] = make(map[string]bool) | ||||
| 	} | ||||
| 	return m | ||||
| } | ||||
| func (m *decompSet) insert(key int, s string) { | ||||
| 	m[key][s] = true | ||||
| } | ||||
| 
 | ||||
| func printCharInfoTables(w io.Writer) int { | ||||
| 	mkstr := func(r rune, f *FormInfo) (int, string) { | ||||
| 		d := f.expandedDecomp | ||||
| 		s := string([]rune(d)) | ||||
| 		if max := 1 << 6; len(s) >= max { | ||||
| 			const msg = "%U: too many bytes in decomposition: %d >= %d" | ||||
| 			log.Fatalf(msg, r, len(s), max) | ||||
| 		} | ||||
| 		head := uint8(len(s)) | ||||
| 		if f.quickCheck[MComposed] != QCYes { | ||||
| 			head |= 0x40 | ||||
| 		} | ||||
| 		if f.combinesForward { | ||||
| 			head |= 0x80 | ||||
| 		} | ||||
| 		s = string([]byte{head}) + s | ||||
| 
 | ||||
| 		lccc := ccc(d[0]) | ||||
| 		tccc := ccc(d[len(d)-1]) | ||||
| 		cc := ccc(r) | ||||
| 		if cc != 0 && lccc == 0 && tccc == 0 { | ||||
| 			log.Fatalf("%U: trailing and leading ccc are 0 for non-zero ccc %d", r, cc) | ||||
| 		} | ||||
| 		if tccc < lccc && lccc != 0 { | ||||
| 			const msg = "%U: lccc (%d) must be <= tcc (%d)" | ||||
| 			log.Fatalf(msg, r, lccc, tccc) | ||||
| 		} | ||||
| 		index := normalDecomp | ||||
| 		nTrail := chars[r].nTrailingNonStarters | ||||
| 		nLead := chars[r].nLeadingNonStarters | ||||
| 		if tccc > 0 || lccc > 0 || nTrail > 0 { | ||||
| 			tccc <<= 2 | ||||
| 			tccc |= nTrail | ||||
| 			s += string([]byte{tccc}) | ||||
| 			index = endMulti | ||||
| 			for _, r := range d[1:] { | ||||
| 				if ccc(r) == 0 { | ||||
| 					index = firstCCC | ||||
| 				} | ||||
| 			} | ||||
| 			if lccc > 0 || nLead > 0 { | ||||
| 				s += string([]byte{lccc}) | ||||
| 				if index == firstCCC { | ||||
| 					log.Fatalf("%U: multi-segment decomposition not supported for decompositions with leading CCC != 0", r) | ||||
| 				} | ||||
| 				index = firstLeadingCCC | ||||
| 			} | ||||
| 			if cc != lccc { | ||||
| 				if cc != 0 { | ||||
| 					log.Fatalf("%U: for lccc != ccc, expected ccc to be 0; was %d", r, cc) | ||||
| 				} | ||||
| 				index = firstCCCZeroExcept | ||||
| 			} | ||||
| 		} else if len(d) > 1 { | ||||
| 			index = firstMulti | ||||
| 		} | ||||
| 		return index, s | ||||
| 	} | ||||
| 
 | ||||
| 	decompSet := makeDecompSet() | ||||
| 	const nLeadStr = "\x00\x01" // 0-byte length and tccc with nTrail.
 | ||||
| 	decompSet.insert(firstStarterWithNLead, nLeadStr) | ||||
| 
 | ||||
| 	// Store the uniqued decompositions in a byte buffer,
 | ||||
| 	// preceded by their byte length.
 | ||||
| 	for _, c := range chars { | ||||
| 		for _, f := range c.forms { | ||||
| 			if len(f.expandedDecomp) == 0 { | ||||
| 				continue | ||||
| 			} | ||||
| 			if f.combinesBackward { | ||||
| 				log.Fatalf("%U: combinesBackward and decompose", c.codePoint) | ||||
| 			} | ||||
| 			index, s := mkstr(c.codePoint, &f) | ||||
| 			decompSet.insert(index, s) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	decompositions := bytes.NewBuffer(make([]byte, 0, 10000)) | ||||
| 	size := 0 | ||||
| 	positionMap := make(map[string]uint16) | ||||
| 	decompositions.WriteString("\000") | ||||
| 	fmt.Fprintln(w, "const (") | ||||
| 	for i, m := range decompSet { | ||||
| 		sa := []string{} | ||||
| 		for s := range m { | ||||
| 			sa = append(sa, s) | ||||
| 		} | ||||
| 		sort.Strings(sa) | ||||
| 		for _, s := range sa { | ||||
| 			p := decompositions.Len() | ||||
| 			decompositions.WriteString(s) | ||||
| 			positionMap[s] = uint16(p) | ||||
| 		} | ||||
| 		if cname[i] != "" { | ||||
| 			fmt.Fprintf(w, "%s = 0x%X\n", cname[i], decompositions.Len()) | ||||
| 		} | ||||
| 	} | ||||
| 	fmt.Fprintln(w, "maxDecomp = 0x8000") | ||||
| 	fmt.Fprintln(w, ")") | ||||
| 	b := decompositions.Bytes() | ||||
| 	printBytes(w, b, "decomps") | ||||
| 	size += len(b) | ||||
| 
 | ||||
| 	varnames := []string{"nfc", "nfkc"} | ||||
| 	for i := 0; i < FNumberOfFormTypes; i++ { | ||||
| 		trie := triegen.NewTrie(varnames[i]) | ||||
| 
 | ||||
| 		for r, c := range chars { | ||||
| 			f := c.forms[i] | ||||
| 			d := f.expandedDecomp | ||||
| 			if len(d) != 0 { | ||||
| 				_, key := mkstr(c.codePoint, &f) | ||||
| 				trie.Insert(rune(r), uint64(positionMap[key])) | ||||
| 				if c.ccc != ccc(d[0]) { | ||||
| 					// We assume the lead ccc of a decomposition !=0 in this case.
 | ||||
| 					if ccc(d[0]) == 0 { | ||||
| 						log.Fatalf("Expected leading CCC to be non-zero; ccc is %d", c.ccc) | ||||
| 					} | ||||
| 				} | ||||
| 			} else if c.nLeadingNonStarters > 0 && len(f.expandedDecomp) == 0 && c.ccc == 0 && !f.combinesBackward { | ||||
| 				// Handle cases where it can't be detected that the nLead should be equal
 | ||||
| 				// to nTrail.
 | ||||
| 				trie.Insert(c.codePoint, uint64(positionMap[nLeadStr])) | ||||
| 			} else if v := makeEntry(&f, &c)<<8 | uint16(c.ccc); v != 0 { | ||||
| 				trie.Insert(c.codePoint, uint64(0x8000|v)) | ||||
| 			} | ||||
| 		} | ||||
| 		sz, err := trie.Gen(w, triegen.Compact(&normCompacter{name: varnames[i]})) | ||||
| 		if err != nil { | ||||
| 			log.Fatal(err) | ||||
| 		} | ||||
| 		size += sz | ||||
| 	} | ||||
| 	return size | ||||
| } | ||||
| 
 | ||||
| func contains(sa []string, s string) bool { | ||||
| 	for _, a := range sa { | ||||
| 		if a == s { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| func makeTables() { | ||||
| 	w := &bytes.Buffer{} | ||||
| 
 | ||||
| 	size := 0 | ||||
| 	if *tablelist == "" { | ||||
| 		return | ||||
| 	} | ||||
| 	list := strings.Split(*tablelist, ",") | ||||
| 	if *tablelist == "all" { | ||||
| 		list = []string{"recomp", "info"} | ||||
| 	} | ||||
| 
 | ||||
| 	// Compute maximum decomposition size.
 | ||||
| 	max := 0 | ||||
| 	for _, c := range chars { | ||||
| 		if n := len(string(c.forms[FCompatibility].expandedDecomp)); n > max { | ||||
| 			max = n | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	fmt.Fprintln(w, "const (") | ||||
| 	fmt.Fprintln(w, "\t// Version is the Unicode edition from which the tables are derived.") | ||||
| 	fmt.Fprintf(w, "\tVersion = %q\n", gen.UnicodeVersion()) | ||||
| 	fmt.Fprintln(w) | ||||
| 	fmt.Fprintln(w, "\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform") | ||||
| 	fmt.Fprintln(w, "\t// may need to write atomically for any Form. Making a destination buffer at") | ||||
| 	fmt.Fprintln(w, "\t// least this size ensures that Transform can always make progress and that") | ||||
| 	fmt.Fprintln(w, "\t// the user does not need to grow the buffer on an ErrShortDst.") | ||||
| 	fmt.Fprintf(w, "\tMaxTransformChunkSize = %d+maxNonStarters*4\n", len(string(0x034F))+max) | ||||
| 	fmt.Fprintln(w, ")\n") | ||||
| 
 | ||||
| 	// Print the CCC remap table.
 | ||||
| 	size += len(cccMap) | ||||
| 	fmt.Fprintf(w, "var ccc = [%d]uint8{", len(cccMap)) | ||||
| 	for i := 0; i < len(cccMap); i++ { | ||||
| 		if i%8 == 0 { | ||||
| 			fmt.Fprintln(w) | ||||
| 		} | ||||
| 		fmt.Fprintf(w, "%3d, ", cccMap[uint8(i)]) | ||||
| 	} | ||||
| 	fmt.Fprintln(w, "\n}\n") | ||||
| 
 | ||||
| 	if contains(list, "info") { | ||||
| 		size += printCharInfoTables(w) | ||||
| 	} | ||||
| 
 | ||||
| 	if contains(list, "recomp") { | ||||
| 		// Note that we use 32 bit keys, instead of 64 bit.
 | ||||
| 		// This clips the bits of three entries, but we know
 | ||||
| 		// this won't cause a collision. The compiler will catch
 | ||||
| 		// any changes made to UnicodeData.txt that introduces
 | ||||
| 		// a collision.
 | ||||
| 		// Note that the recomposition map for NFC and NFKC
 | ||||
| 		// are identical.
 | ||||
| 
 | ||||
| 		// Recomposition map
 | ||||
| 		nrentries := 0 | ||||
| 		for _, c := range chars { | ||||
| 			f := c.forms[FCanonical] | ||||
| 			if !f.isOneWay && len(f.decomp) > 0 { | ||||
| 				nrentries++ | ||||
| 			} | ||||
| 		} | ||||
| 		sz := nrentries * 8 | ||||
| 		size += sz | ||||
| 		fmt.Fprintf(w, "// recompMap: %d bytes (entries only)\n", sz) | ||||
| 		fmt.Fprintln(w, "var recompMap = map[uint32]rune{") | ||||
| 		for i, c := range chars { | ||||
| 			f := c.forms[FCanonical] | ||||
| 			d := f.decomp | ||||
| 			if !f.isOneWay && len(d) > 0 { | ||||
| 				key := uint32(uint16(d[0]))<<16 + uint32(uint16(d[1])) | ||||
| 				fmt.Fprintf(w, "0x%.8X: 0x%.4X,\n", key, i) | ||||
| 			} | ||||
| 		} | ||||
| 		fmt.Fprintf(w, "}\n\n") | ||||
| 	} | ||||
| 
 | ||||
| 	fmt.Fprintf(w, "// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size) | ||||
| 	gen.WriteVersionedGoFile("tables.go", "norm", w.Bytes()) | ||||
| } | ||||
| 
 | ||||
| func printChars() { | ||||
| 	if *verbose { | ||||
| 		for _, c := range chars { | ||||
| 			if !c.isValid() || c.state == SMissing { | ||||
| 				continue | ||||
| 			} | ||||
| 			fmt.Println(c) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // verifyComputed does various consistency tests.
 | ||||
| func verifyComputed() { | ||||
| 	for i, c := range chars { | ||||
| 		for _, f := range c.forms { | ||||
| 			isNo := (f.quickCheck[MDecomposed] == QCNo) | ||||
| 			if (len(f.decomp) > 0) != isNo && !isHangul(rune(i)) { | ||||
| 				log.Fatalf("%U: NF*D QC must be No if rune decomposes", i) | ||||
| 			} | ||||
| 
 | ||||
| 			isMaybe := f.quickCheck[MComposed] == QCMaybe | ||||
| 			if f.combinesBackward != isMaybe { | ||||
| 				log.Fatalf("%U: NF*C QC must be Maybe if combinesBackward", i) | ||||
| 			} | ||||
| 			if len(f.decomp) > 0 && f.combinesForward && isMaybe { | ||||
| 				log.Fatalf("%U: NF*C QC must be Yes or No if combinesForward and decomposes", i) | ||||
| 			} | ||||
| 
 | ||||
| 			if len(f.expandedDecomp) != 0 { | ||||
| 				continue | ||||
| 			} | ||||
| 			if a, b := c.nLeadingNonStarters > 0, (c.ccc > 0 || f.combinesBackward); a != b { | ||||
| 				// We accept these runes to be treated differently (it only affects
 | ||||
| 				// segment breaking in iteration, most likely on improper use), but
 | ||||
| 				// reconsider if more characters are added.
 | ||||
| 				// U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;;;;
 | ||||
| 				// U+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;;;;
 | ||||
| 				// U+3133 HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
 | ||||
| 				// U+318E HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;;
 | ||||
| 				// U+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;;
 | ||||
| 				// U+FFDC HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;;
 | ||||
| 				if i != 0xFF9E && i != 0xFF9F && !(0x3133 <= i && i <= 0x318E) && !(0xFFA3 <= i && i <= 0xFFDC) { | ||||
| 					log.Fatalf("%U: nLead was %v; want %v", i, a, b) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		nfc := c.forms[FCanonical] | ||||
| 		nfkc := c.forms[FCompatibility] | ||||
| 		if nfc.combinesBackward != nfkc.combinesBackward { | ||||
| 			log.Fatalf("%U: Cannot combine combinesBackward\n", c.codePoint) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Use values in DerivedNormalizationProps.txt to compare against the
 | ||||
| // values we computed.
 | ||||
| // DerivedNormalizationProps.txt has form:
 | ||||
| // 00C0..00C5    ; NFD_QC; N # ...
 | ||||
| // 0374          ; NFD_QC; N # ...
 | ||||
| // See http://unicode.org/reports/tr44/ for full explanation
 | ||||
| func testDerived() { | ||||
| 	f := gen.OpenUCDFile("DerivedNormalizationProps.txt") | ||||
| 	defer f.Close() | ||||
| 	p := ucd.New(f) | ||||
| 	for p.Next() { | ||||
| 		r := p.Rune(0) | ||||
| 		c := &chars[r] | ||||
| 
 | ||||
| 		var ftype, mode int | ||||
| 		qt := p.String(1) | ||||
| 		switch qt { | ||||
| 		case "NFC_QC": | ||||
| 			ftype, mode = FCanonical, MComposed | ||||
| 		case "NFD_QC": | ||||
| 			ftype, mode = FCanonical, MDecomposed | ||||
| 		case "NFKC_QC": | ||||
| 			ftype, mode = FCompatibility, MComposed | ||||
| 		case "NFKD_QC": | ||||
| 			ftype, mode = FCompatibility, MDecomposed | ||||
| 		default: | ||||
| 			continue | ||||
| 		} | ||||
| 		var qr QCResult | ||||
| 		switch p.String(2) { | ||||
| 		case "Y": | ||||
| 			qr = QCYes | ||||
| 		case "N": | ||||
| 			qr = QCNo | ||||
| 		case "M": | ||||
| 			qr = QCMaybe | ||||
| 		default: | ||||
| 			log.Fatalf(`Unexpected quick check value "%s"`, p.String(2)) | ||||
| 		} | ||||
| 		if got := c.forms[ftype].quickCheck[mode]; got != qr { | ||||
| 			log.Printf("%U: FAILED %s (was %v need %v)\n", r, qt, got, qr) | ||||
| 		} | ||||
| 		c.forms[ftype].verified[mode] = true | ||||
| 	} | ||||
| 	if err := p.Err(); err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 	// Any unspecified value must be QCYes. Verify this.
 | ||||
| 	for i, c := range chars { | ||||
| 		for j, fd := range c.forms { | ||||
| 			for k, qr := range fd.quickCheck { | ||||
| 				if !fd.verified[k] && qr != QCYes { | ||||
| 					m := "%U: FAIL F:%d M:%d (was %v need Yes) %s\n" | ||||
| 					log.Printf(m, i, j, k, qr, c.name) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| var testHeader = `const ( | ||||
| 	Yes = iota | ||||
| 	No | ||||
| 	Maybe | ||||
| ) | ||||
| 
 | ||||
| type formData struct { | ||||
| 	qc              uint8 | ||||
| 	combinesForward bool | ||||
| 	decomposition   string | ||||
| } | ||||
| 
 | ||||
| type runeData struct { | ||||
| 	r      rune | ||||
| 	ccc    uint8 | ||||
| 	nLead  uint8 | ||||
| 	nTrail uint8 | ||||
| 	f      [2]formData // 0: canonical; 1: compatibility
 | ||||
| } | ||||
| 
 | ||||
| func f(qc uint8, cf bool, dec string) [2]formData { | ||||
| 	return [2]formData{{qc, cf, dec}, {qc, cf, dec}} | ||||
| } | ||||
| 
 | ||||
| func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData { | ||||
| 	return [2]formData{{qc, cf, d}, {qck, cfk, dk}} | ||||
| } | ||||
| 
 | ||||
| var testData = []runeData{ | ||||
| ` | ||||
| 
 | ||||
| func printTestdata() { | ||||
| 	type lastInfo struct { | ||||
| 		ccc    uint8 | ||||
| 		nLead  uint8 | ||||
| 		nTrail uint8 | ||||
| 		f      string | ||||
| 	} | ||||
| 
 | ||||
| 	last := lastInfo{} | ||||
| 	w := &bytes.Buffer{} | ||||
| 	fmt.Fprintf(w, testHeader) | ||||
| 	for r, c := range chars { | ||||
| 		f := c.forms[FCanonical] | ||||
| 		qc, cf, d := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) | ||||
| 		f = c.forms[FCompatibility] | ||||
| 		qck, cfk, dk := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) | ||||
| 		s := "" | ||||
| 		if d == dk && qc == qck && cf == cfk { | ||||
| 			s = fmt.Sprintf("f(%s, %v, %q)", qc, cf, d) | ||||
| 		} else { | ||||
| 			s = fmt.Sprintf("g(%s, %s, %v, %v, %q, %q)", qc, qck, cf, cfk, d, dk) | ||||
| 		} | ||||
| 		current := lastInfo{c.ccc, c.nLeadingNonStarters, c.nTrailingNonStarters, s} | ||||
| 		if last != current { | ||||
| 			fmt.Fprintf(w, "\t{0x%x, %d, %d, %d, %s},\n", r, c.origCCC, c.nLeadingNonStarters, c.nTrailingNonStarters, s) | ||||
| 			last = current | ||||
| 		} | ||||
| 	} | ||||
| 	fmt.Fprintln(w, "}") | ||||
| 	gen.WriteVersionedGoFile("data_test.go", "norm", w.Bytes()) | ||||
| } | ||||
|  | @ -1,117 +0,0 @@ | |||
| // Copyright 2011 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // +build ignore
 | ||||
| 
 | ||||
| // Trie table generator.
 | ||||
| // Used by make*tables tools to generate a go file with trie data structures
 | ||||
| // for mapping UTF-8 to a 16-bit value. All but the last byte in a UTF-8 byte
 | ||||
| // sequence are used to lookup offsets in the index table to be used for the
 | ||||
| // next byte. The last byte is used to index into a table with 16-bit values.
 | ||||
| 
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| ) | ||||
| 
 | ||||
| const maxSparseEntries = 16 | ||||
| 
 | ||||
| type normCompacter struct { | ||||
| 	sparseBlocks [][]uint64 | ||||
| 	sparseOffset []uint16 | ||||
| 	sparseCount  int | ||||
| 	name         string | ||||
| } | ||||
| 
 | ||||
| func mostFrequentStride(a []uint64) int { | ||||
| 	counts := make(map[int]int) | ||||
| 	var v int | ||||
| 	for _, x := range a { | ||||
| 		if stride := int(x) - v; v != 0 && stride >= 0 { | ||||
| 			counts[stride]++ | ||||
| 		} | ||||
| 		v = int(x) | ||||
| 	} | ||||
| 	var maxs, maxc int | ||||
| 	for stride, cnt := range counts { | ||||
| 		if cnt > maxc || (cnt == maxc && stride < maxs) { | ||||
| 			maxs, maxc = stride, cnt | ||||
| 		} | ||||
| 	} | ||||
| 	return maxs | ||||
| } | ||||
| 
 | ||||
| func countSparseEntries(a []uint64) int { | ||||
| 	stride := mostFrequentStride(a) | ||||
| 	var v, count int | ||||
| 	for _, tv := range a { | ||||
| 		if int(tv)-v != stride { | ||||
| 			if tv != 0 { | ||||
| 				count++ | ||||
| 			} | ||||
| 		} | ||||
| 		v = int(tv) | ||||
| 	} | ||||
| 	return count | ||||
| } | ||||
| 
 | ||||
| func (c *normCompacter) Size(v []uint64) (sz int, ok bool) { | ||||
| 	if n := countSparseEntries(v); n <= maxSparseEntries { | ||||
| 		return (n+1)*4 + 2, true | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
| 
 | ||||
| func (c *normCompacter) Store(v []uint64) uint32 { | ||||
| 	h := uint32(len(c.sparseOffset)) | ||||
| 	c.sparseBlocks = append(c.sparseBlocks, v) | ||||
| 	c.sparseOffset = append(c.sparseOffset, uint16(c.sparseCount)) | ||||
| 	c.sparseCount += countSparseEntries(v) + 1 | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| func (c *normCompacter) Handler() string { | ||||
| 	return c.name + "Sparse.lookup" | ||||
| } | ||||
| 
 | ||||
| func (c *normCompacter) Print(w io.Writer) (retErr error) { | ||||
| 	p := func(f string, x ...interface{}) { | ||||
| 		if _, err := fmt.Fprintf(w, f, x...); retErr == nil && err != nil { | ||||
| 			retErr = err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	ls := len(c.sparseBlocks) | ||||
| 	p("// %sSparseOffset: %d entries, %d bytes\n", c.name, ls, ls*2) | ||||
| 	p("var %sSparseOffset = %#v\n\n", c.name, c.sparseOffset) | ||||
| 
 | ||||
| 	ns := c.sparseCount | ||||
| 	p("// %sSparseValues: %d entries, %d bytes\n", c.name, ns, ns*4) | ||||
| 	p("var %sSparseValues = [%d]valueRange {", c.name, ns) | ||||
| 	for i, b := range c.sparseBlocks { | ||||
| 		p("\n// Block %#x, offset %#x", i, c.sparseOffset[i]) | ||||
| 		var v int | ||||
| 		stride := mostFrequentStride(b) | ||||
| 		n := countSparseEntries(b) | ||||
| 		p("\n{value:%#04x,lo:%#02x},", stride, uint8(n)) | ||||
| 		for i, nv := range b { | ||||
| 			if int(nv)-v != stride { | ||||
| 				if v != 0 { | ||||
| 					p(",hi:%#02x},", 0x80+i-1) | ||||
| 				} | ||||
| 				if nv != 0 { | ||||
| 					p("\n{value:%#04x,lo:%#02x", nv, 0x80+i) | ||||
| 				} | ||||
| 			} | ||||
| 			v = int(nv) | ||||
| 		} | ||||
| 		if v != 0 { | ||||
| 			p(",hi:%#02x},", 0x80+len(b)-1) | ||||
| 		} | ||||
| 	} | ||||
| 	p("\n}\n\n") | ||||
| 	return | ||||
| } | ||||
|  | @ -1,11 +1,11 @@ | |||
| # cloud.google.com/go v0.25.0 | ||||
| cloud.google.com/go/storage | ||||
| cloud.google.com/go/compute/metadata | ||||
| cloud.google.com/go/iam | ||||
| cloud.google.com/go/internal | ||||
| cloud.google.com/go/internal/optional | ||||
| cloud.google.com/go/internal/trace | ||||
| cloud.google.com/go/internal/version | ||||
| cloud.google.com/go/compute/metadata | ||||
| cloud.google.com/go/storage | ||||
| # github.com/Azure/azure-pipeline-go v0.2.2 | ||||
| github.com/Azure/azure-pipeline-go/pipeline | ||||
| # github.com/Azure/azure-sdk-for-go v19.1.0+incompatible | ||||
|  | @ -14,8 +14,8 @@ github.com/Azure/azure-sdk-for-go/version | |||
| # github.com/Azure/azure-storage-blob-go v0.8.0 | ||||
| github.com/Azure/azure-storage-blob-go/azblob | ||||
| # github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 | ||||
| github.com/Azure/go-ansiterm/winterm | ||||
| github.com/Azure/go-ansiterm | ||||
| github.com/Azure/go-ansiterm/winterm | ||||
| # github.com/Azure/go-autorest v10.15.0+incompatible | ||||
| github.com/Azure/go-autorest/autorest | ||||
| github.com/Azure/go-autorest/autorest/adal | ||||
|  | @ -31,46 +31,46 @@ github.com/Microsoft/go-winio | |||
| github.com/Nvveen/Gotty | ||||
| # github.com/aws/aws-sdk-go v1.25.19 | ||||
| github.com/aws/aws-sdk-go/aws | ||||
| github.com/aws/aws-sdk-go/aws/session | ||||
| github.com/aws/aws-sdk-go/service/s3 | ||||
| github.com/aws/aws-sdk-go/service/s3/s3manager | ||||
| github.com/aws/aws-sdk-go/aws/awserr | ||||
| github.com/aws/aws-sdk-go/aws/credentials | ||||
| github.com/aws/aws-sdk-go/aws/endpoints | ||||
| github.com/aws/aws-sdk-go/internal/sdkio | ||||
| github.com/aws/aws-sdk-go/aws/awsutil | ||||
| github.com/aws/aws-sdk-go/aws/client | ||||
| github.com/aws/aws-sdk-go/aws/client/metadata | ||||
| github.com/aws/aws-sdk-go/aws/corehandlers | ||||
| github.com/aws/aws-sdk-go/aws/credentials | ||||
| github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds | ||||
| github.com/aws/aws-sdk-go/aws/credentials/endpointcreds | ||||
| github.com/aws/aws-sdk-go/aws/credentials/processcreds | ||||
| github.com/aws/aws-sdk-go/aws/credentials/stscreds | ||||
| github.com/aws/aws-sdk-go/aws/csm | ||||
| github.com/aws/aws-sdk-go/aws/defaults | ||||
| github.com/aws/aws-sdk-go/aws/ec2metadata | ||||
| github.com/aws/aws-sdk-go/aws/endpoints | ||||
| github.com/aws/aws-sdk-go/aws/request | ||||
| github.com/aws/aws-sdk-go/internal/ini | ||||
| github.com/aws/aws-sdk-go/internal/shareddefaults | ||||
| github.com/aws/aws-sdk-go/aws/awsutil | ||||
| github.com/aws/aws-sdk-go/aws/client/metadata | ||||
| github.com/aws/aws-sdk-go/aws/session | ||||
| github.com/aws/aws-sdk-go/aws/signer/v4 | ||||
| github.com/aws/aws-sdk-go/internal/ini | ||||
| github.com/aws/aws-sdk-go/internal/s3err | ||||
| github.com/aws/aws-sdk-go/internal/sdkio | ||||
| github.com/aws/aws-sdk-go/internal/sdkmath | ||||
| github.com/aws/aws-sdk-go/internal/sdkrand | ||||
| github.com/aws/aws-sdk-go/internal/sdkuri | ||||
| github.com/aws/aws-sdk-go/internal/shareddefaults | ||||
| github.com/aws/aws-sdk-go/private/protocol | ||||
| github.com/aws/aws-sdk-go/private/protocol/eventstream | ||||
| github.com/aws/aws-sdk-go/private/protocol/eventstream/eventstreamapi | ||||
| github.com/aws/aws-sdk-go/private/protocol/json/jsonutil | ||||
| github.com/aws/aws-sdk-go/private/protocol/jsonrpc | ||||
| github.com/aws/aws-sdk-go/private/protocol/query | ||||
| github.com/aws/aws-sdk-go/private/protocol/query/queryutil | ||||
| github.com/aws/aws-sdk-go/private/protocol/rest | ||||
| github.com/aws/aws-sdk-go/private/protocol/restxml | ||||
| github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil | ||||
| github.com/aws/aws-sdk-go/service/ecr | ||||
| github.com/aws/aws-sdk-go/service/s3 | ||||
| github.com/aws/aws-sdk-go/service/s3/s3iface | ||||
| github.com/aws/aws-sdk-go/internal/sdkrand | ||||
| github.com/aws/aws-sdk-go/service/s3/s3manager | ||||
| github.com/aws/aws-sdk-go/service/sts | ||||
| github.com/aws/aws-sdk-go/service/sts/stsiface | ||||
| github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds | ||||
| github.com/aws/aws-sdk-go/aws/credentials/endpointcreds | ||||
| github.com/aws/aws-sdk-go/aws/ec2metadata | ||||
| github.com/aws/aws-sdk-go/internal/sdkmath | ||||
| github.com/aws/aws-sdk-go/private/protocol/query | ||||
| github.com/aws/aws-sdk-go/service/ecr | ||||
| github.com/aws/aws-sdk-go/internal/sdkuri | ||||
| github.com/aws/aws-sdk-go/private/protocol/json/jsonutil | ||||
| github.com/aws/aws-sdk-go/private/protocol/query/queryutil | ||||
| github.com/aws/aws-sdk-go/private/protocol/jsonrpc | ||||
| # github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 | ||||
| github.com/beorn7/perks/quantile | ||||
| # github.com/boltdb/bolt v1.3.1 | ||||
|  | @ -80,12 +80,12 @@ github.com/containerd/containerd/cio | |||
| github.com/containerd/containerd/defaults | ||||
| github.com/containerd/containerd/log | ||||
| # github.com/containerd/continuity v0.0.0-20180712174259-0377f7d76720 | ||||
| github.com/containerd/continuity/devices | ||||
| github.com/containerd/continuity/driver | ||||
| github.com/containerd/continuity/fs | ||||
| github.com/containerd/continuity/pathdriver | ||||
| github.com/containerd/continuity/sysx | ||||
| github.com/containerd/continuity/devices | ||||
| github.com/containerd/continuity/syscallx | ||||
| github.com/containerd/continuity/sysx | ||||
| # github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260 | ||||
| github.com/containerd/fifo | ||||
| # github.com/coreos/etcd v3.3.9+incompatible | ||||
|  | @ -93,92 +93,92 @@ github.com/coreos/etcd/raft/raftpb | |||
| # github.com/dgrijalva/jwt-go v3.2.0+incompatible | ||||
| github.com/dgrijalva/jwt-go | ||||
| # github.com/docker/distribution v2.6.0-rc.1.0.20180720172123-0dae0957e5fe+incompatible | ||||
| github.com/docker/distribution | ||||
| github.com/docker/distribution/digestset | ||||
| github.com/docker/distribution/reference | ||||
| github.com/docker/distribution | ||||
| # github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197 | ||||
| github.com/docker/docker/pkg/signal | ||||
| github.com/docker/docker/builder/dockerfile | ||||
| github.com/docker/docker/builder/dockerignore | ||||
| github.com/docker/docker/pkg/archive | ||||
| github.com/docker/docker/pkg/fileutils | ||||
| github.com/docker/docker/api/types/container | ||||
| github.com/docker/docker/api/types/strslice | ||||
| github.com/docker/docker/api | ||||
| github.com/docker/docker/api/types | ||||
| github.com/docker/docker/api/types/backend | ||||
| github.com/docker/docker/api/types/blkiodev | ||||
| github.com/docker/docker/api/types/container | ||||
| github.com/docker/docker/api/types/events | ||||
| github.com/docker/docker/api/types/filters | ||||
| github.com/docker/docker/api/types/image | ||||
| github.com/docker/docker/api/types/mount | ||||
| github.com/docker/docker/api/types/network | ||||
| github.com/docker/docker/api/types/plugins/logdriver | ||||
| github.com/docker/docker/api/types/registry | ||||
| github.com/docker/docker/api/types/strslice | ||||
| github.com/docker/docker/api/types/swarm | ||||
| github.com/docker/docker/api/types/swarm/runtime | ||||
| github.com/docker/docker/api/types/time | ||||
| github.com/docker/docker/api/types/versions | ||||
| github.com/docker/docker/api/types/volume | ||||
| github.com/docker/docker/builder | ||||
| github.com/docker/docker/builder/dockerfile | ||||
| github.com/docker/docker/builder/dockerfile/command | ||||
| github.com/docker/docker/builder/dockerfile/instructions | ||||
| github.com/docker/docker/builder/dockerfile/parser | ||||
| github.com/docker/docker/builder/dockerfile/shell | ||||
| github.com/docker/docker/builder/dockerignore | ||||
| github.com/docker/docker/builder/fscache | ||||
| github.com/docker/docker/builder/remotecontext | ||||
| github.com/docker/docker/builder/remotecontext/git | ||||
| github.com/docker/docker/client | ||||
| github.com/docker/docker/container | ||||
| github.com/docker/docker/container/stream | ||||
| github.com/docker/docker/daemon/cluster/provider | ||||
| github.com/docker/docker/daemon/exec | ||||
| github.com/docker/docker/daemon/graphdriver | ||||
| github.com/docker/docker/daemon/logger | ||||
| github.com/docker/docker/daemon/logger/jsonfilelog | ||||
| github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog | ||||
| github.com/docker/docker/daemon/logger/loggerutils | ||||
| github.com/docker/docker/daemon/logger/loggerutils/multireader | ||||
| github.com/docker/docker/daemon/logger/templates | ||||
| github.com/docker/docker/daemon/network | ||||
| github.com/docker/docker/dockerversion | ||||
| github.com/docker/docker/errdefs | ||||
| github.com/docker/docker/image | ||||
| github.com/docker/docker/layer | ||||
| github.com/docker/docker/oci | ||||
| github.com/docker/docker/pkg/archive | ||||
| github.com/docker/docker/pkg/broadcaster | ||||
| github.com/docker/docker/pkg/chrootarchive | ||||
| github.com/docker/docker/pkg/containerfs | ||||
| github.com/docker/docker/pkg/directory | ||||
| github.com/docker/docker/pkg/filenotify | ||||
| github.com/docker/docker/pkg/fileutils | ||||
| github.com/docker/docker/pkg/idtools | ||||
| github.com/docker/docker/pkg/ioutils | ||||
| github.com/docker/docker/pkg/jsonmessage | ||||
| github.com/docker/docker/pkg/longpath | ||||
| github.com/docker/docker/pkg/mount | ||||
| github.com/docker/docker/pkg/parsers/kernel | ||||
| github.com/docker/docker/pkg/plugingetter | ||||
| github.com/docker/docker/pkg/plugins | ||||
| github.com/docker/docker/pkg/plugins/transport | ||||
| github.com/docker/docker/pkg/pools | ||||
| github.com/docker/docker/pkg/progress | ||||
| github.com/docker/docker/pkg/pubsub | ||||
| github.com/docker/docker/pkg/reexec | ||||
| github.com/docker/docker/pkg/signal | ||||
| github.com/docker/docker/pkg/streamformatter | ||||
| github.com/docker/docker/pkg/stringid | ||||
| github.com/docker/docker/pkg/symlink | ||||
| github.com/docker/docker/pkg/system | ||||
| github.com/docker/docker/pkg/urlutil | ||||
| github.com/docker/docker/runconfig/opts | ||||
| github.com/docker/docker/pkg/longpath | ||||
| github.com/docker/docker/pkg/pools | ||||
| github.com/docker/docker/client | ||||
| github.com/docker/docker/api/types/blkiodev | ||||
| github.com/docker/docker/api/types/mount | ||||
| github.com/docker/docker/api/types/filters | ||||
| github.com/docker/docker/api/types/network | ||||
| github.com/docker/docker/api/types/registry | ||||
| github.com/docker/docker/api/types/swarm | ||||
| github.com/docker/docker/layer | ||||
| github.com/docker/docker/builder/dockerfile/command | ||||
| github.com/docker/docker/pkg/directory | ||||
| github.com/docker/docker/pkg/tailfile | ||||
| github.com/docker/docker/pkg/tarsum | ||||
| github.com/docker/docker/builder/remotecontext/git | ||||
| github.com/docker/docker/container/stream | ||||
| github.com/docker/docker/daemon/exec | ||||
| github.com/docker/docker/daemon/logger | ||||
| github.com/docker/docker/daemon/logger/jsonfilelog | ||||
| github.com/docker/docker/daemon/network | ||||
| github.com/docker/docker/pkg/mount | ||||
| github.com/docker/docker/pkg/term | ||||
| github.com/docker/docker/pkg/term/windows | ||||
| github.com/docker/docker/pkg/urlutil | ||||
| github.com/docker/docker/pkg/useragent | ||||
| github.com/docker/docker/plugin/v2 | ||||
| github.com/docker/docker/restartmanager | ||||
| github.com/docker/docker/runconfig/opts | ||||
| github.com/docker/docker/volume | ||||
| github.com/docker/docker/volume/mounts | ||||
| github.com/docker/docker/dockerversion | ||||
| github.com/docker/docker/pkg/reexec | ||||
| github.com/docker/docker/pkg/term | ||||
| github.com/docker/docker/api/types/events | ||||
| github.com/docker/docker/api/types/image | ||||
| github.com/docker/docker/api/types/time | ||||
| github.com/docker/docker/api/types/versions | ||||
| github.com/docker/docker/api/types/volume | ||||
| github.com/docker/docker/api/types/swarm/runtime | ||||
| github.com/docker/docker/daemon/graphdriver | ||||
| github.com/docker/docker/pkg/plugingetter | ||||
| github.com/docker/docker/pkg/broadcaster | ||||
| github.com/docker/docker/api/types/plugins/logdriver | ||||
| github.com/docker/docker/pkg/plugins | ||||
| github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog | ||||
| github.com/docker/docker/daemon/logger/loggerutils | ||||
| github.com/docker/docker/daemon/cluster/provider | ||||
| github.com/docker/docker/pkg/parsers/kernel | ||||
| github.com/docker/docker/pkg/useragent | ||||
| github.com/docker/docker/pkg/term/windows | ||||
| github.com/docker/docker/plugin/v2 | ||||
| github.com/docker/docker/pkg/plugins/transport | ||||
| github.com/docker/docker/daemon/logger/loggerutils/multireader | ||||
| github.com/docker/docker/daemon/logger/templates | ||||
| github.com/docker/docker/pkg/filenotify | ||||
| github.com/docker/docker/pkg/pubsub | ||||
| github.com/docker/docker/pkg/tailfile | ||||
| github.com/docker/docker/oci | ||||
| # github.com/docker/go-connections v0.4.0 | ||||
| github.com/docker/go-connections/nat | ||||
| github.com/docker/go-connections/sockets | ||||
|  | @ -192,19 +192,19 @@ github.com/docker/go-units | |||
| # github.com/docker/swarmkit v1.12.1-0.20180726190244-7567d47988d8 | ||||
| github.com/docker/swarmkit/agent/exec | ||||
| github.com/docker/swarmkit/api | ||||
| github.com/docker/swarmkit/api/deepcopy | ||||
| github.com/docker/swarmkit/api/equality | ||||
| github.com/docker/swarmkit/log | ||||
| github.com/docker/swarmkit/protobuf/ptypes | ||||
| github.com/docker/swarmkit/api/deepcopy | ||||
| github.com/docker/swarmkit/manager/raftselector | ||||
| github.com/docker/swarmkit/protobuf/plugin | ||||
| github.com/docker/swarmkit/protobuf/ptypes | ||||
| # github.com/emirpasic/gods v1.9.0 | ||||
| github.com/emirpasic/gods/trees/binaryheap | ||||
| github.com/emirpasic/gods/containers | ||||
| github.com/emirpasic/gods/lists | ||||
| github.com/emirpasic/gods/lists/arraylist | ||||
| github.com/emirpasic/gods/trees | ||||
| github.com/emirpasic/gods/trees/binaryheap | ||||
| github.com/emirpasic/gods/utils | ||||
| github.com/emirpasic/gods/lists | ||||
| # github.com/fsnotify/fsnotify v1.4.7 | ||||
| github.com/fsnotify/fsnotify | ||||
| # github.com/genuinetools/amicontained v0.4.3 | ||||
|  | @ -212,17 +212,17 @@ github.com/genuinetools/amicontained/container | |||
| # github.com/ghodss/yaml v1.0.0 | ||||
| github.com/ghodss/yaml | ||||
| # github.com/gogo/protobuf v1.1.1 | ||||
| github.com/gogo/protobuf/proto | ||||
| github.com/gogo/protobuf/sortkeys | ||||
| github.com/gogo/protobuf/gogoproto | ||||
| github.com/gogo/protobuf/types | ||||
| github.com/gogo/protobuf/proto | ||||
| github.com/gogo/protobuf/protoc-gen-gogo/descriptor | ||||
| github.com/gogo/protobuf/sortkeys | ||||
| github.com/gogo/protobuf/types | ||||
| # github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b | ||||
| github.com/golang/glog | ||||
| # github.com/golang/protobuf v1.1.0 | ||||
| github.com/golang/protobuf/proto | ||||
| github.com/golang/protobuf/ptypes | ||||
| github.com/golang/protobuf/protoc-gen-go/descriptor | ||||
| github.com/golang/protobuf/ptypes | ||||
| github.com/golang/protobuf/ptypes/any | ||||
| github.com/golang/protobuf/ptypes/duration | ||||
| github.com/golang/protobuf/ptypes/timestamp | ||||
|  | @ -234,24 +234,24 @@ github.com/google/go-cmp/cmp/internal/diff | |||
| github.com/google/go-cmp/cmp/internal/function | ||||
| github.com/google/go-cmp/cmp/internal/value | ||||
| # github.com/google/go-containerregistry v0.0.0-20190820205713-31e00cede111 | ||||
| github.com/google/go-containerregistry/pkg/name | ||||
| github.com/google/go-containerregistry/pkg/v1 | ||||
| github.com/google/go-containerregistry/pkg/v1/remote | ||||
| github.com/google/go-containerregistry/pkg/v1/tarball | ||||
| github.com/google/go-containerregistry/pkg/v1/types | ||||
| github.com/google/go-containerregistry/pkg/authn | ||||
| github.com/google/go-containerregistry/pkg/authn/k8schain | ||||
| github.com/google/go-containerregistry/pkg/internal/retry | ||||
| github.com/google/go-containerregistry/pkg/logs | ||||
| github.com/google/go-containerregistry/pkg/name | ||||
| github.com/google/go-containerregistry/pkg/v1 | ||||
| github.com/google/go-containerregistry/pkg/v1/daemon | ||||
| github.com/google/go-containerregistry/pkg/v1/empty | ||||
| github.com/google/go-containerregistry/pkg/v1/layout | ||||
| github.com/google/go-containerregistry/pkg/v1/mutate | ||||
| github.com/google/go-containerregistry/pkg/v1/partial | ||||
| github.com/google/go-containerregistry/pkg/v1/daemon | ||||
| github.com/google/go-containerregistry/pkg/internal/retry | ||||
| github.com/google/go-containerregistry/pkg/logs | ||||
| github.com/google/go-containerregistry/pkg/v1/remote/transport | ||||
| github.com/google/go-containerregistry/pkg/v1/v1util | ||||
| github.com/google/go-containerregistry/pkg/v1/random | ||||
| github.com/google/go-containerregistry/pkg/v1/remote | ||||
| github.com/google/go-containerregistry/pkg/v1/remote/transport | ||||
| github.com/google/go-containerregistry/pkg/v1/stream | ||||
| github.com/google/go-containerregistry/pkg/v1/tarball | ||||
| github.com/google/go-containerregistry/pkg/v1/types | ||||
| github.com/google/go-containerregistry/pkg/v1/v1util | ||||
| github.com/google/go-containerregistry/pkg/v1/validate | ||||
| # github.com/google/go-github v17.0.0+incompatible | ||||
| github.com/google/go-github/github | ||||
|  | @ -301,13 +301,13 @@ github.com/minio/highwayhash | |||
| # github.com/mitchellh/go-homedir v1.0.0 | ||||
| github.com/mitchellh/go-homedir | ||||
| # github.com/moby/buildkit v0.0.0-20180731175856-e57eed420c75 | ||||
| github.com/moby/buildkit/frontend/dockerfile/command | ||||
| github.com/moby/buildkit/frontend/dockerfile/instructions | ||||
| github.com/moby/buildkit/frontend/dockerfile/parser | ||||
| github.com/moby/buildkit/frontend/dockerfile/shell | ||||
| github.com/moby/buildkit/frontend/dockerfile/command | ||||
| github.com/moby/buildkit/identity | ||||
| github.com/moby/buildkit/session | ||||
| github.com/moby/buildkit/session/filesync | ||||
| github.com/moby/buildkit/identity | ||||
| # github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd | ||||
| github.com/modern-go/concurrent | ||||
| # github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 | ||||
|  | @ -315,18 +315,18 @@ github.com/modern-go/reflect2 | |||
| # github.com/opencontainers/go-digest v1.0.0-rc1 | ||||
| github.com/opencontainers/go-digest | ||||
| # github.com/opencontainers/image-spec v1.0.1 | ||||
| github.com/opencontainers/image-spec/specs-go/v1 | ||||
| github.com/opencontainers/image-spec/specs-go | ||||
| github.com/opencontainers/image-spec/specs-go/v1 | ||||
| # github.com/opencontainers/runc v1.0.0-rc5 | ||||
| github.com/opencontainers/runc/libcontainer/user | ||||
| github.com/opencontainers/runc/libcontainer/system | ||||
| github.com/opencontainers/runc/libcontainer/configs | ||||
| github.com/opencontainers/runc/libcontainer/devices | ||||
| github.com/opencontainers/runc/libcontainer/system | ||||
| github.com/opencontainers/runc/libcontainer/user | ||||
| # github.com/opencontainers/runtime-spec v1.0.1 | ||||
| github.com/opencontainers/runtime-spec/specs-go | ||||
| # github.com/opencontainers/selinux v1.0.0-rc1 | ||||
| github.com/opencontainers/selinux/go-selinux/label | ||||
| github.com/opencontainers/selinux/go-selinux | ||||
| github.com/opencontainers/selinux/go-selinux/label | ||||
| # github.com/opentracing/opentracing-go v1.0.2 | ||||
| github.com/opentracing/opentracing-go | ||||
| github.com/opentracing/opentracing-go/ext | ||||
|  | @ -346,13 +346,13 @@ github.com/prometheus/client_golang/prometheus/promhttp | |||
| github.com/prometheus/client_model/go | ||||
| # github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1 | ||||
| github.com/prometheus/common/expfmt | ||||
| github.com/prometheus/common/model | ||||
| github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg | ||||
| github.com/prometheus/common/model | ||||
| # github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273 | ||||
| github.com/prometheus/procfs | ||||
| github.com/prometheus/procfs/internal/util | ||||
| github.com/prometheus/procfs/nfs | ||||
| github.com/prometheus/procfs/xfs | ||||
| github.com/prometheus/procfs/internal/util | ||||
| # github.com/sergi/go-diff v1.0.0 | ||||
| github.com/sergi/go-diff/diffmatchpatch | ||||
| # github.com/sirupsen/logrus v1.4.2 | ||||
|  | @ -374,148 +374,154 @@ github.com/syndtr/gocapability/capability | |||
| # github.com/tonistiigi/fsutil v0.0.0-20180725061210-b19464cd1b6a | ||||
| github.com/tonistiigi/fsutil | ||||
| # github.com/vbatts/tar-split v0.10.2 | ||||
| github.com/vbatts/tar-split/archive/tar | ||||
| github.com/vbatts/tar-split/tar/asm | ||||
| github.com/vbatts/tar-split/tar/storage | ||||
| github.com/vbatts/tar-split/archive/tar | ||||
| # github.com/xanzy/ssh-agent v0.2.0 | ||||
| github.com/xanzy/ssh-agent | ||||
| # go.opencensus.io v0.14.0 | ||||
| go.opencensus.io/trace | ||||
| go.opencensus.io | ||||
| go.opencensus.io/exporter/stackdriver/propagation | ||||
| go.opencensus.io/plugin/ochttp | ||||
| go.opencensus.io/internal | ||||
| go.opencensus.io/trace/internal | ||||
| go.opencensus.io/trace/propagation | ||||
| go.opencensus.io/internal/tagencoding | ||||
| go.opencensus.io/plugin/ochttp | ||||
| go.opencensus.io/plugin/ochttp/propagation/b3 | ||||
| go.opencensus.io/stats | ||||
| go.opencensus.io/stats/internal | ||||
| go.opencensus.io/stats/view | ||||
| go.opencensus.io/tag | ||||
| go.opencensus.io | ||||
| go.opencensus.io/stats/internal | ||||
| go.opencensus.io/internal/tagencoding | ||||
| go.opencensus.io/trace | ||||
| go.opencensus.io/trace/internal | ||||
| go.opencensus.io/trace/propagation | ||||
| # golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 | ||||
| golang.org/x/crypto/cast5 | ||||
| golang.org/x/crypto/curve25519 | ||||
| golang.org/x/crypto/ed25519 | ||||
| golang.org/x/crypto/ed25519/internal/edwards25519 | ||||
| golang.org/x/crypto/internal/chacha20 | ||||
| golang.org/x/crypto/internal/subtle | ||||
| golang.org/x/crypto/openpgp | ||||
| golang.org/x/crypto/openpgp/armor | ||||
| golang.org/x/crypto/openpgp/elgamal | ||||
| golang.org/x/crypto/openpgp/errors | ||||
| golang.org/x/crypto/openpgp/packet | ||||
| golang.org/x/crypto/openpgp/s2k | ||||
| golang.org/x/crypto/cast5 | ||||
| golang.org/x/crypto/openpgp/elgamal | ||||
| golang.org/x/crypto/pkcs12 | ||||
| golang.org/x/crypto/pkcs12/internal/rc2 | ||||
| golang.org/x/crypto/poly1305 | ||||
| golang.org/x/crypto/ssh | ||||
| golang.org/x/crypto/ssh/agent | ||||
| golang.org/x/crypto/ssh/knownhosts | ||||
| golang.org/x/crypto/ssh/terminal | ||||
| golang.org/x/crypto/pkcs12 | ||||
| golang.org/x/crypto/ssh/agent | ||||
| golang.org/x/crypto/curve25519 | ||||
| golang.org/x/crypto/ed25519 | ||||
| golang.org/x/crypto/internal/chacha20 | ||||
| golang.org/x/crypto/poly1305 | ||||
| golang.org/x/crypto/pkcs12/internal/rc2 | ||||
| golang.org/x/crypto/ed25519/internal/edwards25519 | ||||
| golang.org/x/crypto/internal/subtle | ||||
| # golang.org/x/net v0.0.0-20190311183353-d8887717615a | ||||
| golang.org/x/net/context | ||||
| golang.org/x/net/context/ctxhttp | ||||
| golang.org/x/net/http2 | ||||
| golang.org/x/net/trace | ||||
| golang.org/x/net/http/httpproxy | ||||
| golang.org/x/net/http/httpguts | ||||
| golang.org/x/net/http/httpproxy | ||||
| golang.org/x/net/http2 | ||||
| golang.org/x/net/http2/hpack | ||||
| golang.org/x/net/idna | ||||
| golang.org/x/net/proxy | ||||
| golang.org/x/net/internal/timeseries | ||||
| golang.org/x/net/internal/socks | ||||
| golang.org/x/net/internal/timeseries | ||||
| golang.org/x/net/proxy | ||||
| golang.org/x/net/trace | ||||
| # golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc | ||||
| golang.org/x/oauth2 | ||||
| golang.org/x/oauth2/internal | ||||
| golang.org/x/oauth2/google | ||||
| golang.org/x/oauth2/jwt | ||||
| golang.org/x/oauth2/internal | ||||
| golang.org/x/oauth2/jws | ||||
| golang.org/x/oauth2/jwt | ||||
| # golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f | ||||
| golang.org/x/sync/errgroup | ||||
| golang.org/x/sync/syncmap | ||||
| golang.org/x/sync/singleflight | ||||
| golang.org/x/sync/syncmap | ||||
| # golang.org/x/sys v0.0.0-20190422165155-953cdadca894 | ||||
| golang.org/x/sys/unix | ||||
| golang.org/x/sys/cpu | ||||
| golang.org/x/sys/unix | ||||
| golang.org/x/sys/windows | ||||
| golang.org/x/sys/windows/registry | ||||
| # golang.org/x/text v0.3.0 | ||||
| golang.org/x/text/transform | ||||
| golang.org/x/text/unicode/norm | ||||
| golang.org/x/text/secure/bidirule | ||||
| golang.org/x/text/transform | ||||
| golang.org/x/text/unicode/bidi | ||||
| golang.org/x/text/unicode/norm | ||||
| # golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 | ||||
| golang.org/x/time/rate | ||||
| # google.golang.org/api v0.0.0-20180730000901-31ca0e01cd79 | ||||
| google.golang.org/api/gensupport | ||||
| google.golang.org/api/googleapi | ||||
| google.golang.org/api/googleapi/internal/uritemplates | ||||
| google.golang.org/api/googleapi/transport | ||||
| google.golang.org/api/internal | ||||
| google.golang.org/api/iterator | ||||
| google.golang.org/api/option | ||||
| google.golang.org/api/storage/v1 | ||||
| google.golang.org/api/transport/http | ||||
| google.golang.org/api/googleapi/internal/uritemplates | ||||
| google.golang.org/api/internal | ||||
| google.golang.org/api/gensupport | ||||
| google.golang.org/api/googleapi/transport | ||||
| # google.golang.org/appengine v1.1.0 | ||||
| google.golang.org/appengine/urlfetch | ||||
| google.golang.org/appengine/internal | ||||
| google.golang.org/appengine/internal/urlfetch | ||||
| google.golang.org/appengine | ||||
| google.golang.org/appengine/internal | ||||
| google.golang.org/appengine/internal/app_identity | ||||
| google.golang.org/appengine/internal/base | ||||
| google.golang.org/appengine/internal/datastore | ||||
| google.golang.org/appengine/internal/log | ||||
| google.golang.org/appengine/internal/remote_api | ||||
| google.golang.org/appengine/internal/app_identity | ||||
| google.golang.org/appengine/internal/modules | ||||
| google.golang.org/appengine/internal/remote_api | ||||
| google.golang.org/appengine/internal/urlfetch | ||||
| google.golang.org/appengine/urlfetch | ||||
| # google.golang.org/genproto v0.0.0-20180731170733-daca94659cb5 | ||||
| google.golang.org/genproto/googleapis/api/annotations | ||||
| google.golang.org/genproto/googleapis/iam/v1 | ||||
| google.golang.org/genproto/googleapis/rpc/code | ||||
| google.golang.org/genproto/googleapis/api/annotations | ||||
| google.golang.org/genproto/googleapis/rpc/status | ||||
| # google.golang.org/grpc v1.2.1-0.20180320012744-8124abf74e76 | ||||
| google.golang.org/grpc | ||||
| google.golang.org/grpc/codes | ||||
| google.golang.org/grpc/status | ||||
| google.golang.org/grpc/health | ||||
| google.golang.org/grpc/health/grpc_health_v1 | ||||
| google.golang.org/grpc/metadata | ||||
| google.golang.org/grpc/balancer | ||||
| google.golang.org/grpc/balancer/base | ||||
| google.golang.org/grpc/balancer/roundrobin | ||||
| google.golang.org/grpc/codes | ||||
| google.golang.org/grpc/connectivity | ||||
| google.golang.org/grpc/credentials | ||||
| google.golang.org/grpc/encoding | ||||
| google.golang.org/grpc/encoding/proto | ||||
| google.golang.org/grpc/grpclb/grpc_lb_v1/messages | ||||
| google.golang.org/grpc/grpclog | ||||
| google.golang.org/grpc/health | ||||
| google.golang.org/grpc/health/grpc_health_v1 | ||||
| google.golang.org/grpc/internal | ||||
| google.golang.org/grpc/keepalive | ||||
| google.golang.org/grpc/metadata | ||||
| google.golang.org/grpc/naming | ||||
| google.golang.org/grpc/peer | ||||
| google.golang.org/grpc/resolver | ||||
| google.golang.org/grpc/resolver/dns | ||||
| google.golang.org/grpc/resolver/passthrough | ||||
| google.golang.org/grpc/stats | ||||
| google.golang.org/grpc/status | ||||
| google.golang.org/grpc/tap | ||||
| google.golang.org/grpc/transport | ||||
| google.golang.org/grpc/balancer/base | ||||
| # gopkg.in/inf.v0 v0.9.1 | ||||
| gopkg.in/inf.v0 | ||||
| # gopkg.in/src-d/go-billy.v4 v4.2.0 | ||||
| gopkg.in/src-d/go-billy.v4 | ||||
| gopkg.in/src-d/go-billy.v4/osfs | ||||
| gopkg.in/src-d/go-billy.v4/util | ||||
| gopkg.in/src-d/go-billy.v4/helper/chroot | ||||
| gopkg.in/src-d/go-billy.v4/helper/polyfill | ||||
| gopkg.in/src-d/go-billy.v4/osfs | ||||
| gopkg.in/src-d/go-billy.v4/util | ||||
| # gopkg.in/src-d/go-git.v4 v4.6.0 | ||||
| gopkg.in/src-d/go-git.v4 | ||||
| gopkg.in/src-d/go-git.v4/plumbing | ||||
| gopkg.in/src-d/go-git.v4/config | ||||
| gopkg.in/src-d/go-git.v4/internal/revision | ||||
| gopkg.in/src-d/go-git.v4/plumbing | ||||
| gopkg.in/src-d/go-git.v4/plumbing/cache | ||||
| gopkg.in/src-d/go-git.v4/plumbing/filemode | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/config | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/diff | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/gitignore | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/idxfile | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/index | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/objfile | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/packfile | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/pktline | ||||
| gopkg.in/src-d/go-git.v4/plumbing/object | ||||
| gopkg.in/src-d/go-git.v4/plumbing/protocol/packp | ||||
| gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/capability | ||||
|  | @ -524,36 +530,29 @@ gopkg.in/src-d/go-git.v4/plumbing/revlist | |||
| gopkg.in/src-d/go-git.v4/plumbing/storer | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/client | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/file | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/git | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/http | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/internal/common | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/server | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/ssh | ||||
| gopkg.in/src-d/go-git.v4/storage | ||||
| gopkg.in/src-d/go-git.v4/storage/filesystem | ||||
| gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit | ||||
| gopkg.in/src-d/go-git.v4/storage/memory | ||||
| gopkg.in/src-d/go-git.v4/utils/binary | ||||
| gopkg.in/src-d/go-git.v4/utils/diff | ||||
| gopkg.in/src-d/go-git.v4/utils/ioutil | ||||
| gopkg.in/src-d/go-git.v4/utils/merkletrie | ||||
| gopkg.in/src-d/go-git.v4/utils/merkletrie/filesystem | ||||
| gopkg.in/src-d/go-git.v4/utils/merkletrie/index | ||||
| gopkg.in/src-d/go-git.v4/utils/merkletrie/noder | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/config | ||||
| gopkg.in/src-d/go-git.v4/utils/binary | ||||
| gopkg.in/src-d/go-git.v4/plumbing/cache | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/idxfile | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/diff | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/pktline | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/file | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/git | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/http | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/ssh | ||||
| gopkg.in/src-d/go-git.v4/plumbing/format/objfile | ||||
| gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit | ||||
| gopkg.in/src-d/go-git.v4/utils/merkletrie/internal/frame | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/internal/common | ||||
| gopkg.in/src-d/go-git.v4/plumbing/transport/server | ||||
| gopkg.in/src-d/go-git.v4/utils/merkletrie/noder | ||||
| # gopkg.in/warnings.v0 v0.1.2 | ||||
| gopkg.in/warnings.v0 | ||||
| # gopkg.in/yaml.v2 v2.2.2 | ||||
| gopkg.in/yaml.v2 | ||||
| # k8s.io/api v0.0.0-20180711052118-183f3326a935 | ||||
| k8s.io/api/core/v1 | ||||
| k8s.io/api/admissionregistration/v1alpha1 | ||||
| k8s.io/api/admissionregistration/v1beta1 | ||||
| k8s.io/api/apps/v1 | ||||
|  | @ -569,10 +568,11 @@ k8s.io/api/batch/v1 | |||
| k8s.io/api/batch/v1beta1 | ||||
| k8s.io/api/batch/v2alpha1 | ||||
| k8s.io/api/certificates/v1beta1 | ||||
| k8s.io/api/extensions/v1beta1 | ||||
| k8s.io/api/policy/v1beta1 | ||||
| k8s.io/api/core/v1 | ||||
| k8s.io/api/events/v1beta1 | ||||
| k8s.io/api/extensions/v1beta1 | ||||
| k8s.io/api/networking/v1 | ||||
| k8s.io/api/policy/v1beta1 | ||||
| k8s.io/api/rbac/v1 | ||||
| k8s.io/api/rbac/v1alpha1 | ||||
| k8s.io/api/rbac/v1beta1 | ||||
|  | @ -583,45 +583,45 @@ k8s.io/api/storage/v1 | |||
| k8s.io/api/storage/v1alpha1 | ||||
| k8s.io/api/storage/v1beta1 | ||||
| # k8s.io/apimachinery v0.0.0-20180621070125-103fd098999d | ||||
| k8s.io/apimachinery/pkg/util/wait | ||||
| k8s.io/apimachinery/pkg/apis/meta/v1 | ||||
| k8s.io/apimachinery/pkg/util/runtime | ||||
| k8s.io/apimachinery/pkg/api/errors | ||||
| k8s.io/apimachinery/pkg/api/meta | ||||
| k8s.io/apimachinery/pkg/api/resource | ||||
| k8s.io/apimachinery/pkg/runtime | ||||
| k8s.io/apimachinery/pkg/runtime/schema | ||||
| k8s.io/apimachinery/pkg/types | ||||
| k8s.io/apimachinery/pkg/util/intstr | ||||
| k8s.io/apimachinery/pkg/apis/meta/v1 | ||||
| k8s.io/apimachinery/pkg/apis/meta/v1/unstructured | ||||
| k8s.io/apimachinery/pkg/apis/meta/v1beta1 | ||||
| k8s.io/apimachinery/pkg/conversion | ||||
| k8s.io/apimachinery/pkg/conversion/queryparams | ||||
| k8s.io/apimachinery/pkg/fields | ||||
| k8s.io/apimachinery/pkg/labels | ||||
| k8s.io/apimachinery/pkg/selection | ||||
| k8s.io/apimachinery/pkg/watch | ||||
| k8s.io/apimachinery/pkg/api/errors | ||||
| k8s.io/apimachinery/pkg/runtime/serializer/streaming | ||||
| k8s.io/apimachinery/pkg/util/net | ||||
| k8s.io/apimachinery/pkg/util/sets | ||||
| k8s.io/apimachinery/pkg/conversion/queryparams | ||||
| k8s.io/apimachinery/pkg/util/errors | ||||
| k8s.io/apimachinery/pkg/util/json | ||||
| k8s.io/apimachinery/third_party/forked/golang/reflect | ||||
| k8s.io/apimachinery/pkg/util/validation | ||||
| k8s.io/apimachinery/pkg/runtime | ||||
| k8s.io/apimachinery/pkg/runtime/schema | ||||
| k8s.io/apimachinery/pkg/runtime/serializer | ||||
| k8s.io/apimachinery/pkg/version | ||||
| k8s.io/apimachinery/pkg/api/meta | ||||
| k8s.io/apimachinery/pkg/util/clock | ||||
| k8s.io/apimachinery/pkg/util/validation/field | ||||
| k8s.io/apimachinery/pkg/runtime/serializer/json | ||||
| k8s.io/apimachinery/pkg/runtime/serializer/protobuf | ||||
| k8s.io/apimachinery/pkg/runtime/serializer/recognizer | ||||
| k8s.io/apimachinery/pkg/runtime/serializer/streaming | ||||
| k8s.io/apimachinery/pkg/runtime/serializer/versioning | ||||
| k8s.io/apimachinery/pkg/apis/meta/v1beta1 | ||||
| k8s.io/apimachinery/pkg/selection | ||||
| k8s.io/apimachinery/pkg/types | ||||
| k8s.io/apimachinery/pkg/util/clock | ||||
| k8s.io/apimachinery/pkg/util/errors | ||||
| k8s.io/apimachinery/pkg/util/framer | ||||
| k8s.io/apimachinery/pkg/util/intstr | ||||
| k8s.io/apimachinery/pkg/util/json | ||||
| k8s.io/apimachinery/pkg/util/net | ||||
| k8s.io/apimachinery/pkg/util/runtime | ||||
| k8s.io/apimachinery/pkg/util/sets | ||||
| k8s.io/apimachinery/pkg/util/validation | ||||
| k8s.io/apimachinery/pkg/util/validation/field | ||||
| k8s.io/apimachinery/pkg/util/wait | ||||
| k8s.io/apimachinery/pkg/util/yaml | ||||
| k8s.io/apimachinery/pkg/apis/meta/v1/unstructured | ||||
| k8s.io/apimachinery/pkg/version | ||||
| k8s.io/apimachinery/pkg/watch | ||||
| k8s.io/apimachinery/third_party/forked/golang/reflect | ||||
| # k8s.io/client-go v0.0.0-20180910083459-2cefa64ff137 | ||||
| k8s.io/client-go/kubernetes | ||||
| k8s.io/client-go/rest | ||||
| k8s.io/client-go/discovery | ||||
| k8s.io/client-go/kubernetes | ||||
| k8s.io/client-go/kubernetes/scheme | ||||
| k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1 | ||||
| k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1 | ||||
| k8s.io/client-go/kubernetes/typed/apps/v1 | ||||
|  | @ -651,25 +651,25 @@ k8s.io/client-go/kubernetes/typed/settings/v1alpha1 | |||
| k8s.io/client-go/kubernetes/typed/storage/v1 | ||||
| k8s.io/client-go/kubernetes/typed/storage/v1alpha1 | ||||
| k8s.io/client-go/kubernetes/typed/storage/v1beta1 | ||||
| k8s.io/client-go/util/flowcontrol | ||||
| k8s.io/client-go/pkg/version | ||||
| k8s.io/client-go/plugin/pkg/client/auth/exec | ||||
| k8s.io/client-go/rest/watch | ||||
| k8s.io/client-go/tools/clientcmd/api | ||||
| k8s.io/client-go/tools/metrics | ||||
| k8s.io/client-go/transport | ||||
| k8s.io/client-go/util/cert | ||||
| k8s.io/client-go/kubernetes/scheme | ||||
| k8s.io/client-go/tools/reference | ||||
| k8s.io/client-go/util/integer | ||||
| k8s.io/client-go/pkg/apis/clientauthentication | ||||
| k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1 | ||||
| k8s.io/client-go/pkg/apis/clientauthentication/v1beta1 | ||||
| k8s.io/client-go/pkg/version | ||||
| k8s.io/client-go/plugin/pkg/client/auth/exec | ||||
| k8s.io/client-go/rest | ||||
| k8s.io/client-go/rest/watch | ||||
| k8s.io/client-go/tools/clientcmd/api | ||||
| k8s.io/client-go/tools/metrics | ||||
| k8s.io/client-go/tools/reference | ||||
| k8s.io/client-go/transport | ||||
| k8s.io/client-go/util/cert | ||||
| k8s.io/client-go/util/connrotation | ||||
| k8s.io/client-go/util/flowcontrol | ||||
| k8s.io/client-go/util/integer | ||||
| # k8s.io/kubernetes v1.11.1 | ||||
| k8s.io/kubernetes/pkg/cloudprovider/providers/azure/auth | ||||
| k8s.io/kubernetes/pkg/credentialprovider | ||||
| k8s.io/kubernetes/pkg/credentialprovider/aws | ||||
| k8s.io/kubernetes/pkg/credentialprovider/azure | ||||
| k8s.io/kubernetes/pkg/credentialprovider/gcp | ||||
| k8s.io/kubernetes/pkg/credentialprovider/secrets | ||||
| k8s.io/kubernetes/pkg/cloudprovider/providers/azure/auth | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue