Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
564c1aeb
Unverified
Commit
564c1aeb
authored
Oct 25, 2019
by
Erik Wilson
Committed by
GitHub
Oct 25, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #962 from erikwilson/bump-containerd
Bump containerd to v1.3.0-k3s.4
parents
d2756a76
3c65daa0
Hide whitespace changes
Inline
Side-by-side
Showing
70 changed files
with
13072 additions
and
5 deletions
+13072
-5
go.mod
go.mod
+1
-1
go.sum
go.sum
+3
-2
mksyscall_windows.go
...ithub.com/Microsoft/go-winio/pkg/etw/mksyscall_windows.go
+913
-0
mksyscall_windows.go
vendor/github.com/Microsoft/hcsshim/mksyscall_windows.go
+943
-0
hello.go
vendor/github.com/chai2010/gettext-go/gettext/hello.go
+22
-0
.appveyor.yml
vendor/github.com/containerd/containerd/.appveyor.yml
+1
-1
.travis.yml
vendor/github.com/containerd/containerd/.travis.yml
+1
-1
apply_linux.go
...ithub.com/containerd/containerd/diff/apply/apply_linux.go
+6
-0
manifest_test_darwin.go
.../github.com/containerd/continuity/manifest_test_darwin.go
+39
-0
bson_corpus_spec_test_generator.go
...om/globalsign/mgo/bson/bson_corpus_spec_test_generator.go
+294
-0
btree_mem.go
vendor/github.com/google/btree/btree_mem.go
+76
-0
root_darwin_arm_gen.go
...e/certificate-transparency-go/x509/root_darwin_arm_gen.go
+187
-0
x509_test_import.go
...ogle/certificate-transparency-go/x509/x509_test_import.go
+55
-0
gen.go
vendor/github.com/lib/pq/oid/gen.go
+93
-0
duplicate_generate.go
vendor/github.com/miekg/dns/duplicate_generate.go
+144
-0
msg_generate.go
vendor/github.com/miekg/dns/msg_generate.go
+328
-0
types_generate.go
vendor/github.com/miekg/dns/types_generate.go
+287
-0
gen.go
vendor/golang.org/x/net/html/atom/gen.go
+712
-0
gen.go
vendor/golang.org/x/net/internal/iana/gen.go
+383
-0
defs_darwin.go
vendor/golang.org/x/net/internal/socket/defs_darwin.go
+44
-0
defs_dragonfly.go
vendor/golang.org/x/net/internal/socket/defs_dragonfly.go
+44
-0
defs_freebsd.go
vendor/golang.org/x/net/internal/socket/defs_freebsd.go
+44
-0
defs_linux.go
vendor/golang.org/x/net/internal/socket/defs_linux.go
+49
-0
defs_netbsd.go
vendor/golang.org/x/net/internal/socket/defs_netbsd.go
+47
-0
defs_openbsd.go
vendor/golang.org/x/net/internal/socket/defs_openbsd.go
+44
-0
defs_solaris.go
vendor/golang.org/x/net/internal/socket/defs_solaris.go
+44
-0
defs_darwin.go
vendor/golang.org/x/net/ipv4/defs_darwin.go
+77
-0
defs_dragonfly.go
vendor/golang.org/x/net/ipv4/defs_dragonfly.go
+38
-0
defs_freebsd.go
vendor/golang.org/x/net/ipv4/defs_freebsd.go
+75
-0
defs_linux.go
vendor/golang.org/x/net/ipv4/defs_linux.go
+122
-0
defs_netbsd.go
vendor/golang.org/x/net/ipv4/defs_netbsd.go
+37
-0
defs_openbsd.go
vendor/golang.org/x/net/ipv4/defs_openbsd.go
+37
-0
defs_solaris.go
vendor/golang.org/x/net/ipv4/defs_solaris.go
+84
-0
gen.go
vendor/golang.org/x/net/ipv4/gen.go
+199
-0
defs_darwin.go
vendor/golang.org/x/net/ipv6/defs_darwin.go
+112
-0
defs_dragonfly.go
vendor/golang.org/x/net/ipv6/defs_dragonfly.go
+84
-0
defs_freebsd.go
vendor/golang.org/x/net/ipv6/defs_freebsd.go
+105
-0
defs_linux.go
vendor/golang.org/x/net/ipv6/defs_linux.go
+147
-0
defs_netbsd.go
vendor/golang.org/x/net/ipv6/defs_netbsd.go
+80
-0
defs_openbsd.go
vendor/golang.org/x/net/ipv6/defs_openbsd.go
+89
-0
defs_solaris.go
vendor/golang.org/x/net/ipv6/defs_solaris.go
+114
-0
gen.go
vendor/golang.org/x/net/ipv6/gen.go
+199
-0
mkasm_darwin.go
vendor/golang.org/x/sys/unix/mkasm_darwin.go
+61
-0
mkpost.go
vendor/golang.org/x/sys/unix/mkpost.go
+122
-0
mksyscall.go
vendor/golang.org/x/sys/unix/mksyscall.go
+407
-0
mksyscall_aix_ppc.go
vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go
+415
-0
mksyscall_aix_ppc64.go
vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go
+614
-0
mksyscall_solaris.go
vendor/golang.org/x/sys/unix/mksyscall_solaris.go
+335
-0
mksysctl_openbsd.go
vendor/golang.org/x/sys/unix/mksysctl_openbsd.go
+355
-0
mksysnum.go
vendor/golang.org/x/sys/unix/mksysnum.go
+190
-0
types_aix.go
vendor/golang.org/x/sys/unix/types_aix.go
+237
-0
types_darwin.go
vendor/golang.org/x/sys/unix/types_darwin.go
+283
-0
types_dragonfly.go
vendor/golang.org/x/sys/unix/types_dragonfly.go
+263
-0
types_freebsd.go
vendor/golang.org/x/sys/unix/types_freebsd.go
+400
-0
types_netbsd.go
vendor/golang.org/x/sys/unix/types_netbsd.go
+290
-0
types_openbsd.go
vendor/golang.org/x/sys/unix/types_openbsd.go
+283
-0
types_solaris.go
vendor/golang.org/x/sys/unix/types_solaris.go
+266
-0
gen.go
vendor/golang.org/x/text/encoding/internal/identifier/gen.go
+142
-0
gen.go
vendor/golang.org/x/text/unicode/bidi/gen.go
+133
-0
gen_ranges.go
vendor/golang.org/x/text/unicode/bidi/gen_ranges.go
+57
-0
gen_trieval.go
vendor/golang.org/x/text/unicode/bidi/gen_trieval.go
+64
-0
maketables.go
vendor/golang.org/x/text/unicode/norm/maketables.go
+986
-0
triegen.go
vendor/golang.org/x/text/unicode/norm/triegen.go
+117
-0
gen.go
vendor/golang.org/x/text/width/gen.go
+115
-0
gen_common.go
vendor/golang.org/x/text/width/gen_common.go
+96
-0
gen_trieval.go
vendor/golang.org/x/text/width/gen_trieval.go
+34
-0
main.go
vendor/golang.org/x/tools/go/gcexportdata/main.go
+99
-0
mkindex.go
vendor/golang.org/x/tools/internal/imports/mkindex.go
+173
-0
mkstdlib.go
vendor/golang.org/x/tools/internal/imports/mkstdlib.go
+132
-0
modules.txt
vendor/modules.txt
+0
-0
No files found.
go.mod
View file @
564c1aeb
...
@@ -7,7 +7,7 @@ replace (
...
@@ -7,7 +7,7 @@ replace (
github.com/containerd/btrfs => github.com/containerd/btrfs v0.0.0-20181101203652-af5082808c83
github.com/containerd/btrfs => github.com/containerd/btrfs v0.0.0-20181101203652-af5082808c83
github.com/containerd/cgroups => github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601
github.com/containerd/cgroups => github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601
github.com/containerd/console => github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50
github.com/containerd/console => github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50
github.com/containerd/containerd => github.com/rancher/containerd v1.3.0-k3s.
2
github.com/containerd/containerd => github.com/rancher/containerd v1.3.0-k3s.
4
github.com/containerd/continuity => github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02
github.com/containerd/continuity => github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02
github.com/containerd/fifo => github.com/containerd/fifo v0.0.0-20190816180239-bda0ff6ed73c
github.com/containerd/fifo => github.com/containerd/fifo v0.0.0-20190816180239-bda0ff6ed73c
github.com/containerd/go-runc => github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda
github.com/containerd/go-runc => github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda
...
...
go.sum
View file @
564c1aeb
...
@@ -559,8 +559,8 @@ github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:
...
@@ -559,8 +559,8 @@ github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:
github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI=
github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI=
github.com/rakelkar/gonetsh v0.0.0-20190719023240-501daadcadf8 h1:83l9gPhYtgxODlZKU0Odq4pQuDcMZEVgAh364+PV3OU=
github.com/rakelkar/gonetsh v0.0.0-20190719023240-501daadcadf8 h1:83l9gPhYtgxODlZKU0Odq4pQuDcMZEVgAh364+PV3OU=
github.com/rakelkar/gonetsh v0.0.0-20190719023240-501daadcadf8/go.mod h1:4XHkfaUj+URzGO9sohoAgt2V9Y8nIW7fugpu0E6gShk=
github.com/rakelkar/gonetsh v0.0.0-20190719023240-501daadcadf8/go.mod h1:4XHkfaUj+URzGO9sohoAgt2V9Y8nIW7fugpu0E6gShk=
github.com/rancher/containerd v1.3.0-k3s.
2 h1:l3hHJRVNreflDuePWkJiONdSylPqNnNoqBkerqWUcF
Q=
github.com/rancher/containerd v1.3.0-k3s.
4 h1:Vq9EJQEm01eeWaBtgU35KxWeuVU5LwW43EmDIEnqpD
Q=
github.com/rancher/containerd v1.3.0-k3s.
2
/go.mod h1:ZMfzmqce2Z+QSEqdHMfeJs1TZ/UeJ1aDrazjpQT4ehM=
github.com/rancher/containerd v1.3.0-k3s.
4
/go.mod h1:ZMfzmqce2Z+QSEqdHMfeJs1TZ/UeJ1aDrazjpQT4ehM=
github.com/rancher/cri-tools v1.16.1-k3s.1 h1:iporgQ46noE6dtLzq6fWcIO2qjyPZy2m42d2P+UnGJg=
github.com/rancher/cri-tools v1.16.1-k3s.1 h1:iporgQ46noE6dtLzq6fWcIO2qjyPZy2m42d2P+UnGJg=
github.com/rancher/cri-tools v1.16.1-k3s.1/go.mod h1:TEKhKv2EJIZp+p9jnEy4C63g8CosJzsI4kyKKkHag+8=
github.com/rancher/cri-tools v1.16.1-k3s.1/go.mod h1:TEKhKv2EJIZp+p9jnEy4C63g8CosJzsI4kyKKkHag+8=
github.com/rancher/dynamiclistener v0.1.1-0.20191010011134-8a2488bc860a h1:1bUYAv5U/Ky4YJ9o8gWxX+vNcjpIL3JWNBao70OlkFE=
github.com/rancher/dynamiclistener v0.1.1-0.20191010011134-8a2488bc860a h1:1bUYAv5U/Ky4YJ9o8gWxX+vNcjpIL3JWNBao70OlkFE=
...
@@ -882,6 +882,7 @@ gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
...
@@ -882,6 +882,7 @@ gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U=
gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U=
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU=
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
...
...
vendor/github.com/Microsoft/go-winio/pkg/etw/mksyscall_windows.go
0 → 100644
View file @
564c1aeb
// Copyright 2013 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
/*
mksyscall_windows generates windows system call bodies
It parses all files specified on command line containing function
prototypes (like syscall_windows.go) and prints system call bodies
to standard output.
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 from its winapi dll name,
the winapi name could be specified at the end, after "=" sign, like
//sys LoadLibrary(libname string) (handle uint32, err error) = LoadLibraryA
* Each function that returns err needs to supply a condition, that
return value of winapi will be tested against to detect failure.
This would set err to windows "last-error", otherwise it will be nil.
The value can be provided at end of //sys declaration, like
//sys LoadLibrary(libname string) (handle uint32, err error) [failretval==-1] = LoadLibraryA
and is [failretval==0] by default.
Usage:
mksyscall_windows [flags] [path ...]
The flags are:
-output
Specify output file name (outputs to console if blank).
-trace
Generate print statement after every syscall.
*/
package
main
import
(
"bufio"
"bytes"
"errors"
"flag"
"fmt"
"go/format"
"go/parser"
"go/token"
"io"
"io/ioutil"
"log"
"os"
"path/filepath"
"runtime"
"sort"
"strconv"
"strings"
"text/template"
)
var
(
filename
=
flag
.
String
(
"output"
,
""
,
"output file name (standard output if omitted)"
)
printTraceFlag
=
flag
.
Bool
(
"trace"
,
false
,
"generate print statement after every syscall"
)
systemDLL
=
flag
.
Bool
(
"systemdll"
,
true
,
"whether all DLLs should be loaded from the Windows system directory"
)
)
func
trim
(
s
string
)
string
{
return
strings
.
Trim
(
s
,
"
\t
"
)
}
var
packageName
string
func
packagename
()
string
{
return
packageName
}
func
syscalldot
()
string
{
if
packageName
==
"syscall"
{
return
""
}
return
"syscall."
}
// Param is function parameter
type
Param
struct
{
Name
string
Type
string
fn
*
Fn
tmpVarIdx
int
}
// tmpVar returns temp variable name that will be used to represent p during syscall.
func
(
p
*
Param
)
tmpVar
()
string
{
if
p
.
tmpVarIdx
<
0
{
p
.
tmpVarIdx
=
p
.
fn
.
curTmpVarIdx
p
.
fn
.
curTmpVarIdx
++
}
return
fmt
.
Sprintf
(
"_p%d"
,
p
.
tmpVarIdx
)
}
// BoolTmpVarCode returns source code for bool temp variable.
func
(
p
*
Param
)
BoolTmpVarCode
()
string
{
const
code
=
`var %s uint32
if %s {
%s = 1
} else {
%s = 0
}`
tmp
:=
p
.
tmpVar
()
return
fmt
.
Sprintf
(
code
,
tmp
,
p
.
Name
,
tmp
,
tmp
)
}
// SliceTmpVarCode returns source code for slice temp variable.
func
(
p
*
Param
)
SliceTmpVarCode
()
string
{
const
code
=
`var %s *%s
if len(%s) > 0 {
%s = &%s[0]
}`
tmp
:=
p
.
tmpVar
()
return
fmt
.
Sprintf
(
code
,
tmp
,
p
.
Type
[
2
:
],
p
.
Name
,
tmp
,
p
.
Name
)
}
// StringTmpVarCode returns source code for string temp variable.
func
(
p
*
Param
)
StringTmpVarCode
()
string
{
errvar
:=
p
.
fn
.
Rets
.
ErrorVarName
()
if
errvar
==
""
{
errvar
=
"_"
}
tmp
:=
p
.
tmpVar
()
const
code
=
`var %s %s
%s, %s = %s(%s)`
s
:=
fmt
.
Sprintf
(
code
,
tmp
,
p
.
fn
.
StrconvType
(),
tmp
,
errvar
,
p
.
fn
.
StrconvFunc
(),
p
.
Name
)
if
errvar
==
"-"
{
return
s
}
const
morecode
=
`
if %s != nil {
return
}`
return
s
+
fmt
.
Sprintf
(
morecode
,
errvar
)
}
// TmpVarCode returns source code for temp variable.
func
(
p
*
Param
)
TmpVarCode
()
string
{
switch
{
case
p
.
Type
==
"bool"
:
return
p
.
BoolTmpVarCode
()
case
strings
.
HasPrefix
(
p
.
Type
,
"[]"
)
:
return
p
.
SliceTmpVarCode
()
default
:
return
""
}
}
// TmpVarHelperCode returns source code for helper's temp variable.
func
(
p
*
Param
)
TmpVarHelperCode
()
string
{
if
p
.
Type
!=
"string"
{
return
""
}
return
p
.
StringTmpVarCode
()
}
// SyscallArgList returns source code fragments representing p parameter
// in syscall. Slices are translated into 2 syscall parameters: pointer to
// the first element and length.
func
(
p
*
Param
)
SyscallArgList
()
[]
string
{
t
:=
p
.
HelperType
()
var
s
string
switch
{
case
t
[
0
]
==
'*'
:
s
=
fmt
.
Sprintf
(
"unsafe.Pointer(%s)"
,
p
.
Name
)
case
t
==
"bool"
:
s
=
p
.
tmpVar
()
case
strings
.
HasPrefix
(
t
,
"[]"
)
:
return
[]
string
{
fmt
.
Sprintf
(
"uintptr(unsafe.Pointer(%s))"
,
p
.
tmpVar
()),
fmt
.
Sprintf
(
"uintptr(len(%s))"
,
p
.
Name
),
}
default
:
s
=
p
.
Name
}
return
[]
string
{
fmt
.
Sprintf
(
"uintptr(%s)"
,
s
)}
}
// IsError determines if p parameter is used to return error.
func
(
p
*
Param
)
IsError
()
bool
{
return
p
.
Name
==
"err"
&&
p
.
Type
==
"error"
}
// HelperType returns type of parameter p used in helper function.
func
(
p
*
Param
)
HelperType
()
string
{
if
p
.
Type
==
"string"
{
return
p
.
fn
.
StrconvType
()
}
return
p
.
Type
}
// join concatenates parameters ps into a string with sep separator.
// Each parameter is converted into string by applying fn to it
// before conversion.
func
join
(
ps
[]
*
Param
,
fn
func
(
*
Param
)
string
,
sep
string
)
string
{
if
len
(
ps
)
==
0
{
return
""
}
a
:=
make
([]
string
,
0
)
for
_
,
p
:=
range
ps
{
a
=
append
(
a
,
fn
(
p
))
}
return
strings
.
Join
(
a
,
sep
)
}
// Rets describes function return parameters.
type
Rets
struct
{
Name
string
Type
string
ReturnsError
bool
FailCond
string
}
// ErrorVarName returns error variable name for r.
func
(
r
*
Rets
)
ErrorVarName
()
string
{
if
r
.
ReturnsError
{
return
"err"
}
if
r
.
Type
==
"error"
{
return
r
.
Name
}
return
""
}
// ToParams converts r into slice of *Param.
func
(
r
*
Rets
)
ToParams
()
[]
*
Param
{
ps
:=
make
([]
*
Param
,
0
)
if
len
(
r
.
Name
)
>
0
{
ps
=
append
(
ps
,
&
Param
{
Name
:
r
.
Name
,
Type
:
r
.
Type
})
}
if
r
.
ReturnsError
{
ps
=
append
(
ps
,
&
Param
{
Name
:
"err"
,
Type
:
"error"
})
}
return
ps
}
// List returns source code of syscall return parameters.
func
(
r
*
Rets
)
List
()
string
{
s
:=
join
(
r
.
ToParams
(),
func
(
p
*
Param
)
string
{
return
p
.
Name
+
" "
+
p
.
Type
},
", "
)
if
len
(
s
)
>
0
{
s
=
"("
+
s
+
")"
}
return
s
}
// PrintList returns source code of trace printing part correspondent
// to syscall return values.
func
(
r
*
Rets
)
PrintList
()
string
{
return
join
(
r
.
ToParams
(),
func
(
p
*
Param
)
string
{
return
fmt
.
Sprintf
(
`"%s=", %s, `
,
p
.
Name
,
p
.
Name
)
},
`", ", `
)
}
// SetReturnValuesCode returns source code that accepts syscall return values.
func
(
r
*
Rets
)
SetReturnValuesCode
()
string
{
if
r
.
Name
==
""
&&
!
r
.
ReturnsError
{
return
""
}
retvar
:=
"r0"
if
r
.
Name
==
""
{
retvar
=
"r1"
}
errvar
:=
"_"
if
r
.
ReturnsError
{
errvar
=
"e1"
}
return
fmt
.
Sprintf
(
"%s, _, %s := "
,
retvar
,
errvar
)
}
func
(
r
*
Rets
)
useLongHandleErrorCode
(
retvar
string
)
string
{
const
code
=
`if %s {
if e1 != 0 {
err = errnoErr(e1)
} else {
err = %sEINVAL
}
}`
cond
:=
retvar
+
" == 0"
if
r
.
FailCond
!=
""
{
cond
=
strings
.
Replace
(
r
.
FailCond
,
"failretval"
,
retvar
,
1
)
}
return
fmt
.
Sprintf
(
code
,
cond
,
syscalldot
())
}
// SetErrorCode returns source code that sets return parameters.
func
(
r
*
Rets
)
SetErrorCode
()
string
{
const
code
=
`if r0 != 0 {
%s = %sErrno(r0)
}`
if
r
.
Name
==
""
&&
!
r
.
ReturnsError
{
return
""
}
if
r
.
Name
==
""
{
return
r
.
useLongHandleErrorCode
(
"r1"
)
}
if
r
.
Type
==
"error"
{
return
fmt
.
Sprintf
(
code
,
r
.
Name
,
syscalldot
())
}
s
:=
""
switch
{
case
r
.
Type
[
0
]
==
'*'
:
s
=
fmt
.
Sprintf
(
"%s = (%s)(unsafe.Pointer(r0))"
,
r
.
Name
,
r
.
Type
)
case
r
.
Type
==
"bool"
:
s
=
fmt
.
Sprintf
(
"%s = r0 != 0"
,
r
.
Name
)
default
:
s
=
fmt
.
Sprintf
(
"%s = %s(r0)"
,
r
.
Name
,
r
.
Type
)
}
if
!
r
.
ReturnsError
{
return
s
}
return
s
+
"
\n\t
"
+
r
.
useLongHandleErrorCode
(
r
.
Name
)
}
// Fn describes syscall function.
type
Fn
struct
{
Name
string
Params
[]
*
Param
Rets
*
Rets
PrintTrace
bool
dllname
string
dllfuncname
string
src
string
// TODO: get rid of this field and just use parameter index instead
curTmpVarIdx
int
// insure tmp variables have uniq names
}
// extractParams parses s to extract function parameters.
func
extractParams
(
s
string
,
f
*
Fn
)
([]
*
Param
,
error
)
{
s
=
trim
(
s
)
if
s
==
""
{
return
nil
,
nil
}
a
:=
strings
.
Split
(
s
,
","
)
ps
:=
make
([]
*
Param
,
len
(
a
))
for
i
:=
range
ps
{
s2
:=
trim
(
a
[
i
])
b
:=
strings
.
Split
(
s2
,
" "
)
if
len
(
b
)
!=
2
{
b
=
strings
.
Split
(
s2
,
"
\t
"
)
if
len
(
b
)
!=
2
{
return
nil
,
errors
.
New
(
"Could not extract function parameter from
\"
"
+
s2
+
"
\"
"
)
}
}
ps
[
i
]
=
&
Param
{
Name
:
trim
(
b
[
0
]),
Type
:
trim
(
b
[
1
]),
fn
:
f
,
tmpVarIdx
:
-
1
,
}
}
return
ps
,
nil
}
// extractSection extracts text out of string s starting after start
// and ending just before end. found return value will indicate success,
// and prefix, body and suffix will contain correspondent parts of string s.
func
extractSection
(
s
string
,
start
,
end
rune
)
(
prefix
,
body
,
suffix
string
,
found
bool
)
{
s
=
trim
(
s
)
if
strings
.
HasPrefix
(
s
,
string
(
start
))
{
// no prefix
body
=
s
[
1
:
]
}
else
{
a
:=
strings
.
SplitN
(
s
,
string
(
start
),
2
)
if
len
(
a
)
!=
2
{
return
""
,
""
,
s
,
false
}
prefix
=
a
[
0
]
body
=
a
[
1
]
}
a
:=
strings
.
SplitN
(
body
,
string
(
end
),
2
)
if
len
(
a
)
!=
2
{
return
""
,
""
,
""
,
false
}
return
prefix
,
a
[
0
],
a
[
1
],
true
}
// newFn parses string s and return created function Fn.
func
newFn
(
s
string
)
(
*
Fn
,
error
)
{
s
=
trim
(
s
)
f
:=
&
Fn
{
Rets
:
&
Rets
{},
src
:
s
,
PrintTrace
:
*
printTraceFlag
,
}
// function name and args
prefix
,
body
,
s
,
found
:=
extractSection
(
s
,
'('
,
')'
)
if
!
found
||
prefix
==
""
{
return
nil
,
errors
.
New
(
"Could not extract function name and parameters from
\"
"
+
f
.
src
+
"
\"
"
)
}
f
.
Name
=
prefix
var
err
error
f
.
Params
,
err
=
extractParams
(
body
,
f
)
if
err
!=
nil
{
return
nil
,
err
}
// return values
_
,
body
,
s
,
found
=
extractSection
(
s
,
'('
,
')'
)
if
found
{
r
,
err
:=
extractParams
(
body
,
f
)
if
err
!=
nil
{
return
nil
,
err
}
switch
len
(
r
)
{
case
0
:
case
1
:
if
r
[
0
]
.
IsError
()
{
f
.
Rets
.
ReturnsError
=
true
}
else
{
f
.
Rets
.
Name
=
r
[
0
]
.
Name
f
.
Rets
.
Type
=
r
[
0
]
.
Type
}
case
2
:
if
!
r
[
1
]
.
IsError
()
{
return
nil
,
errors
.
New
(
"Only last windows error is allowed as second return value in
\"
"
+
f
.
src
+
"
\"
"
)
}
f
.
Rets
.
ReturnsError
=
true
f
.
Rets
.
Name
=
r
[
0
]
.
Name
f
.
Rets
.
Type
=
r
[
0
]
.
Type
default
:
return
nil
,
errors
.
New
(
"Too many return values in
\"
"
+
f
.
src
+
"
\"
"
)
}
}
// fail condition
_
,
body
,
s
,
found
=
extractSection
(
s
,
'['
,
']'
)
if
found
{
f
.
Rets
.
FailCond
=
body
}
// dll and dll function names
s
=
trim
(
s
)
if
s
==
""
{
return
f
,
nil
}
if
!
strings
.
HasPrefix
(
s
,
"="
)
{
return
nil
,
errors
.
New
(
"Could not extract dll name from
\"
"
+
f
.
src
+
"
\"
"
)
}
s
=
trim
(
s
[
1
:
])
a
:=
strings
.
Split
(
s
,
"."
)
switch
len
(
a
)
{
case
1
:
f
.
dllfuncname
=
a
[
0
]
case
2
:
f
.
dllname
=
a
[
0
]
f
.
dllfuncname
=
a
[
1
]
default
:
return
nil
,
errors
.
New
(
"Could not extract dll name from
\"
"
+
f
.
src
+
"
\"
"
)
}
return
f
,
nil
}
// DLLName returns DLL name for function f.
func
(
f
*
Fn
)
DLLName
()
string
{
if
f
.
dllname
==
""
{
return
"kernel32"
}
return
f
.
dllname
}
// DLLName returns DLL function name for function f.
func
(
f
*
Fn
)
DLLFuncName
()
string
{
if
f
.
dllfuncname
==
""
{
return
f
.
Name
}
return
f
.
dllfuncname
}
// ParamList returns source code for function f parameters.
func
(
f
*
Fn
)
ParamList
()
string
{
return
join
(
f
.
Params
,
func
(
p
*
Param
)
string
{
return
p
.
Name
+
" "
+
p
.
Type
},
", "
)
}
// HelperParamList returns source code for helper function f parameters.
func
(
f
*
Fn
)
HelperParamList
()
string
{
return
join
(
f
.
Params
,
func
(
p
*
Param
)
string
{
return
p
.
Name
+
" "
+
p
.
HelperType
()
},
", "
)
}
// ParamPrintList returns source code of trace printing part correspondent
// to syscall input parameters.
func
(
f
*
Fn
)
ParamPrintList
()
string
{
return
join
(
f
.
Params
,
func
(
p
*
Param
)
string
{
return
fmt
.
Sprintf
(
`"%s=", %s, `
,
p
.
Name
,
p
.
Name
)
},
`", ", `
)
}
// ParamCount return number of syscall parameters for function f.
func
(
f
*
Fn
)
ParamCount
()
int
{
n
:=
0
for
_
,
p
:=
range
f
.
Params
{
n
+=
len
(
p
.
SyscallArgList
())
}
return
n
}
// SyscallParamCount determines which version of Syscall/Syscall6/Syscall9/...
// to use. It returns parameter count for correspondent SyscallX function.
func
(
f
*
Fn
)
SyscallParamCount
()
int
{
n
:=
f
.
ParamCount
()
switch
{
case
n
<=
3
:
return
3
case
n
<=
6
:
return
6
case
n
<=
9
:
return
9
case
n
<=
12
:
return
12
case
n
<=
15
:
return
15
default
:
panic
(
"too many arguments to system call"
)
}
}
// Syscall determines which SyscallX function to use for function f.
func
(
f
*
Fn
)
Syscall
()
string
{
c
:=
f
.
SyscallParamCount
()
if
c
==
3
{
return
syscalldot
()
+
"Syscall"
}
return
syscalldot
()
+
"Syscall"
+
strconv
.
Itoa
(
c
)
}
// SyscallParamList returns source code for SyscallX parameters for function f.
func
(
f
*
Fn
)
SyscallParamList
()
string
{
a
:=
make
([]
string
,
0
)
for
_
,
p
:=
range
f
.
Params
{
a
=
append
(
a
,
p
.
SyscallArgList
()
...
)
}
for
len
(
a
)
<
f
.
SyscallParamCount
()
{
a
=
append
(
a
,
"0"
)
}
return
strings
.
Join
(
a
,
", "
)
}
// HelperCallParamList returns source code of call into function f helper.
func
(
f
*
Fn
)
HelperCallParamList
()
string
{
a
:=
make
([]
string
,
0
,
len
(
f
.
Params
))
for
_
,
p
:=
range
f
.
Params
{
s
:=
p
.
Name
if
p
.
Type
==
"string"
{
s
=
p
.
tmpVar
()
}
a
=
append
(
a
,
s
)
}
return
strings
.
Join
(
a
,
", "
)
}
// IsUTF16 is true, if f is W (utf16) function. It is false
// for all A (ascii) functions.
func
(
f
*
Fn
)
IsUTF16
()
bool
{
s
:=
f
.
DLLFuncName
()
return
s
[
len
(
s
)
-
1
]
==
'W'
}
// StrconvFunc returns name of Go string to OS string function for f.
func
(
f
*
Fn
)
StrconvFunc
()
string
{
if
f
.
IsUTF16
()
{
return
syscalldot
()
+
"UTF16PtrFromString"
}
return
syscalldot
()
+
"BytePtrFromString"
}
// StrconvType returns Go type name used for OS string for f.
func
(
f
*
Fn
)
StrconvType
()
string
{
if
f
.
IsUTF16
()
{
return
"*uint16"
}
return
"*byte"
}
// HasStringParam is true, if f has at least one string parameter.
// Otherwise it is false.
func
(
f
*
Fn
)
HasStringParam
()
bool
{
for
_
,
p
:=
range
f
.
Params
{
if
p
.
Type
==
"string"
{
return
true
}
}
return
false
}
// HelperName returns name of function f helper.
func
(
f
*
Fn
)
HelperName
()
string
{
if
!
f
.
HasStringParam
()
{
return
f
.
Name
}
return
"_"
+
f
.
Name
}
// Source files and functions.
type
Source
struct
{
Funcs
[]
*
Fn
Files
[]
string
StdLibImports
[]
string
ExternalImports
[]
string
}
func
(
src
*
Source
)
FuncImports
()
[]
*
Fn
{
uniq
:=
make
(
map
[
string
]
bool
)
r
:=
make
([]
*
Fn
,
0
)
for
_
,
f
:=
range
src
.
Funcs
{
name
:=
f
.
DLLFuncName
()
if
_
,
found
:=
uniq
[
name
];
!
found
{
uniq
[
name
]
=
true
r
=
append
(
r
,
f
)
}
}
return
r
}
func
(
src
*
Source
)
Import
(
pkg
string
)
{
src
.
StdLibImports
=
append
(
src
.
StdLibImports
,
pkg
)
sort
.
Strings
(
src
.
StdLibImports
)
}
func
(
src
*
Source
)
ExternalImport
(
pkg
string
)
{
src
.
ExternalImports
=
append
(
src
.
ExternalImports
,
pkg
)
sort
.
Strings
(
src
.
ExternalImports
)
}
// ParseFiles parses files listed in fs and extracts all syscall
// functions listed in sys comments. It returns source files
// and functions collection *Source if successful.
func
ParseFiles
(
fs
[]
string
)
(
*
Source
,
error
)
{
src
:=
&
Source
{
Funcs
:
make
([]
*
Fn
,
0
),
Files
:
make
([]
string
,
0
),
StdLibImports
:
[]
string
{
"unsafe"
,
},
ExternalImports
:
make
([]
string
,
0
),
}
for
_
,
file
:=
range
fs
{
if
err
:=
src
.
ParseFile
(
file
);
err
!=
nil
{
return
nil
,
err
}
}
return
src
,
nil
}
// DLLs return dll names for a source set src.
func
(
src
*
Source
)
DLLs
()
[]
string
{
uniq
:=
make
(
map
[
string
]
bool
)
r
:=
make
([]
string
,
0
)
for
_
,
f
:=
range
src
.
Funcs
{
name
:=
f
.
DLLName
()
if
_
,
found
:=
uniq
[
name
];
!
found
{
uniq
[
name
]
=
true
r
=
append
(
r
,
name
)
}
}
return
r
}
// ParseFile adds additional file path to a source set src.
func
(
src
*
Source
)
ParseFile
(
path
string
)
error
{
file
,
err
:=
os
.
Open
(
path
)
if
err
!=
nil
{
return
err
}
defer
file
.
Close
()
s
:=
bufio
.
NewScanner
(
file
)
for
s
.
Scan
()
{
t
:=
trim
(
s
.
Text
())
if
len
(
t
)
<
7
{
continue
}
if
!
strings
.
HasPrefix
(
t
,
"//sys"
)
{
continue
}
t
=
t
[
5
:
]
if
!
(
t
[
0
]
==
' '
||
t
[
0
]
==
'\t'
)
{
continue
}
f
,
err
:=
newFn
(
t
[
1
:
])
if
err
!=
nil
{
return
err
}
src
.
Funcs
=
append
(
src
.
Funcs
,
f
)
}
if
err
:=
s
.
Err
();
err
!=
nil
{
return
err
}
src
.
Files
=
append
(
src
.
Files
,
path
)
// get package name
fset
:=
token
.
NewFileSet
()
_
,
err
=
file
.
Seek
(
0
,
0
)
if
err
!=
nil
{
return
err
}
pkg
,
err
:=
parser
.
ParseFile
(
fset
,
""
,
file
,
parser
.
PackageClauseOnly
)
if
err
!=
nil
{
return
err
}
packageName
=
pkg
.
Name
.
Name
return
nil
}
// IsStdRepo reports whether src is part of standard library.
func
(
src
*
Source
)
IsStdRepo
()
(
bool
,
error
)
{
if
len
(
src
.
Files
)
==
0
{
return
false
,
errors
.
New
(
"no input files provided"
)
}
abspath
,
err
:=
filepath
.
Abs
(
src
.
Files
[
0
])
if
err
!=
nil
{
return
false
,
err
}
goroot
:=
runtime
.
GOROOT
()
if
runtime
.
GOOS
==
"windows"
{
abspath
=
strings
.
ToLower
(
abspath
)
goroot
=
strings
.
ToLower
(
goroot
)
}
sep
:=
string
(
os
.
PathSeparator
)
if
!
strings
.
HasSuffix
(
goroot
,
sep
)
{
goroot
+=
sep
}
return
strings
.
HasPrefix
(
abspath
,
goroot
),
nil
}
// Generate output source file from a source set src.
func
(
src
*
Source
)
Generate
(
w
io
.
Writer
)
error
{
const
(
pkgStd
=
iota
// any package in std library
pkgXSysWindows
// x/sys/windows package
pkgOther
)
isStdRepo
,
err
:=
src
.
IsStdRepo
()
if
err
!=
nil
{
return
err
}
var
pkgtype
int
switch
{
case
isStdRepo
:
pkgtype
=
pkgStd
case
packageName
==
"windows"
:
// TODO: this needs better logic than just using package name
pkgtype
=
pkgXSysWindows
default
:
pkgtype
=
pkgOther
}
if
*
systemDLL
{
switch
pkgtype
{
case
pkgStd
:
src
.
Import
(
"internal/syscall/windows/sysdll"
)
case
pkgXSysWindows
:
default
:
src
.
ExternalImport
(
"golang.org/x/sys/windows"
)
}
}
if
packageName
!=
"syscall"
{
src
.
Import
(
"syscall"
)
}
funcMap
:=
template
.
FuncMap
{
"packagename"
:
packagename
,
"syscalldot"
:
syscalldot
,
"newlazydll"
:
func
(
dll
string
)
string
{
arg
:=
"
\"
"
+
dll
+
".dll
\"
"
if
!*
systemDLL
{
return
syscalldot
()
+
"NewLazyDLL("
+
arg
+
")"
}
switch
pkgtype
{
case
pkgStd
:
return
syscalldot
()
+
"NewLazyDLL(sysdll.Add("
+
arg
+
"))"
case
pkgXSysWindows
:
return
"NewLazySystemDLL("
+
arg
+
")"
default
:
return
"windows.NewLazySystemDLL("
+
arg
+
")"
}
},
}
t
:=
template
.
Must
(
template
.
New
(
"main"
)
.
Funcs
(
funcMap
)
.
Parse
(
srcTemplate
))
err
=
t
.
Execute
(
w
,
src
)
if
err
!=
nil
{
return
errors
.
New
(
"Failed to execute template: "
+
err
.
Error
())
}
return
nil
}
func
usage
()
{
fmt
.
Fprintf
(
os
.
Stderr
,
"usage: mksyscall_windows [flags] [path ...]
\n
"
)
flag
.
PrintDefaults
()
os
.
Exit
(
1
)
}
func
main
()
{
flag
.
Usage
=
usage
flag
.
Parse
()
if
len
(
flag
.
Args
())
<=
0
{
fmt
.
Fprintf
(
os
.
Stderr
,
"no files to parse provided
\n
"
)
usage
()
}
src
,
err
:=
ParseFiles
(
flag
.
Args
())
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
var
buf
bytes
.
Buffer
if
err
:=
src
.
Generate
(
&
buf
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
data
,
err
:=
format
.
Source
(
buf
.
Bytes
())
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
if
*
filename
==
""
{
_
,
err
=
os
.
Stdout
.
Write
(
data
)
}
else
{
err
=
ioutil
.
WriteFile
(
*
filename
,
data
,
0644
)
}
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
// TODO: use println instead to print in the following template
const
srcTemplate
=
`
{{define "main"}}// Code generated by 'go generate'; DO NOT EDIT.
package {{packagename}}
import (
{{range .StdLibImports}}"{{.}}"
{{end}}
{{range .ExternalImports}}"{{.}}"
{{end}}
)
var _ unsafe.Pointer
// Do the interface allocations only once for common
// Errno values.
const (
errnoERROR_IO_PENDING = 997
)
var (
errERROR_IO_PENDING error = {{syscalldot}}Errno(errnoERROR_IO_PENDING)
)
// errnoErr returns common boxed Errno values, to prevent
// allocations at runtime.
func errnoErr(e {{syscalldot}}Errno) error {
switch e {
case 0:
return nil
case errnoERROR_IO_PENDING:
return errERROR_IO_PENDING
}
// TODO: add more here, after collecting data on the common
// error values see on Windows. (perhaps when running
// all.bat?)
return e
}
var (
{{template "dlls" .}}
{{template "funcnames" .}})
{{range .Funcs}}{{if .HasStringParam}}{{template "helperbody" .}}{{end}}{{template "funcbody" .}}{{end}}
{{end}}
{{/* help functions */}}
{{define "dlls"}}{{range .DLLs}} mod{{.}} = {{newlazydll .}}
{{end}}{{end}}
{{define "funcnames"}}{{range .FuncImports}} proc{{.DLLFuncName}} = mod{{.DLLName}}.NewProc("{{.DLLFuncName}}")
{{end}}{{end}}
{{define "helperbody"}}
func {{.Name}}({{.ParamList}}) {{template "results" .}}{
{{template "helpertmpvars" .}} return {{.HelperName}}({{.HelperCallParamList}})
}
{{end}}
{{define "funcbody"}}
func {{.HelperName}}({{.HelperParamList}}) {{template "results" .}}{
{{template "tmpvars" .}} {{template "syscall" .}}
{{template "seterror" .}}{{template "printtrace" .}} return
}
{{end}}
{{define "helpertmpvars"}}{{range .Params}}{{if .TmpVarHelperCode}} {{.TmpVarHelperCode}}
{{end}}{{end}}{{end}}
{{define "tmpvars"}}{{range .Params}}{{if .TmpVarCode}} {{.TmpVarCode}}
{{end}}{{end}}{{end}}
{{define "results"}}{{if .Rets.List}}{{.Rets.List}} {{end}}{{end}}
{{define "syscall"}}{{.Rets.SetReturnValuesCode}}{{.Syscall}}(proc{{.DLLFuncName}}.Addr(), {{.ParamCount}}, {{.SyscallParamList}}){{end}}
{{define "seterror"}}{{if .Rets.SetErrorCode}} {{.Rets.SetErrorCode}}
{{end}}{{end}}
{{define "printtrace"}}{{if .PrintTrace}} print("SYSCALL: {{.Name}}(", {{.ParamPrintList}}") (", {{.Rets.PrintList}}")\n")
{{end}}{{end}}
`
vendor/github.com/Microsoft/hcsshim/mksyscall_windows.go
0 → 100644
View file @
564c1aeb
// Copyright 2013 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
/*
mksyscall_windows generates windows system call bodies
It parses all files specified on command line containing function
prototypes (like syscall_windows.go) and prints system call bodies
to standard output.
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 from it's winapi dll name,
the winapi name could be specified at the end, after "=" sign, like
//sys LoadLibrary(libname string) (handle uint32, err error) = LoadLibraryA
* Each function that returns err needs to supply a condition, that
return value of winapi will be tested against to detect failure.
This would set err to windows "last-error", otherwise it will be nil.
The value can be provided at end of //sys declaration, like
//sys LoadLibrary(libname string) (handle uint32, err error) [failretval==-1] = LoadLibraryA
and is [failretval==0] by default.
Usage:
mksyscall_windows [flags] [path ...]
The flags are:
-output
Specify output file name (outputs to console if blank).
-trace
Generate print statement after every syscall.
*/
package
main
import
(
"bufio"
"bytes"
"errors"
"flag"
"fmt"
"go/format"
"go/parser"
"go/token"
"io"
"io/ioutil"
"log"
"os"
"path/filepath"
"runtime"
"sort"
"strconv"
"strings"
"text/template"
)
var
(
filename
=
flag
.
String
(
"output"
,
""
,
"output file name (standard output if omitted)"
)
printTraceFlag
=
flag
.
Bool
(
"trace"
,
false
,
"generate print statement after every syscall"
)
systemDLL
=
flag
.
Bool
(
"systemdll"
,
true
,
"whether all DLLs should be loaded from the Windows system directory"
)
winio
=
flag
.
Bool
(
"winio"
,
false
,
"import go-winio"
)
)
func
trim
(
s
string
)
string
{
return
strings
.
Trim
(
s
,
"
\t
"
)
}
var
packageName
string
func
packagename
()
string
{
return
packageName
}
func
syscalldot
()
string
{
if
packageName
==
"syscall"
{
return
""
}
return
"syscall."
}
// Param is function parameter
type
Param
struct
{
Name
string
Type
string
fn
*
Fn
tmpVarIdx
int
}
// tmpVar returns temp variable name that will be used to represent p during syscall.
func
(
p
*
Param
)
tmpVar
()
string
{
if
p
.
tmpVarIdx
<
0
{
p
.
tmpVarIdx
=
p
.
fn
.
curTmpVarIdx
p
.
fn
.
curTmpVarIdx
++
}
return
fmt
.
Sprintf
(
"_p%d"
,
p
.
tmpVarIdx
)
}
// BoolTmpVarCode returns source code for bool temp variable.
func
(
p
*
Param
)
BoolTmpVarCode
()
string
{
const
code
=
`var %s uint32
if %s {
%s = 1
} else {
%s = 0
}`
tmp
:=
p
.
tmpVar
()
return
fmt
.
Sprintf
(
code
,
tmp
,
p
.
Name
,
tmp
,
tmp
)
}
// SliceTmpVarCode returns source code for slice temp variable.
func
(
p
*
Param
)
SliceTmpVarCode
()
string
{
const
code
=
`var %s *%s
if len(%s) > 0 {
%s = &%s[0]
}`
tmp
:=
p
.
tmpVar
()
return
fmt
.
Sprintf
(
code
,
tmp
,
p
.
Type
[
2
:
],
p
.
Name
,
tmp
,
p
.
Name
)
}
// StringTmpVarCode returns source code for string temp variable.
func
(
p
*
Param
)
StringTmpVarCode
()
string
{
errvar
:=
p
.
fn
.
Rets
.
ErrorVarName
()
if
errvar
==
""
{
errvar
=
"_"
}
tmp
:=
p
.
tmpVar
()
const
code
=
`var %s %s
%s, %s = %s(%s)`
s
:=
fmt
.
Sprintf
(
code
,
tmp
,
p
.
fn
.
StrconvType
(),
tmp
,
errvar
,
p
.
fn
.
StrconvFunc
(),
p
.
Name
)
if
errvar
==
"-"
{
return
s
}
const
morecode
=
`
if %s != nil {
return
}`
return
s
+
fmt
.
Sprintf
(
morecode
,
errvar
)
}
// TmpVarCode returns source code for temp variable.
func
(
p
*
Param
)
TmpVarCode
()
string
{
switch
{
case
p
.
Type
==
"bool"
:
return
p
.
BoolTmpVarCode
()
case
strings
.
HasPrefix
(
p
.
Type
,
"[]"
)
:
return
p
.
SliceTmpVarCode
()
default
:
return
""
}
}
// TmpVarHelperCode returns source code for helper's temp variable.
func
(
p
*
Param
)
TmpVarHelperCode
()
string
{
if
p
.
Type
!=
"string"
{
return
""
}
return
p
.
StringTmpVarCode
()
}
// SyscallArgList returns source code fragments representing p parameter
// in syscall. Slices are translated into 2 syscall parameters: pointer to
// the first element and length.
func
(
p
*
Param
)
SyscallArgList
()
[]
string
{
t
:=
p
.
HelperType
()
var
s
string
switch
{
case
t
[
0
]
==
'*'
:
s
=
fmt
.
Sprintf
(
"unsafe.Pointer(%s)"
,
p
.
Name
)
case
t
==
"bool"
:
s
=
p
.
tmpVar
()
case
strings
.
HasPrefix
(
t
,
"[]"
)
:
return
[]
string
{
fmt
.
Sprintf
(
"uintptr(unsafe.Pointer(%s))"
,
p
.
tmpVar
()),
fmt
.
Sprintf
(
"uintptr(len(%s))"
,
p
.
Name
),
}
default
:
s
=
p
.
Name
}
return
[]
string
{
fmt
.
Sprintf
(
"uintptr(%s)"
,
s
)}
}
// IsError determines if p parameter is used to return error.
func
(
p
*
Param
)
IsError
()
bool
{
return
p
.
Name
==
"err"
&&
p
.
Type
==
"error"
}
// HelperType returns type of parameter p used in helper function.
func
(
p
*
Param
)
HelperType
()
string
{
if
p
.
Type
==
"string"
{
return
p
.
fn
.
StrconvType
()
}
return
p
.
Type
}
// join concatenates parameters ps into a string with sep separator.
// Each parameter is converted into string by applying fn to it
// before conversion.
func
join
(
ps
[]
*
Param
,
fn
func
(
*
Param
)
string
,
sep
string
)
string
{
if
len
(
ps
)
==
0
{
return
""
}
a
:=
make
([]
string
,
0
)
for
_
,
p
:=
range
ps
{
a
=
append
(
a
,
fn
(
p
))
}
return
strings
.
Join
(
a
,
sep
)
}
// Rets describes function return parameters.
type
Rets
struct
{
Name
string
Type
string
ReturnsError
bool
FailCond
string
}
// ErrorVarName returns error variable name for r.
func
(
r
*
Rets
)
ErrorVarName
()
string
{
if
r
.
ReturnsError
{
return
"err"
}
if
r
.
Type
==
"error"
{
return
r
.
Name
}
return
""
}
// ToParams converts r into slice of *Param.
func
(
r
*
Rets
)
ToParams
()
[]
*
Param
{
ps
:=
make
([]
*
Param
,
0
)
if
len
(
r
.
Name
)
>
0
{
ps
=
append
(
ps
,
&
Param
{
Name
:
r
.
Name
,
Type
:
r
.
Type
})
}
if
r
.
ReturnsError
{
ps
=
append
(
ps
,
&
Param
{
Name
:
"err"
,
Type
:
"error"
})
}
return
ps
}
// List returns source code of syscall return parameters.
func
(
r
*
Rets
)
List
()
string
{
s
:=
join
(
r
.
ToParams
(),
func
(
p
*
Param
)
string
{
return
p
.
Name
+
" "
+
p
.
Type
},
", "
)
if
len
(
s
)
>
0
{
s
=
"("
+
s
+
")"
}
return
s
}
// PrintList returns source code of trace printing part correspondent
// to syscall return values.
func
(
r
*
Rets
)
PrintList
()
string
{
return
join
(
r
.
ToParams
(),
func
(
p
*
Param
)
string
{
return
fmt
.
Sprintf
(
`"%s=", %s, `
,
p
.
Name
,
p
.
Name
)
},
`", ", `
)
}
// SetReturnValuesCode returns source code that accepts syscall return values.
func
(
r
*
Rets
)
SetReturnValuesCode
()
string
{
if
r
.
Name
==
""
&&
!
r
.
ReturnsError
{
return
""
}
retvar
:=
"r0"
if
r
.
Name
==
""
{
retvar
=
"r1"
}
errvar
:=
"_"
if
r
.
ReturnsError
{
errvar
=
"e1"
}
return
fmt
.
Sprintf
(
"%s, _, %s := "
,
retvar
,
errvar
)
}
func
(
r
*
Rets
)
useLongHandleErrorCode
(
retvar
string
)
string
{
const
code
=
`if %s {
if e1 != 0 {
err = errnoErr(e1)
} else {
err = %sEINVAL
}
}`
cond
:=
retvar
+
" == 0"
if
r
.
FailCond
!=
""
{
cond
=
strings
.
Replace
(
r
.
FailCond
,
"failretval"
,
retvar
,
1
)
}
return
fmt
.
Sprintf
(
code
,
cond
,
syscalldot
())
}
// SetErrorCode returns source code that sets return parameters.
func
(
r
*
Rets
)
SetErrorCode
()
string
{
const
code
=
`if r0 != 0 {
%s = %sErrno(r0)
}`
const
hrCode
=
`if int32(r0) < 0 {
if r0&0x1fff0000 == 0x00070000 {
r0 &= 0xffff
}
%s = %sErrno(r0)
}`
if
r
.
Name
==
""
&&
!
r
.
ReturnsError
{
return
""
}
if
r
.
Name
==
""
{
return
r
.
useLongHandleErrorCode
(
"r1"
)
}
if
r
.
Type
==
"error"
{
if
r
.
Name
==
"hr"
{
return
fmt
.
Sprintf
(
hrCode
,
r
.
Name
,
syscalldot
())
}
else
{
return
fmt
.
Sprintf
(
code
,
r
.
Name
,
syscalldot
())
}
}
s
:=
""
switch
{
case
r
.
Type
[
0
]
==
'*'
:
s
=
fmt
.
Sprintf
(
"%s = (%s)(unsafe.Pointer(r0))"
,
r
.
Name
,
r
.
Type
)
case
r
.
Type
==
"bool"
:
s
=
fmt
.
Sprintf
(
"%s = r0 != 0"
,
r
.
Name
)
default
:
s
=
fmt
.
Sprintf
(
"%s = %s(r0)"
,
r
.
Name
,
r
.
Type
)
}
if
!
r
.
ReturnsError
{
return
s
}
return
s
+
"
\n\t
"
+
r
.
useLongHandleErrorCode
(
r
.
Name
)
}
// Fn describes syscall function.
type
Fn
struct
{
Name
string
Params
[]
*
Param
Rets
*
Rets
PrintTrace
bool
confirmproc
bool
dllname
string
dllfuncname
string
src
string
// TODO: get rid of this field and just use parameter index instead
curTmpVarIdx
int
// insure tmp variables have uniq names
}
// extractParams parses s to extract function parameters.
func
extractParams
(
s
string
,
f
*
Fn
)
([]
*
Param
,
error
)
{
s
=
trim
(
s
)
if
s
==
""
{
return
nil
,
nil
}
a
:=
strings
.
Split
(
s
,
","
)
ps
:=
make
([]
*
Param
,
len
(
a
))
for
i
:=
range
ps
{
s2
:=
trim
(
a
[
i
])
b
:=
strings
.
Split
(
s2
,
" "
)
if
len
(
b
)
!=
2
{
b
=
strings
.
Split
(
s2
,
"
\t
"
)
if
len
(
b
)
!=
2
{
return
nil
,
errors
.
New
(
"Could not extract function parameter from
\"
"
+
s2
+
"
\"
"
)
}
}
ps
[
i
]
=
&
Param
{
Name
:
trim
(
b
[
0
]),
Type
:
trim
(
b
[
1
]),
fn
:
f
,
tmpVarIdx
:
-
1
,
}
}
return
ps
,
nil
}
// extractSection extracts text out of string s starting after start
// and ending just before end. found return value will indicate success,
// and prefix, body and suffix will contain correspondent parts of string s.
func
extractSection
(
s
string
,
start
,
end
rune
)
(
prefix
,
body
,
suffix
string
,
found
bool
)
{
s
=
trim
(
s
)
if
strings
.
HasPrefix
(
s
,
string
(
start
))
{
// no prefix
body
=
s
[
1
:
]
}
else
{
a
:=
strings
.
SplitN
(
s
,
string
(
start
),
2
)
if
len
(
a
)
!=
2
{
return
""
,
""
,
s
,
false
}
prefix
=
a
[
0
]
body
=
a
[
1
]
}
a
:=
strings
.
SplitN
(
body
,
string
(
end
),
2
)
if
len
(
a
)
!=
2
{
return
""
,
""
,
""
,
false
}
return
prefix
,
a
[
0
],
a
[
1
],
true
}
// newFn parses string s and return created function Fn.
func
newFn
(
s
string
)
(
*
Fn
,
error
)
{
s
=
trim
(
s
)
f
:=
&
Fn
{
Rets
:
&
Rets
{},
src
:
s
,
PrintTrace
:
*
printTraceFlag
,
}
// function name and args
prefix
,
body
,
s
,
found
:=
extractSection
(
s
,
'('
,
')'
)
if
!
found
||
prefix
==
""
{
return
nil
,
errors
.
New
(
"Could not extract function name and parameters from
\"
"
+
f
.
src
+
"
\"
"
)
}
f
.
Name
=
prefix
var
err
error
f
.
Params
,
err
=
extractParams
(
body
,
f
)
if
err
!=
nil
{
return
nil
,
err
}
// return values
_
,
body
,
s
,
found
=
extractSection
(
s
,
'('
,
')'
)
if
found
{
r
,
err
:=
extractParams
(
body
,
f
)
if
err
!=
nil
{
return
nil
,
err
}
switch
len
(
r
)
{
case
0
:
case
1
:
if
r
[
0
]
.
IsError
()
{
f
.
Rets
.
ReturnsError
=
true
}
else
{
f
.
Rets
.
Name
=
r
[
0
]
.
Name
f
.
Rets
.
Type
=
r
[
0
]
.
Type
}
case
2
:
if
!
r
[
1
]
.
IsError
()
{
return
nil
,
errors
.
New
(
"Only last windows error is allowed as second return value in
\"
"
+
f
.
src
+
"
\"
"
)
}
f
.
Rets
.
ReturnsError
=
true
f
.
Rets
.
Name
=
r
[
0
]
.
Name
f
.
Rets
.
Type
=
r
[
0
]
.
Type
default
:
return
nil
,
errors
.
New
(
"Too many return values in
\"
"
+
f
.
src
+
"
\"
"
)
}
}
// fail condition
_
,
body
,
s
,
found
=
extractSection
(
s
,
'['
,
']'
)
if
found
{
f
.
Rets
.
FailCond
=
body
}
// dll and dll function names
s
=
trim
(
s
)
if
s
==
""
{
return
f
,
nil
}
if
!
strings
.
HasPrefix
(
s
,
"="
)
{
return
nil
,
errors
.
New
(
"Could not extract dll name from
\"
"
+
f
.
src
+
"
\"
"
)
}
s
=
trim
(
s
[
1
:
])
a
:=
strings
.
Split
(
s
,
"."
)
switch
len
(
a
)
{
case
1
:
f
.
dllfuncname
=
a
[
0
]
case
2
:
f
.
dllname
=
a
[
0
]
f
.
dllfuncname
=
a
[
1
]
default
:
return
nil
,
errors
.
New
(
"Could not extract dll name from
\"
"
+
f
.
src
+
"
\"
"
)
}
if
f
.
dllfuncname
[
len
(
f
.
dllfuncname
)
-
1
]
==
'?'
{
f
.
confirmproc
=
true
f
.
dllfuncname
=
f
.
dllfuncname
[
0
:
len
(
f
.
dllfuncname
)
-
1
]
}
return
f
,
nil
}
// DLLName returns DLL name for function f.
func
(
f
*
Fn
)
DLLName
()
string
{
if
f
.
dllname
==
""
{
return
"kernel32"
}
return
f
.
dllname
}
// DLLName returns DLL function name for function f.
func
(
f
*
Fn
)
DLLFuncName
()
string
{
if
f
.
dllfuncname
==
""
{
return
f
.
Name
}
return
f
.
dllfuncname
}
func
(
f
*
Fn
)
ConfirmProc
()
bool
{
return
f
.
confirmproc
}
// ParamList returns source code for function f parameters.
func
(
f
*
Fn
)
ParamList
()
string
{
return
join
(
f
.
Params
,
func
(
p
*
Param
)
string
{
return
p
.
Name
+
" "
+
p
.
Type
},
", "
)
}
// HelperParamList returns source code for helper function f parameters.
func
(
f
*
Fn
)
HelperParamList
()
string
{
return
join
(
f
.
Params
,
func
(
p
*
Param
)
string
{
return
p
.
Name
+
" "
+
p
.
HelperType
()
},
", "
)
}
// ParamPrintList returns source code of trace printing part correspondent
// to syscall input parameters.
func
(
f
*
Fn
)
ParamPrintList
()
string
{
return
join
(
f
.
Params
,
func
(
p
*
Param
)
string
{
return
fmt
.
Sprintf
(
`"%s=", %s, `
,
p
.
Name
,
p
.
Name
)
},
`", ", `
)
}
// ParamCount return number of syscall parameters for function f.
func
(
f
*
Fn
)
ParamCount
()
int
{
n
:=
0
for
_
,
p
:=
range
f
.
Params
{
n
+=
len
(
p
.
SyscallArgList
())
}
return
n
}
// SyscallParamCount determines which version of Syscall/Syscall6/Syscall9/...
// to use. It returns parameter count for correspondent SyscallX function.
func
(
f
*
Fn
)
SyscallParamCount
()
int
{
n
:=
f
.
ParamCount
()
switch
{
case
n
<=
3
:
return
3
case
n
<=
6
:
return
6
case
n
<=
9
:
return
9
case
n
<=
12
:
return
12
case
n
<=
15
:
return
15
default
:
panic
(
"too many arguments to system call"
)
}
}
// Syscall determines which SyscallX function to use for function f.
func
(
f
*
Fn
)
Syscall
()
string
{
c
:=
f
.
SyscallParamCount
()
if
c
==
3
{
return
syscalldot
()
+
"Syscall"
}
return
syscalldot
()
+
"Syscall"
+
strconv
.
Itoa
(
c
)
}
// SyscallParamList returns source code for SyscallX parameters for function f.
func
(
f
*
Fn
)
SyscallParamList
()
string
{
a
:=
make
([]
string
,
0
)
for
_
,
p
:=
range
f
.
Params
{
a
=
append
(
a
,
p
.
SyscallArgList
()
...
)
}
for
len
(
a
)
<
f
.
SyscallParamCount
()
{
a
=
append
(
a
,
"0"
)
}
return
strings
.
Join
(
a
,
", "
)
}
// HelperCallParamList returns source code of call into function f helper.
func
(
f
*
Fn
)
HelperCallParamList
()
string
{
a
:=
make
([]
string
,
0
,
len
(
f
.
Params
))
for
_
,
p
:=
range
f
.
Params
{
s
:=
p
.
Name
if
p
.
Type
==
"string"
{
s
=
p
.
tmpVar
()
}
a
=
append
(
a
,
s
)
}
return
strings
.
Join
(
a
,
", "
)
}
// IsUTF16 is true, if f is W (utf16) function. It is false
// for all A (ascii) functions.
func
(
_
*
Fn
)
IsUTF16
()
bool
{
return
true
}
// StrconvFunc returns name of Go string to OS string function for f.
func
(
f
*
Fn
)
StrconvFunc
()
string
{
if
f
.
IsUTF16
()
{
return
syscalldot
()
+
"UTF16PtrFromString"
}
return
syscalldot
()
+
"BytePtrFromString"
}
// StrconvType returns Go type name used for OS string for f.
func
(
f
*
Fn
)
StrconvType
()
string
{
if
f
.
IsUTF16
()
{
return
"*uint16"
}
return
"*byte"
}
// HasStringParam is true, if f has at least one string parameter.
// Otherwise it is false.
func
(
f
*
Fn
)
HasStringParam
()
bool
{
for
_
,
p
:=
range
f
.
Params
{
if
p
.
Type
==
"string"
{
return
true
}
}
return
false
}
var
uniqDllFuncName
=
make
(
map
[
string
]
bool
)
// IsNotDuplicate is true if f is not a duplicated function
func
(
f
*
Fn
)
IsNotDuplicate
()
bool
{
funcName
:=
f
.
DLLFuncName
()
if
uniqDllFuncName
[
funcName
]
==
false
{
uniqDllFuncName
[
funcName
]
=
true
return
true
}
return
false
}
// HelperName returns name of function f helper.
func
(
f
*
Fn
)
HelperName
()
string
{
if
!
f
.
HasStringParam
()
{
return
f
.
Name
}
return
"_"
+
f
.
Name
}
// Source files and functions.
type
Source
struct
{
Funcs
[]
*
Fn
Files
[]
string
StdLibImports
[]
string
ExternalImports
[]
string
}
func
(
src
*
Source
)
Import
(
pkg
string
)
{
src
.
StdLibImports
=
append
(
src
.
StdLibImports
,
pkg
)
sort
.
Strings
(
src
.
StdLibImports
)
}
func
(
src
*
Source
)
ExternalImport
(
pkg
string
)
{
src
.
ExternalImports
=
append
(
src
.
ExternalImports
,
pkg
)
sort
.
Strings
(
src
.
ExternalImports
)
}
// ParseFiles parses files listed in fs and extracts all syscall
// functions listed in sys comments. It returns source files
// and functions collection *Source if successful.
func
ParseFiles
(
fs
[]
string
)
(
*
Source
,
error
)
{
src
:=
&
Source
{
Funcs
:
make
([]
*
Fn
,
0
),
Files
:
make
([]
string
,
0
),
StdLibImports
:
[]
string
{
"unsafe"
,
},
ExternalImports
:
make
([]
string
,
0
),
}
for
_
,
file
:=
range
fs
{
if
err
:=
src
.
ParseFile
(
file
);
err
!=
nil
{
return
nil
,
err
}
}
return
src
,
nil
}
// DLLs return dll names for a source set src.
func
(
src
*
Source
)
DLLs
()
[]
string
{
uniq
:=
make
(
map
[
string
]
bool
)
r
:=
make
([]
string
,
0
)
for
_
,
f
:=
range
src
.
Funcs
{
name
:=
f
.
DLLName
()
if
_
,
found
:=
uniq
[
name
];
!
found
{
uniq
[
name
]
=
true
r
=
append
(
r
,
name
)
}
}
return
r
}
// ParseFile adds additional file path to a source set src.
func
(
src
*
Source
)
ParseFile
(
path
string
)
error
{
file
,
err
:=
os
.
Open
(
path
)
if
err
!=
nil
{
return
err
}
defer
file
.
Close
()
s
:=
bufio
.
NewScanner
(
file
)
for
s
.
Scan
()
{
t
:=
trim
(
s
.
Text
())
if
len
(
t
)
<
7
{
continue
}
if
!
strings
.
HasPrefix
(
t
,
"//sys"
)
{
continue
}
t
=
t
[
5
:
]
if
!
(
t
[
0
]
==
' '
||
t
[
0
]
==
'\t'
)
{
continue
}
f
,
err
:=
newFn
(
t
[
1
:
])
if
err
!=
nil
{
return
err
}
src
.
Funcs
=
append
(
src
.
Funcs
,
f
)
}
if
err
:=
s
.
Err
();
err
!=
nil
{
return
err
}
src
.
Files
=
append
(
src
.
Files
,
path
)
// get package name
fset
:=
token
.
NewFileSet
()
_
,
err
=
file
.
Seek
(
0
,
0
)
if
err
!=
nil
{
return
err
}
pkg
,
err
:=
parser
.
ParseFile
(
fset
,
""
,
file
,
parser
.
PackageClauseOnly
)
if
err
!=
nil
{
return
err
}
packageName
=
pkg
.
Name
.
Name
return
nil
}
// IsStdRepo returns true if src is part of standard library.
func
(
src
*
Source
)
IsStdRepo
()
(
bool
,
error
)
{
if
len
(
src
.
Files
)
==
0
{
return
false
,
errors
.
New
(
"no input files provided"
)
}
abspath
,
err
:=
filepath
.
Abs
(
src
.
Files
[
0
])
if
err
!=
nil
{
return
false
,
err
}
goroot
:=
runtime
.
GOROOT
()
if
runtime
.
GOOS
==
"windows"
{
abspath
=
strings
.
ToLower
(
abspath
)
goroot
=
strings
.
ToLower
(
goroot
)
}
sep
:=
string
(
os
.
PathSeparator
)
if
!
strings
.
HasSuffix
(
goroot
,
sep
)
{
goroot
+=
sep
}
return
strings
.
HasPrefix
(
abspath
,
goroot
),
nil
}
// Generate output source file from a source set src.
func
(
src
*
Source
)
Generate
(
w
io
.
Writer
)
error
{
const
(
pkgStd
=
iota
// any package in std library
pkgXSysWindows
// x/sys/windows package
pkgOther
)
isStdRepo
,
err
:=
src
.
IsStdRepo
()
if
err
!=
nil
{
return
err
}
var
pkgtype
int
switch
{
case
isStdRepo
:
pkgtype
=
pkgStd
case
packageName
==
"windows"
:
// TODO: this needs better logic than just using package name
pkgtype
=
pkgXSysWindows
default
:
pkgtype
=
pkgOther
}
if
*
systemDLL
{
switch
pkgtype
{
case
pkgStd
:
src
.
Import
(
"internal/syscall/windows/sysdll"
)
case
pkgXSysWindows
:
default
:
src
.
ExternalImport
(
"golang.org/x/sys/windows"
)
}
}
if
*
winio
{
src
.
ExternalImport
(
"github.com/Microsoft/go-winio"
)
}
if
packageName
!=
"syscall"
{
src
.
Import
(
"syscall"
)
}
funcMap
:=
template
.
FuncMap
{
"packagename"
:
packagename
,
"syscalldot"
:
syscalldot
,
"newlazydll"
:
func
(
dll
string
)
string
{
arg
:=
"
\"
"
+
dll
+
".dll
\"
"
if
!*
systemDLL
{
return
syscalldot
()
+
"NewLazyDLL("
+
arg
+
")"
}
if
strings
.
HasPrefix
(
dll
,
"api_"
)
||
strings
.
HasPrefix
(
dll
,
"ext_"
)
{
arg
=
strings
.
Replace
(
arg
,
"_"
,
"-"
,
-
1
)
}
switch
pkgtype
{
case
pkgStd
:
return
syscalldot
()
+
"NewLazyDLL(sysdll.Add("
+
arg
+
"))"
case
pkgXSysWindows
:
return
"NewLazySystemDLL("
+
arg
+
")"
default
:
return
"windows.NewLazySystemDLL("
+
arg
+
")"
}
},
}
t
:=
template
.
Must
(
template
.
New
(
"main"
)
.
Funcs
(
funcMap
)
.
Parse
(
srcTemplate
))
err
=
t
.
Execute
(
w
,
src
)
if
err
!=
nil
{
return
errors
.
New
(
"Failed to execute template: "
+
err
.
Error
())
}
return
nil
}
func
usage
()
{
fmt
.
Fprintf
(
os
.
Stderr
,
"usage: mksyscall_windows [flags] [path ...]
\n
"
)
flag
.
PrintDefaults
()
os
.
Exit
(
1
)
}
func
main
()
{
flag
.
Usage
=
usage
flag
.
Parse
()
if
len
(
flag
.
Args
())
<=
0
{
fmt
.
Fprintf
(
os
.
Stderr
,
"no files to parse provided
\n
"
)
usage
()
}
src
,
err
:=
ParseFiles
(
flag
.
Args
())
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
var
buf
bytes
.
Buffer
if
err
:=
src
.
Generate
(
&
buf
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
data
,
err
:=
format
.
Source
(
buf
.
Bytes
())
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
if
*
filename
==
""
{
_
,
err
=
os
.
Stdout
.
Write
(
data
)
}
else
{
err
=
ioutil
.
WriteFile
(
*
filename
,
data
,
0644
)
}
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
// TODO: use println instead to print in the following template
const
srcTemplate
=
`
{{define "main"}}// Code generated mksyscall_windows.exe DO NOT EDIT
package {{packagename}}
import (
{{range .StdLibImports}}"{{.}}"
{{end}}
{{range .ExternalImports}}"{{.}}"
{{end}}
)
var _ unsafe.Pointer
// Do the interface allocations only once for common
// Errno values.
const (
errnoERROR_IO_PENDING = 997
)
var (
errERROR_IO_PENDING error = {{syscalldot}}Errno(errnoERROR_IO_PENDING)
)
// errnoErr returns common boxed Errno values, to prevent
// allocations at runtime.
func errnoErr(e {{syscalldot}}Errno) error {
switch e {
case 0:
return nil
case errnoERROR_IO_PENDING:
return errERROR_IO_PENDING
}
// TODO: add more here, after collecting data on the common
// error values see on Windows. (perhaps when running
// all.bat?)
return e
}
var (
{{template "dlls" .}}
{{template "funcnames" .}})
{{range .Funcs}}{{if .HasStringParam}}{{template "helperbody" .}}{{end}}{{template "funcbody" .}}{{end}}
{{end}}
{{/* help functions */}}
{{define "dlls"}}{{range .DLLs}} mod{{.}} = {{newlazydll .}}
{{end}}{{end}}
{{define "funcnames"}}{{range .Funcs}}{{if .IsNotDuplicate}} proc{{.DLLFuncName}} = mod{{.DLLName}}.NewProc("{{.DLLFuncName}}"){{end}}
{{end}}{{end}}
{{define "helperbody"}}
func {{.Name}}({{.ParamList}}) {{template "results" .}}{
{{template "helpertmpvars" .}} return {{.HelperName}}({{.HelperCallParamList}})
}
{{end}}
{{define "funcbody"}}
func {{.HelperName}}({{.HelperParamList}}) {{template "results" .}}{
{{template "tmpvars" .}} {{template "syscallcheck" .}}{{template "syscall" .}}
{{template "seterror" .}}{{template "printtrace" .}} return
}
{{end}}
{{define "helpertmpvars"}}{{range .Params}}{{if .TmpVarHelperCode}} {{.TmpVarHelperCode}}
{{end}}{{end}}{{end}}
{{define "tmpvars"}}{{range .Params}}{{if .TmpVarCode}} {{.TmpVarCode}}
{{end}}{{end}}{{end}}
{{define "results"}}{{if .Rets.List}}{{.Rets.List}} {{end}}{{end}}
{{define "syscall"}}{{.Rets.SetReturnValuesCode}}{{.Syscall}}(proc{{.DLLFuncName}}.Addr(), {{.ParamCount}}, {{.SyscallParamList}}){{end}}
{{define "syscallcheck"}}{{if .ConfirmProc}}if {{.Rets.ErrorVarName}} = proc{{.DLLFuncName}}.Find(); {{.Rets.ErrorVarName}} != nil {
return
}
{{end}}{{end}}
{{define "seterror"}}{{if .Rets.SetErrorCode}} {{.Rets.SetErrorCode}}
{{end}}{{end}}
{{define "printtrace"}}{{if .PrintTrace}} print("SYSCALL: {{.Name}}(", {{.ParamPrintList}}") (", {{.Rets.PrintList}}")\n")
{{end}}{{end}}
`
vendor/github.com/chai2010/gettext-go/gettext/hello.go
0 → 100644
View file @
564c1aeb
// Copyright 2013 <chaishushan{AT}gmail.com>. 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
(
"fmt"
"github.com/chai2010/gettext-go"
)
func
main
()
{
gettext
.
SetLocale
(
"zh_CN"
)
gettext
.
BindTextdomain
(
"hello"
,
"../examples/local"
,
nil
)
gettext
.
Textdomain
(
"hello"
)
fmt
.
Println
(
gettext
.
Gettext
(
"Hello, world!"
))
// Output: 你好, 世界!
}
vendor/github.com/containerd/containerd/.appveyor.yml
View file @
564c1aeb
...
@@ -12,7 +12,7 @@ environment:
...
@@ -12,7 +12,7 @@ environment:
GOPATH
:
C:\gopath
GOPATH
:
C:\gopath
CGO_ENABLED
:
1
CGO_ENABLED
:
1
matrix
:
matrix
:
-
GO_VERSION
:
1.12.1
0
-
GO_VERSION
:
1.12.1
2
before_build
:
before_build
:
-
choco install -y mingw --version 5.3.0
-
choco install -y mingw --version 5.3.0
...
...
vendor/github.com/containerd/containerd/.travis.yml
View file @
564c1aeb
...
@@ -10,7 +10,7 @@ os:
...
@@ -10,7 +10,7 @@ os:
-
linux
-
linux
go
:
go
:
-
"
1.12.
x
"
-
"
1.12.
12
"
env
:
env
:
-
TRAVIS_GOOS=linux TEST_RUNTIME=io.containerd.runc.v1 TRAVIS_CGO_ENABLED=1 TRAVIS_DISTRO=bionic
-
TRAVIS_GOOS=linux TEST_RUNTIME=io.containerd.runc.v1 TRAVIS_CGO_ENABLED=1 TRAVIS_DISTRO=bionic
...
...
vendor/github.com/containerd/containerd/diff/apply/apply_linux.go
View file @
564c1aeb
...
@@ -26,12 +26,18 @@ import (
...
@@ -26,12 +26,18 @@ import (
"github.com/containerd/containerd/archive"
"github.com/containerd/containerd/archive"
"github.com/containerd/containerd/errdefs"
"github.com/containerd/containerd/errdefs"
"github.com/containerd/containerd/mount"
"github.com/containerd/containerd/mount"
"github.com/opencontainers/runc/libcontainer/system"
"github.com/pkg/errors"
"github.com/pkg/errors"
)
)
func
apply
(
ctx
context
.
Context
,
mounts
[]
mount
.
Mount
,
r
io
.
Reader
)
error
{
func
apply
(
ctx
context
.
Context
,
mounts
[]
mount
.
Mount
,
r
io
.
Reader
)
error
{
switch
{
switch
{
case
len
(
mounts
)
==
1
&&
mounts
[
0
]
.
Type
==
"overlay"
:
case
len
(
mounts
)
==
1
&&
mounts
[
0
]
.
Type
==
"overlay"
:
// OverlayConvertWhiteout (mknod c 0 0) doesn't work in userns.
// https://github.com/containerd/containerd/issues/3762
if
system
.
RunningInUserNS
()
{
break
}
path
,
parents
,
err
:=
getOverlayPath
(
mounts
[
0
]
.
Options
)
path
,
parents
,
err
:=
getOverlayPath
(
mounts
[
0
]
.
Options
)
if
err
!=
nil
{
if
err
!=
nil
{
if
errdefs
.
IsInvalidArgument
(
err
)
{
if
errdefs
.
IsInvalidArgument
(
err
)
{
...
...
vendor/github.com/containerd/continuity/manifest_test_darwin.go
0 → 100644
View file @
564c1aeb
// +build ignore
/*
Copyright The containerd Authors.
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.
*/
package
continuity
import
"os"
var
(
devNullResource
=
resource
{
kind
:
chardev
,
path
:
"/dev/null"
,
major
:
3
,
minor
:
2
,
mode
:
0666
|
os
.
ModeDevice
|
os
.
ModeCharDevice
,
}
devZeroResource
=
resource
{
kind
:
chardev
,
path
:
"/dev/zero"
,
major
:
3
,
minor
:
3
,
mode
:
0666
|
os
.
ModeDevice
|
os
.
ModeCharDevice
,
}
)
vendor/github.com/globalsign/mgo/bson/bson_corpus_spec_test_generator.go
0 → 100644
View file @
564c1aeb
// +build ignore
package
main
import
(
"bytes"
"fmt"
"go/format"
"html/template"
"io/ioutil"
"log"
"path/filepath"
"strings"
"github.com/globalsign/mgo/internal/json"
)
func
main
()
{
log
.
SetFlags
(
0
)
log
.
SetPrefix
(
name
+
": "
)
var
g
Generator
fmt
.
Fprintf
(
&
g
,
"// Code generated by
\"
%s.go
\"
; DO NOT EDIT
\n\n
"
,
name
)
src
:=
g
.
generate
()
err
:=
ioutil
.
WriteFile
(
fmt
.
Sprintf
(
"%s.go"
,
strings
.
TrimSuffix
(
name
,
"_generator"
)),
src
,
0644
)
if
err
!=
nil
{
log
.
Fatalf
(
"writing output: %s"
,
err
)
}
}
// Generator holds the state of the analysis. Primarily used to buffer
// the output for format.Source.
type
Generator
struct
{
bytes
.
Buffer
// Accumulated output.
}
// format returns the gofmt-ed contents of the Generator's buffer.
func
(
g
*
Generator
)
format
()
[]
byte
{
src
,
err
:=
format
.
Source
(
g
.
Bytes
())
if
err
!=
nil
{
// Should never happen, but can arise when developing this code.
// The user can compile the output to see the error.
log
.
Printf
(
"warning: internal error: invalid Go generated: %s"
,
err
)
log
.
Printf
(
"warning: compile the package to analyze the error"
)
return
g
.
Bytes
()
}
return
src
}
// EVERYTHING ABOVE IS CONSTANT BETWEEN THE GENERATORS
const
name
=
"bson_corpus_spec_test_generator"
func
(
g
*
Generator
)
generate
()
[]
byte
{
testFiles
,
err
:=
filepath
.
Glob
(
"./specdata/specifications/source/bson-corpus/tests/*.json"
)
if
err
!=
nil
{
log
.
Fatalf
(
"error reading bson-corpus files: %s"
,
err
)
}
tests
,
err
:=
g
.
loadTests
(
testFiles
)
if
err
!=
nil
{
log
.
Fatalf
(
"error loading tests: %s"
,
err
)
}
tmpl
,
err
:=
g
.
getTemplate
()
if
err
!=
nil
{
log
.
Fatalf
(
"error loading template: %s"
,
err
)
}
tmpl
.
Execute
(
&
g
.
Buffer
,
tests
)
return
g
.
format
()
}
func
(
g
*
Generator
)
loadTests
(
filenames
[]
string
)
([]
*
testDef
,
error
)
{
var
tests
[]
*
testDef
for
_
,
filename
:=
range
filenames
{
test
,
err
:=
g
.
loadTest
(
filename
)
if
err
!=
nil
{
return
nil
,
err
}
tests
=
append
(
tests
,
test
)
}
return
tests
,
nil
}
func
(
g
*
Generator
)
loadTest
(
filename
string
)
(
*
testDef
,
error
)
{
content
,
err
:=
ioutil
.
ReadFile
(
filename
)
if
err
!=
nil
{
return
nil
,
err
}
var
testDef
testDef
err
=
json
.
Unmarshal
(
content
,
&
testDef
)
if
err
!=
nil
{
return
nil
,
err
}
names
:=
make
(
map
[
string
]
struct
{})
for
i
:=
len
(
testDef
.
Valid
)
-
1
;
i
>=
0
;
i
--
{
if
testDef
.
BsonType
==
"0x05"
&&
testDef
.
Valid
[
i
]
.
Description
==
"subtype 0x02"
{
testDef
.
Valid
=
append
(
testDef
.
Valid
[
:
i
],
testDef
.
Valid
[
i
+
1
:
]
...
)
continue
}
name
:=
cleanupFuncName
(
testDef
.
Description
+
"_"
+
testDef
.
Valid
[
i
]
.
Description
)
nameIdx
:=
name
j
:=
1
for
{
if
_
,
ok
:=
names
[
nameIdx
];
!
ok
{
break
}
nameIdx
=
fmt
.
Sprintf
(
"%s_%d"
,
name
,
j
)
}
names
[
nameIdx
]
=
struct
{}{}
testDef
.
Valid
[
i
]
.
TestDef
=
&
testDef
testDef
.
Valid
[
i
]
.
Name
=
nameIdx
testDef
.
Valid
[
i
]
.
StructTest
=
testDef
.
TestKey
!=
""
&&
(
testDef
.
BsonType
!=
"0x05"
||
strings
.
Contains
(
testDef
.
Valid
[
i
]
.
Description
,
"0x00"
))
&&
!
testDef
.
Deprecated
}
for
i
:=
len
(
testDef
.
DecodeErrors
)
-
1
;
i
>=
0
;
i
--
{
if
strings
.
Contains
(
testDef
.
DecodeErrors
[
i
]
.
Description
,
"UTF-8"
)
{
testDef
.
DecodeErrors
=
append
(
testDef
.
DecodeErrors
[
:
i
],
testDef
.
DecodeErrors
[
i
+
1
:
]
...
)
continue
}
name
:=
cleanupFuncName
(
testDef
.
Description
+
"_"
+
testDef
.
DecodeErrors
[
i
]
.
Description
)
nameIdx
:=
name
j
:=
1
for
{
if
_
,
ok
:=
names
[
nameIdx
];
!
ok
{
break
}
nameIdx
=
fmt
.
Sprintf
(
"%s_%d"
,
name
,
j
)
}
names
[
nameIdx
]
=
struct
{}{}
testDef
.
DecodeErrors
[
i
]
.
Name
=
nameIdx
}
return
&
testDef
,
nil
}
func
(
g
*
Generator
)
getTemplate
()
(
*
template
.
Template
,
error
)
{
content
:=
`package bson_test
import (
"encoding/hex"
"time"
. "gopkg.in/check.v1"
"github.com/globalsign/mgo/bson"
)
func testValid(c *C, in []byte, expected []byte, result interface{}) {
err := bson.Unmarshal(in, result)
c.Assert(err, IsNil)
out, err := bson.Marshal(result)
c.Assert(err, IsNil)
c.Assert(string(expected), Equals, string(out), Commentf("roundtrip failed for %T, expected '%x' but got '%x'", result, expected, out))
}
func testDecodeSkip(c *C, in []byte) {
err := bson.Unmarshal(in, &struct{}{})
c.Assert(err, IsNil)
}
func testDecodeError(c *C, in []byte, result interface{}) {
err := bson.Unmarshal(in, result)
c.Assert(err, Not(IsNil))
}
{{range .}}
{{range .Valid}}
func (s *S) Test{{.Name}}(c *C) {
b, err := hex.DecodeString("{{.Bson}}")
c.Assert(err, IsNil)
{{if .CanonicalBson}}
cb, err := hex.DecodeString("{{.CanonicalBson}}")
c.Assert(err, IsNil)
{{else}}
cb := b
{{end}}
var resultD bson.D
testValid(c, b, cb, &resultD)
{{if .StructTest}}var resultS struct {
Element {{.TestDef.GoType}} `
+
"`bson:
\"
{{.TestDef.TestKey}}
\"
`"
+
`
}
testValid(c, b, cb, &resultS){{end}}
testDecodeSkip(c, b)
}
{{end}}
{{range .DecodeErrors}}
func (s *S) Test{{.Name}}(c *C) {
b, err := hex.DecodeString("{{.Bson}}")
c.Assert(err, IsNil)
var resultD bson.D
testDecodeError(c, b, &resultD)
}
{{end}}
{{end}}
`
tmpl
,
err
:=
template
.
New
(
""
)
.
Parse
(
content
)
if
err
!=
nil
{
return
nil
,
err
}
return
tmpl
,
nil
}
func
cleanupFuncName
(
name
string
)
string
{
return
strings
.
Map
(
func
(
r
rune
)
rune
{
if
(
r
>=
48
&&
r
<=
57
)
||
(
r
>=
65
&&
r
<=
90
)
||
(
r
>=
97
&&
r
<=
122
)
{
return
r
}
return
'_'
},
name
)
}
type
testDef
struct
{
Description
string
`json:"description"`
BsonType
string
`json:"bson_type"`
TestKey
string
`json:"test_key"`
Valid
[]
*
valid
`json:"valid"`
DecodeErrors
[]
*
decodeError
`json:"decodeErrors"`
Deprecated
bool
`json:"deprecated"`
}
func
(
t
*
testDef
)
GoType
()
string
{
switch
t
.
BsonType
{
case
"0x01"
:
return
"float64"
case
"0x02"
:
return
"string"
case
"0x03"
:
return
"bson.D"
case
"0x04"
:
return
"[]interface{}"
case
"0x05"
:
return
"[]byte"
case
"0x07"
:
return
"bson.ObjectId"
case
"0x08"
:
return
"bool"
case
"0x09"
:
return
"time.Time"
case
"0x0E"
:
return
"string"
case
"0x10"
:
return
"int32"
case
"0x12"
:
return
"int64"
case
"0x13"
:
return
"bson.Decimal"
default
:
return
"interface{}"
}
}
type
valid
struct
{
Description
string
`json:"description"`
Bson
string
`json:"bson"`
CanonicalBson
string
`json:"canonical_bson"`
Name
string
StructTest
bool
TestDef
*
testDef
}
type
decodeError
struct
{
Description
string
`json:"description"`
Bson
string
`json:"bson"`
Name
string
}
vendor/github.com/google/btree/btree_mem.go
0 → 100644
View file @
564c1aeb
// 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"
)
}
}
vendor/github.com/google/certificate-transparency-go/x509/root_darwin_arm_gen.go
0 → 100644
View file @
564c1aeb
// 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
// Generates root_darwin_armx.go.
//
// As of iOS 8, there is no API for querying the system trusted X.509 root
// certificates. We could use SecTrustEvaluate to verify that a trust chain
// exists for a certificate, but the x509 API requires returning the entire
// chain.
//
// Apple publishes the list of trusted root certificates for iOS on
// support.apple.com. So we parse the list and extract the certificates from
// an OS X machine and embed them into the x509 package.
package
main
import
(
"bytes"
"crypto/sha256"
"encoding/hex"
"encoding/pem"
"flag"
"fmt"
"go/format"
"io/ioutil"
"log"
"net/http"
"os/exec"
"regexp"
"strings"
"github.com/google/certificate-transparency-go/x509"
)
var
output
=
flag
.
String
(
"output"
,
"root_darwin_armx.go"
,
"file name to write"
)
func
main
()
{
certs
,
err
:=
selectCerts
()
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
buf
:=
new
(
bytes
.
Buffer
)
fmt
.
Fprintf
(
buf
,
"// Code generated by root_darwin_arm_gen --output %s; DO NOT EDIT.
\n
"
,
*
output
)
fmt
.
Fprintf
(
buf
,
"%s"
,
header
)
fmt
.
Fprintf
(
buf
,
"const systemRootsPEM = `
\n
"
)
for
_
,
cert
:=
range
certs
{
b
:=
&
pem
.
Block
{
Type
:
"CERTIFICATE"
,
Bytes
:
cert
.
Raw
,
}
if
err
:=
pem
.
Encode
(
buf
,
b
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
fmt
.
Fprintf
(
buf
,
"`"
)
source
,
err
:=
format
.
Source
(
buf
.
Bytes
())
if
err
!=
nil
{
log
.
Fatal
(
"source format error:"
,
err
)
}
if
err
:=
ioutil
.
WriteFile
(
*
output
,
source
,
0644
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
func
selectCerts
()
([]
*
x509
.
Certificate
,
error
)
{
ids
,
err
:=
fetchCertIDs
()
if
err
!=
nil
{
return
nil
,
err
}
scerts
,
err
:=
sysCerts
()
if
err
!=
nil
{
return
nil
,
err
}
var
certs
[]
*
x509
.
Certificate
for
_
,
id
:=
range
ids
{
if
c
,
ok
:=
scerts
[
id
.
fingerprint
];
ok
{
certs
=
append
(
certs
,
c
)
}
else
{
fmt
.
Printf
(
"WARNING: cannot find certificate: %s (fingerprint: %s)
\n
"
,
id
.
name
,
id
.
fingerprint
)
}
}
return
certs
,
nil
}
func
sysCerts
()
(
certs
map
[
string
]
*
x509
.
Certificate
,
err
error
)
{
cmd
:=
exec
.
Command
(
"/usr/bin/security"
,
"find-certificate"
,
"-a"
,
"-p"
,
"/System/Library/Keychains/SystemRootCertificates.keychain"
)
data
,
err
:=
cmd
.
Output
()
if
err
!=
nil
{
return
nil
,
err
}
certs
=
make
(
map
[
string
]
*
x509
.
Certificate
)
for
len
(
data
)
>
0
{
var
block
*
pem
.
Block
block
,
data
=
pem
.
Decode
(
data
)
if
block
==
nil
{
break
}
if
block
.
Type
!=
"CERTIFICATE"
||
len
(
block
.
Headers
)
!=
0
{
continue
}
cert
,
err
:=
x509
.
ParseCertificate
(
block
.
Bytes
)
if
err
!=
nil
{
continue
}
fingerprint
:=
sha256
.
Sum256
(
cert
.
Raw
)
certs
[
hex
.
EncodeToString
(
fingerprint
[
:
])]
=
cert
}
return
certs
,
nil
}
type
certID
struct
{
name
string
fingerprint
string
}
// fetchCertIDs fetches IDs of iOS X509 certificates from apple.com.
func
fetchCertIDs
()
([]
certID
,
error
)
{
// Download the iOS 11 support page. The index for all iOS versions is here:
// https://support.apple.com/en-us/HT204132
resp
,
err
:=
http
.
Get
(
"https://support.apple.com/en-us/HT208125"
)
if
err
!=
nil
{
return
nil
,
err
}
defer
resp
.
Body
.
Close
()
body
,
err
:=
ioutil
.
ReadAll
(
resp
.
Body
)
if
err
!=
nil
{
return
nil
,
err
}
text
:=
string
(
body
)
text
=
text
[
strings
.
Index
(
text
,
"<div id=trusted"
)
:
]
text
=
text
[
:
strings
.
Index
(
text
,
"</div>"
)]
var
ids
[]
certID
cols
:=
make
(
map
[
string
]
int
)
for
i
,
rowmatch
:=
range
regexp
.
MustCompile
(
"(?s)<tr>(.*?)</tr>"
)
.
FindAllStringSubmatch
(
text
,
-
1
)
{
row
:=
rowmatch
[
1
]
if
i
==
0
{
// Parse table header row to extract column names
for
i
,
match
:=
range
regexp
.
MustCompile
(
"(?s)<th>(.*?)</th>"
)
.
FindAllStringSubmatch
(
row
,
-
1
)
{
cols
[
match
[
1
]]
=
i
}
continue
}
values
:=
regexp
.
MustCompile
(
"(?s)<td>(.*?)</td>"
)
.
FindAllStringSubmatch
(
row
,
-
1
)
name
:=
values
[
cols
[
"Certificate name"
]][
1
]
fingerprint
:=
values
[
cols
[
"Fingerprint (SHA-256)"
]][
1
]
fingerprint
=
strings
.
Replace
(
fingerprint
,
"<br>"
,
""
,
-
1
)
fingerprint
=
strings
.
Replace
(
fingerprint
,
"
\n
"
,
""
,
-
1
)
fingerprint
=
strings
.
Replace
(
fingerprint
,
" "
,
""
,
-
1
)
fingerprint
=
strings
.
ToLower
(
fingerprint
)
ids
=
append
(
ids
,
certID
{
name
:
name
,
fingerprint
:
fingerprint
,
})
}
return
ids
,
nil
}
const
header
=
`
// 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 cgo
// +build darwin
// +build arm arm64 ios
package x509
func loadSystemRoots() (*CertPool, error) {
p := NewCertPool()
p.AppendCertsFromPEM([]byte(systemRootsPEM))
return p, nil
}
`
vendor/github.com/google/certificate-transparency-go/x509/x509_test_import.go
0 → 100644
View file @
564c1aeb
// Copyright 2013 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 file is run by the x509 tests to ensure that a program with minimal
// imports can sign certificates without errors resulting from missing hash
// functions.
package
main
import
(
"crypto/rand"
// START CT CHANGES
"github.com/google/certificate-transparency-go/x509"
"github.com/google/certificate-transparency-go/x509/pkix"
// END CT CHANGES
"encoding/pem"
"math/big"
"time"
)
func
main
()
{
block
,
_
:=
pem
.
Decode
([]
byte
(
pemPrivateKey
))
rsaPriv
,
err
:=
x509
.
ParsePKCS1PrivateKey
(
block
.
Bytes
)
if
err
!=
nil
{
panic
(
"Failed to parse private key: "
+
err
.
Error
())
}
template
:=
x509
.
Certificate
{
SerialNumber
:
big
.
NewInt
(
1
),
Subject
:
pkix
.
Name
{
CommonName
:
"test"
,
Organization
:
[]
string
{
"Σ Acme Co"
},
},
NotBefore
:
time
.
Unix
(
1000
,
0
),
NotAfter
:
time
.
Unix
(
100000
,
0
),
KeyUsage
:
x509
.
KeyUsageCertSign
,
}
if
_
,
err
=
x509
.
CreateCertificate
(
rand
.
Reader
,
&
template
,
&
template
,
&
rsaPriv
.
PublicKey
,
rsaPriv
);
err
!=
nil
{
panic
(
"failed to create certificate with basic imports: "
+
err
.
Error
())
}
}
var
pemPrivateKey
=
`-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
/ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
RTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/
EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
-----END RSA PRIVATE KEY-----
`
vendor/github.com/lib/pq/oid/gen.go
0 → 100644
View file @
564c1aeb
// +build ignore
// Generate the table of OID values
// Run with 'go run gen.go'.
package
main
import
(
"database/sql"
"fmt"
"log"
"os"
"os/exec"
"strings"
_
"github.com/lib/pq"
)
// OID represent a postgres Object Identifier Type.
type
OID
struct
{
ID
int
Type
string
}
// Name returns an upper case version of the oid type.
func
(
o
OID
)
Name
()
string
{
return
strings
.
ToUpper
(
o
.
Type
)
}
func
main
()
{
datname
:=
os
.
Getenv
(
"PGDATABASE"
)
sslmode
:=
os
.
Getenv
(
"PGSSLMODE"
)
if
datname
==
""
{
os
.
Setenv
(
"PGDATABASE"
,
"pqgotest"
)
}
if
sslmode
==
""
{
os
.
Setenv
(
"PGSSLMODE"
,
"disable"
)
}
db
,
err
:=
sql
.
Open
(
"postgres"
,
""
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
rows
,
err
:=
db
.
Query
(
`
SELECT typname, oid
FROM pg_type WHERE oid < 10000
ORDER BY oid;
`
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
oids
:=
make
([]
*
OID
,
0
)
for
rows
.
Next
()
{
var
oid
OID
if
err
=
rows
.
Scan
(
&
oid
.
Type
,
&
oid
.
ID
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
oids
=
append
(
oids
,
&
oid
)
}
if
err
=
rows
.
Err
();
err
!=
nil
{
log
.
Fatal
(
err
)
}
cmd
:=
exec
.
Command
(
"gofmt"
)
cmd
.
Stderr
=
os
.
Stderr
w
,
err
:=
cmd
.
StdinPipe
()
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
f
,
err
:=
os
.
Create
(
"types.go"
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
cmd
.
Stdout
=
f
err
=
cmd
.
Start
()
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
fmt
.
Fprintln
(
w
,
"// Code generated by gen.go. DO NOT EDIT."
)
fmt
.
Fprintln
(
w
,
"
\n
package oid"
)
fmt
.
Fprintln
(
w
,
"const ("
)
for
_
,
oid
:=
range
oids
{
fmt
.
Fprintf
(
w
,
"T_%s Oid = %d
\n
"
,
oid
.
Type
,
oid
.
ID
)
}
fmt
.
Fprintln
(
w
,
")"
)
fmt
.
Fprintln
(
w
,
"var TypeName = map[Oid]string{"
)
for
_
,
oid
:=
range
oids
{
fmt
.
Fprintf
(
w
,
"T_%s:
\"
%s
\"
,
\n
"
,
oid
.
Type
,
oid
.
Name
())
}
fmt
.
Fprintln
(
w
,
"}"
)
w
.
Close
()
cmd
.
Wait
()
}
vendor/github.com/miekg/dns/duplicate_generate.go
0 → 100644
View file @
564c1aeb
//+build ignore
// types_generate.go is meant to run with go generate. It will use
// go/{importer,types} to track down all the RR struct types. Then for each type
// it will generate conversion tables (TypeToRR and TypeToString) and banal
// methods (len, Header, copy) based on the struct tags. The generated source is
// written to ztypes.go, and is meant to be checked into git.
package
main
import
(
"bytes"
"fmt"
"go/format"
"go/importer"
"go/types"
"log"
"os"
)
var
packageHdr
=
`
// Code generated by "go run duplicate_generate.go"; DO NOT EDIT.
package dns
`
func
getTypeStruct
(
t
types
.
Type
,
scope
*
types
.
Scope
)
(
*
types
.
Struct
,
bool
)
{
st
,
ok
:=
t
.
Underlying
()
.
(
*
types
.
Struct
)
if
!
ok
{
return
nil
,
false
}
if
st
.
Field
(
0
)
.
Type
()
==
scope
.
Lookup
(
"RR_Header"
)
.
Type
()
{
return
st
,
false
}
if
st
.
Field
(
0
)
.
Anonymous
()
{
st
,
_
:=
getTypeStruct
(
st
.
Field
(
0
)
.
Type
(),
scope
)
return
st
,
true
}
return
nil
,
false
}
func
main
()
{
// Import and type-check the package
pkg
,
err
:=
importer
.
Default
()
.
Import
(
"github.com/miekg/dns"
)
fatalIfErr
(
err
)
scope
:=
pkg
.
Scope
()
// Collect actual types (*X)
var
namedTypes
[]
string
for
_
,
name
:=
range
scope
.
Names
()
{
o
:=
scope
.
Lookup
(
name
)
if
o
==
nil
||
!
o
.
Exported
()
{
continue
}
if
st
,
_
:=
getTypeStruct
(
o
.
Type
(),
scope
);
st
==
nil
{
continue
}
if
name
==
"PrivateRR"
||
name
==
"OPT"
{
continue
}
namedTypes
=
append
(
namedTypes
,
o
.
Name
())
}
b
:=
&
bytes
.
Buffer
{}
b
.
WriteString
(
packageHdr
)
// Generate the duplicate check for each type.
fmt
.
Fprint
(
b
,
"// isDuplicate() functions
\n\n
"
)
for
_
,
name
:=
range
namedTypes
{
o
:=
scope
.
Lookup
(
name
)
st
,
isEmbedded
:=
getTypeStruct
(
o
.
Type
(),
scope
)
if
isEmbedded
{
continue
}
fmt
.
Fprintf
(
b
,
"func (r1 *%s) isDuplicate(_r2 RR) bool {
\n
"
,
name
)
fmt
.
Fprintf
(
b
,
"r2, ok := _r2.(*%s)
\n
"
,
name
)
fmt
.
Fprint
(
b
,
"if !ok { return false }
\n
"
)
fmt
.
Fprint
(
b
,
"_ = r2
\n
"
)
for
i
:=
1
;
i
<
st
.
NumFields
();
i
++
{
field
:=
st
.
Field
(
i
)
.
Name
()
o2
:=
func
(
s
string
)
{
fmt
.
Fprintf
(
b
,
s
+
"
\n
"
,
field
,
field
)
}
o3
:=
func
(
s
string
)
{
fmt
.
Fprintf
(
b
,
s
+
"
\n
"
,
field
,
field
,
field
)
}
// For some reason, a and aaaa don't pop up as *types.Slice here (mostly like because the are
// *indirectly* defined as a slice in the net package).
if
_
,
ok
:=
st
.
Field
(
i
)
.
Type
()
.
(
*
types
.
Slice
);
ok
{
o2
(
"if len(r1.%s) != len(r2.%s) {
\n
return false
\n
}"
)
if
st
.
Tag
(
i
)
==
`dns:"cdomain-name"`
||
st
.
Tag
(
i
)
==
`dns:"domain-name"`
{
o3
(
`for i := 0; i < len(r1.%s); i++ {
if !isDulicateName(r1.%s[i], r2.%s[i]) {
return false
}
}`
)
continue
}
o3
(
`for i := 0; i < len(r1.%s); i++ {
if r1.%s[i] != r2.%s[i] {
return false
}
}`
)
continue
}
switch
st
.
Tag
(
i
)
{
case
`dns:"-"`
:
// ignored
case
`dns:"a"`
,
`dns:"aaaa"`
:
o2
(
"if !r1.%s.Equal(r2.%s) {
\n
return false
\n
}"
)
case
`dns:"cdomain-name"`
,
`dns:"domain-name"`
:
o2
(
"if !isDulicateName(r1.%s, r2.%s) {
\n
return false
\n
}"
)
default
:
o2
(
"if r1.%s != r2.%s {
\n
return false
\n
}"
)
}
}
fmt
.
Fprintf
(
b
,
"return true
\n
}
\n\n
"
)
}
// gofmt
res
,
err
:=
format
.
Source
(
b
.
Bytes
())
if
err
!=
nil
{
b
.
WriteTo
(
os
.
Stderr
)
log
.
Fatal
(
err
)
}
// write result
f
,
err
:=
os
.
Create
(
"zduplicate.go"
)
fatalIfErr
(
err
)
defer
f
.
Close
()
f
.
Write
(
res
)
}
func
fatalIfErr
(
err
error
)
{
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
vendor/github.com/miekg/dns/msg_generate.go
0 → 100644
View file @
564c1aeb
//+build ignore
// msg_generate.go is meant to run with go generate. It will use
// go/{importer,types} to track down all the RR struct types. Then for each type
// it will generate pack/unpack methods based on the struct tags. The generated source is
// written to zmsg.go, and is meant to be checked into git.
package
main
import
(
"bytes"
"fmt"
"go/format"
"go/importer"
"go/types"
"log"
"os"
"strings"
)
var
packageHdr
=
`
// Code generated by "go run msg_generate.go"; DO NOT EDIT.
package dns
`
// getTypeStruct will take a type and the package scope, and return the
// (innermost) struct if the type is considered a RR type (currently defined as
// those structs beginning with a RR_Header, could be redefined as implementing
// the RR interface). The bool return value indicates if embedded structs were
// resolved.
func
getTypeStruct
(
t
types
.
Type
,
scope
*
types
.
Scope
)
(
*
types
.
Struct
,
bool
)
{
st
,
ok
:=
t
.
Underlying
()
.
(
*
types
.
Struct
)
if
!
ok
{
return
nil
,
false
}
if
st
.
Field
(
0
)
.
Type
()
==
scope
.
Lookup
(
"RR_Header"
)
.
Type
()
{
return
st
,
false
}
if
st
.
Field
(
0
)
.
Anonymous
()
{
st
,
_
:=
getTypeStruct
(
st
.
Field
(
0
)
.
Type
(),
scope
)
return
st
,
true
}
return
nil
,
false
}
func
main
()
{
// Import and type-check the package
pkg
,
err
:=
importer
.
Default
()
.
Import
(
"github.com/miekg/dns"
)
fatalIfErr
(
err
)
scope
:=
pkg
.
Scope
()
// Collect actual types (*X)
var
namedTypes
[]
string
for
_
,
name
:=
range
scope
.
Names
()
{
o
:=
scope
.
Lookup
(
name
)
if
o
==
nil
||
!
o
.
Exported
()
{
continue
}
if
st
,
_
:=
getTypeStruct
(
o
.
Type
(),
scope
);
st
==
nil
{
continue
}
if
name
==
"PrivateRR"
{
continue
}
// Check if corresponding TypeX exists
if
scope
.
Lookup
(
"Type"
+
o
.
Name
())
==
nil
&&
o
.
Name
()
!=
"RFC3597"
{
log
.
Fatalf
(
"Constant Type%s does not exist."
,
o
.
Name
())
}
namedTypes
=
append
(
namedTypes
,
o
.
Name
())
}
b
:=
&
bytes
.
Buffer
{}
b
.
WriteString
(
packageHdr
)
fmt
.
Fprint
(
b
,
"// pack*() functions
\n\n
"
)
for
_
,
name
:=
range
namedTypes
{
o
:=
scope
.
Lookup
(
name
)
st
,
_
:=
getTypeStruct
(
o
.
Type
(),
scope
)
fmt
.
Fprintf
(
b
,
"func (rr *%s) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) {
\n
"
,
name
)
for
i
:=
1
;
i
<
st
.
NumFields
();
i
++
{
o
:=
func
(
s
string
)
{
fmt
.
Fprintf
(
b
,
s
,
st
.
Field
(
i
)
.
Name
())
fmt
.
Fprint
(
b
,
`if err != nil {
return off, err
}
`
)
}
if
_
,
ok
:=
st
.
Field
(
i
)
.
Type
()
.
(
*
types
.
Slice
);
ok
{
switch
st
.
Tag
(
i
)
{
case
`dns:"-"`
:
// ignored
case
`dns:"txt"`
:
o
(
"off, err = packStringTxt(rr.%s, msg, off)
\n
"
)
case
`dns:"opt"`
:
o
(
"off, err = packDataOpt(rr.%s, msg, off)
\n
"
)
case
`dns:"nsec"`
:
o
(
"off, err = packDataNsec(rr.%s, msg, off)
\n
"
)
case
`dns:"domain-name"`
:
o
(
"off, err = packDataDomainNames(rr.%s, msg, off, compression, false)
\n
"
)
default
:
log
.
Fatalln
(
name
,
st
.
Field
(
i
)
.
Name
(),
st
.
Tag
(
i
))
}
continue
}
switch
{
case
st
.
Tag
(
i
)
==
`dns:"-"`
:
// ignored
case
st
.
Tag
(
i
)
==
`dns:"cdomain-name"`
:
o
(
"off, err = packDomainName(rr.%s, msg, off, compression, compress)
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"domain-name"`
:
o
(
"off, err = packDomainName(rr.%s, msg, off, compression, false)
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"a"`
:
o
(
"off, err = packDataA(rr.%s, msg, off)
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"aaaa"`
:
o
(
"off, err = packDataAAAA(rr.%s, msg, off)
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"uint48"`
:
o
(
"off, err = packUint48(rr.%s, msg, off)
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"txt"`
:
o
(
"off, err = packString(rr.%s, msg, off)
\n
"
)
case
strings
.
HasPrefix
(
st
.
Tag
(
i
),
`dns:"size-base32`
)
:
// size-base32 can be packed just like base32
fallthrough
case
st
.
Tag
(
i
)
==
`dns:"base32"`
:
o
(
"off, err = packStringBase32(rr.%s, msg, off)
\n
"
)
case
strings
.
HasPrefix
(
st
.
Tag
(
i
),
`dns:"size-base64`
)
:
// size-base64 can be packed just like base64
fallthrough
case
st
.
Tag
(
i
)
==
`dns:"base64"`
:
o
(
"off, err = packStringBase64(rr.%s, msg, off)
\n
"
)
case
strings
.
HasPrefix
(
st
.
Tag
(
i
),
`dns:"size-hex:SaltLength`
)
:
// directly write instead of using o() so we get the error check in the correct place
field
:=
st
.
Field
(
i
)
.
Name
()
fmt
.
Fprintf
(
b
,
`// Only pack salt if value is not "-", i.e. empty
if rr.%s != "-" {
off, err = packStringHex(rr.%s, msg, off)
if err != nil {
return off, err
}
}
`
,
field
,
field
)
continue
case
strings
.
HasPrefix
(
st
.
Tag
(
i
),
`dns:"size-hex`
)
:
// size-hex can be packed just like hex
fallthrough
case
st
.
Tag
(
i
)
==
`dns:"hex"`
:
o
(
"off, err = packStringHex(rr.%s, msg, off)
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"any"`
:
o
(
"off, err = packStringAny(rr.%s, msg, off)
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"octet"`
:
o
(
"off, err = packStringOctet(rr.%s, msg, off)
\n
"
)
case
st
.
Tag
(
i
)
==
""
:
switch
st
.
Field
(
i
)
.
Type
()
.
(
*
types
.
Basic
)
.
Kind
()
{
case
types
.
Uint8
:
o
(
"off, err = packUint8(rr.%s, msg, off)
\n
"
)
case
types
.
Uint16
:
o
(
"off, err = packUint16(rr.%s, msg, off)
\n
"
)
case
types
.
Uint32
:
o
(
"off, err = packUint32(rr.%s, msg, off)
\n
"
)
case
types
.
Uint64
:
o
(
"off, err = packUint64(rr.%s, msg, off)
\n
"
)
case
types
.
String
:
o
(
"off, err = packString(rr.%s, msg, off)
\n
"
)
default
:
log
.
Fatalln
(
name
,
st
.
Field
(
i
)
.
Name
())
}
default
:
log
.
Fatalln
(
name
,
st
.
Field
(
i
)
.
Name
(),
st
.
Tag
(
i
))
}
}
fmt
.
Fprintln
(
b
,
"return off, nil }
\n
"
)
}
fmt
.
Fprint
(
b
,
"// unpack*() functions
\n\n
"
)
for
_
,
name
:=
range
namedTypes
{
o
:=
scope
.
Lookup
(
name
)
st
,
_
:=
getTypeStruct
(
o
.
Type
(),
scope
)
fmt
.
Fprintf
(
b
,
"func (rr *%s) unpack(msg []byte, off int) (off1 int, err error) {
\n
"
,
name
)
fmt
.
Fprint
(
b
,
`rdStart := off
_ = rdStart
`
)
for
i
:=
1
;
i
<
st
.
NumFields
();
i
++
{
o
:=
func
(
s
string
)
{
fmt
.
Fprintf
(
b
,
s
,
st
.
Field
(
i
)
.
Name
())
fmt
.
Fprint
(
b
,
`if err != nil {
return off, err
}
`
)
}
// size-* are special, because they reference a struct member we should use for the length.
if
strings
.
HasPrefix
(
st
.
Tag
(
i
),
`dns:"size-`
)
{
structMember
:=
structMember
(
st
.
Tag
(
i
))
structTag
:=
structTag
(
st
.
Tag
(
i
))
switch
structTag
{
case
"hex"
:
fmt
.
Fprintf
(
b
,
"rr.%s, off, err = unpackStringHex(msg, off, off + int(rr.%s))
\n
"
,
st
.
Field
(
i
)
.
Name
(),
structMember
)
case
"base32"
:
fmt
.
Fprintf
(
b
,
"rr.%s, off, err = unpackStringBase32(msg, off, off + int(rr.%s))
\n
"
,
st
.
Field
(
i
)
.
Name
(),
structMember
)
case
"base64"
:
fmt
.
Fprintf
(
b
,
"rr.%s, off, err = unpackStringBase64(msg, off, off + int(rr.%s))
\n
"
,
st
.
Field
(
i
)
.
Name
(),
structMember
)
default
:
log
.
Fatalln
(
name
,
st
.
Field
(
i
)
.
Name
(),
st
.
Tag
(
i
))
}
fmt
.
Fprint
(
b
,
`if err != nil {
return off, err
}
`
)
continue
}
if
_
,
ok
:=
st
.
Field
(
i
)
.
Type
()
.
(
*
types
.
Slice
);
ok
{
switch
st
.
Tag
(
i
)
{
case
`dns:"-"`
:
// ignored
case
`dns:"txt"`
:
o
(
"rr.%s, off, err = unpackStringTxt(msg, off)
\n
"
)
case
`dns:"opt"`
:
o
(
"rr.%s, off, err = unpackDataOpt(msg, off)
\n
"
)
case
`dns:"nsec"`
:
o
(
"rr.%s, off, err = unpackDataNsec(msg, off)
\n
"
)
case
`dns:"domain-name"`
:
o
(
"rr.%s, off, err = unpackDataDomainNames(msg, off, rdStart + int(rr.Hdr.Rdlength))
\n
"
)
default
:
log
.
Fatalln
(
name
,
st
.
Field
(
i
)
.
Name
(),
st
.
Tag
(
i
))
}
continue
}
switch
st
.
Tag
(
i
)
{
case
`dns:"-"`
:
// ignored
case
`dns:"cdomain-name"`
:
fallthrough
case
`dns:"domain-name"`
:
o
(
"rr.%s, off, err = UnpackDomainName(msg, off)
\n
"
)
case
`dns:"a"`
:
o
(
"rr.%s, off, err = unpackDataA(msg, off)
\n
"
)
case
`dns:"aaaa"`
:
o
(
"rr.%s, off, err = unpackDataAAAA(msg, off)
\n
"
)
case
`dns:"uint48"`
:
o
(
"rr.%s, off, err = unpackUint48(msg, off)
\n
"
)
case
`dns:"txt"`
:
o
(
"rr.%s, off, err = unpackString(msg, off)
\n
"
)
case
`dns:"base32"`
:
o
(
"rr.%s, off, err = unpackStringBase32(msg, off, rdStart + int(rr.Hdr.Rdlength))
\n
"
)
case
`dns:"base64"`
:
o
(
"rr.%s, off, err = unpackStringBase64(msg, off, rdStart + int(rr.Hdr.Rdlength))
\n
"
)
case
`dns:"hex"`
:
o
(
"rr.%s, off, err = unpackStringHex(msg, off, rdStart + int(rr.Hdr.Rdlength))
\n
"
)
case
`dns:"any"`
:
o
(
"rr.%s, off, err = unpackStringAny(msg, off, rdStart + int(rr.Hdr.Rdlength))
\n
"
)
case
`dns:"octet"`
:
o
(
"rr.%s, off, err = unpackStringOctet(msg, off)
\n
"
)
case
""
:
switch
st
.
Field
(
i
)
.
Type
()
.
(
*
types
.
Basic
)
.
Kind
()
{
case
types
.
Uint8
:
o
(
"rr.%s, off, err = unpackUint8(msg, off)
\n
"
)
case
types
.
Uint16
:
o
(
"rr.%s, off, err = unpackUint16(msg, off)
\n
"
)
case
types
.
Uint32
:
o
(
"rr.%s, off, err = unpackUint32(msg, off)
\n
"
)
case
types
.
Uint64
:
o
(
"rr.%s, off, err = unpackUint64(msg, off)
\n
"
)
case
types
.
String
:
o
(
"rr.%s, off, err = unpackString(msg, off)
\n
"
)
default
:
log
.
Fatalln
(
name
,
st
.
Field
(
i
)
.
Name
())
}
default
:
log
.
Fatalln
(
name
,
st
.
Field
(
i
)
.
Name
(),
st
.
Tag
(
i
))
}
// If we've hit len(msg) we return without error.
if
i
<
st
.
NumFields
()
-
1
{
fmt
.
Fprintf
(
b
,
`if off == len(msg) {
return off, nil
}
`
)
}
}
fmt
.
Fprintf
(
b
,
"return off, nil }
\n\n
"
)
}
// gofmt
res
,
err
:=
format
.
Source
(
b
.
Bytes
())
if
err
!=
nil
{
b
.
WriteTo
(
os
.
Stderr
)
log
.
Fatal
(
err
)
}
// write result
f
,
err
:=
os
.
Create
(
"zmsg.go"
)
fatalIfErr
(
err
)
defer
f
.
Close
()
f
.
Write
(
res
)
}
// structMember will take a tag like dns:"size-base32:SaltLength" and return the last part of this string.
func
structMember
(
s
string
)
string
{
fields
:=
strings
.
Split
(
s
,
":"
)
if
len
(
fields
)
==
0
{
return
""
}
f
:=
fields
[
len
(
fields
)
-
1
]
// f should have a closing "
if
len
(
f
)
>
1
{
return
f
[
:
len
(
f
)
-
1
]
}
return
f
}
// structTag will take a tag like dns:"size-base32:SaltLength" and return base32.
func
structTag
(
s
string
)
string
{
fields
:=
strings
.
Split
(
s
,
":"
)
if
len
(
fields
)
<
2
{
return
""
}
return
fields
[
1
][
len
(
"
\"
size-"
)
:
]
}
func
fatalIfErr
(
err
error
)
{
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
vendor/github.com/miekg/dns/types_generate.go
0 → 100644
View file @
564c1aeb
//+build ignore
// types_generate.go is meant to run with go generate. It will use
// go/{importer,types} to track down all the RR struct types. Then for each type
// it will generate conversion tables (TypeToRR and TypeToString) and banal
// methods (len, Header, copy) based on the struct tags. The generated source is
// written to ztypes.go, and is meant to be checked into git.
package
main
import
(
"bytes"
"fmt"
"go/format"
"go/importer"
"go/types"
"log"
"os"
"strings"
"text/template"
)
var
skipLen
=
map
[
string
]
struct
{}{
"NSEC"
:
{},
"NSEC3"
:
{},
"OPT"
:
{},
"CSYNC"
:
{},
}
var
packageHdr
=
`
// Code generated by "go run types_generate.go"; DO NOT EDIT.
package dns
import (
"encoding/base64"
"net"
)
`
var
TypeToRR
=
template
.
Must
(
template
.
New
(
"TypeToRR"
)
.
Parse
(
`
// TypeToRR is a map of constructors for each RR type.
var TypeToRR = map[uint16]func() RR{
{{range .}}{{if ne . "RFC3597"}} Type{{.}}: func() RR { return new({{.}}) },
{{end}}{{end}} }
`
))
var
typeToString
=
template
.
Must
(
template
.
New
(
"typeToString"
)
.
Parse
(
`
// TypeToString is a map of strings for each RR type.
var TypeToString = map[uint16]string{
{{range .}}{{if ne . "NSAPPTR"}} Type{{.}}: "{{.}}",
{{end}}{{end}} TypeNSAPPTR: "NSAP-PTR",
}
`
))
var
headerFunc
=
template
.
Must
(
template
.
New
(
"headerFunc"
)
.
Parse
(
`
{{range .}} func (rr *{{.}}) Header() *RR_Header { return &rr.Hdr }
{{end}}
`
))
// getTypeStruct will take a type and the package scope, and return the
// (innermost) struct if the type is considered a RR type (currently defined as
// those structs beginning with a RR_Header, could be redefined as implementing
// the RR interface). The bool return value indicates if embedded structs were
// resolved.
func
getTypeStruct
(
t
types
.
Type
,
scope
*
types
.
Scope
)
(
*
types
.
Struct
,
bool
)
{
st
,
ok
:=
t
.
Underlying
()
.
(
*
types
.
Struct
)
if
!
ok
{
return
nil
,
false
}
if
st
.
Field
(
0
)
.
Type
()
==
scope
.
Lookup
(
"RR_Header"
)
.
Type
()
{
return
st
,
false
}
if
st
.
Field
(
0
)
.
Anonymous
()
{
st
,
_
:=
getTypeStruct
(
st
.
Field
(
0
)
.
Type
(),
scope
)
return
st
,
true
}
return
nil
,
false
}
func
main
()
{
// Import and type-check the package
pkg
,
err
:=
importer
.
Default
()
.
Import
(
"github.com/miekg/dns"
)
fatalIfErr
(
err
)
scope
:=
pkg
.
Scope
()
// Collect constants like TypeX
var
numberedTypes
[]
string
for
_
,
name
:=
range
scope
.
Names
()
{
o
:=
scope
.
Lookup
(
name
)
if
o
==
nil
||
!
o
.
Exported
()
{
continue
}
b
,
ok
:=
o
.
Type
()
.
(
*
types
.
Basic
)
if
!
ok
||
b
.
Kind
()
!=
types
.
Uint16
{
continue
}
if
!
strings
.
HasPrefix
(
o
.
Name
(),
"Type"
)
{
continue
}
name
:=
strings
.
TrimPrefix
(
o
.
Name
(),
"Type"
)
if
name
==
"PrivateRR"
{
continue
}
numberedTypes
=
append
(
numberedTypes
,
name
)
}
// Collect actual types (*X)
var
namedTypes
[]
string
for
_
,
name
:=
range
scope
.
Names
()
{
o
:=
scope
.
Lookup
(
name
)
if
o
==
nil
||
!
o
.
Exported
()
{
continue
}
if
st
,
_
:=
getTypeStruct
(
o
.
Type
(),
scope
);
st
==
nil
{
continue
}
if
name
==
"PrivateRR"
{
continue
}
// Check if corresponding TypeX exists
if
scope
.
Lookup
(
"Type"
+
o
.
Name
())
==
nil
&&
o
.
Name
()
!=
"RFC3597"
{
log
.
Fatalf
(
"Constant Type%s does not exist."
,
o
.
Name
())
}
namedTypes
=
append
(
namedTypes
,
o
.
Name
())
}
b
:=
&
bytes
.
Buffer
{}
b
.
WriteString
(
packageHdr
)
// Generate TypeToRR
fatalIfErr
(
TypeToRR
.
Execute
(
b
,
namedTypes
))
// Generate typeToString
fatalIfErr
(
typeToString
.
Execute
(
b
,
numberedTypes
))
// Generate headerFunc
fatalIfErr
(
headerFunc
.
Execute
(
b
,
namedTypes
))
// Generate len()
fmt
.
Fprint
(
b
,
"// len() functions
\n
"
)
for
_
,
name
:=
range
namedTypes
{
if
_
,
ok
:=
skipLen
[
name
];
ok
{
continue
}
o
:=
scope
.
Lookup
(
name
)
st
,
isEmbedded
:=
getTypeStruct
(
o
.
Type
(),
scope
)
if
isEmbedded
{
continue
}
fmt
.
Fprintf
(
b
,
"func (rr *%s) len(off int, compression map[string]struct{}) int {
\n
"
,
name
)
fmt
.
Fprintf
(
b
,
"l := rr.Hdr.len(off, compression)
\n
"
)
for
i
:=
1
;
i
<
st
.
NumFields
();
i
++
{
o
:=
func
(
s
string
)
{
fmt
.
Fprintf
(
b
,
s
,
st
.
Field
(
i
)
.
Name
())
}
if
_
,
ok
:=
st
.
Field
(
i
)
.
Type
()
.
(
*
types
.
Slice
);
ok
{
switch
st
.
Tag
(
i
)
{
case
`dns:"-"`
:
// ignored
case
`dns:"cdomain-name"`
:
o
(
"for _, x := range rr.%s { l += domainNameLen(x, off+l, compression, true) }
\n
"
)
case
`dns:"domain-name"`
:
o
(
"for _, x := range rr.%s { l += domainNameLen(x, off+l, compression, false) }
\n
"
)
case
`dns:"txt"`
:
o
(
"for _, x := range rr.%s { l += len(x) + 1 }
\n
"
)
default
:
log
.
Fatalln
(
name
,
st
.
Field
(
i
)
.
Name
(),
st
.
Tag
(
i
))
}
continue
}
switch
{
case
st
.
Tag
(
i
)
==
`dns:"-"`
:
// ignored
case
st
.
Tag
(
i
)
==
`dns:"cdomain-name"`
:
o
(
"l += domainNameLen(rr.%s, off+l, compression, true)
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"domain-name"`
:
o
(
"l += domainNameLen(rr.%s, off+l, compression, false)
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"octet"`
:
o
(
"l += len(rr.%s)
\n
"
)
case
strings
.
HasPrefix
(
st
.
Tag
(
i
),
`dns:"size-base64`
)
:
fallthrough
case
st
.
Tag
(
i
)
==
`dns:"base64"`
:
o
(
"l += base64.StdEncoding.DecodedLen(len(rr.%s))
\n
"
)
case
strings
.
HasPrefix
(
st
.
Tag
(
i
),
`dns:"size-hex:`
)
:
// this has an extra field where the length is stored
o
(
"l += len(rr.%s)/2
\n
"
)
case
strings
.
HasPrefix
(
st
.
Tag
(
i
),
`dns:"size-hex`
)
:
fallthrough
case
st
.
Tag
(
i
)
==
`dns:"hex"`
:
o
(
"l += len(rr.%s)/2 + 1
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"any"`
:
o
(
"l += len(rr.%s)
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"a"`
:
o
(
"l += net.IPv4len // %s
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"aaaa"`
:
o
(
"l += net.IPv6len // %s
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"txt"`
:
o
(
"for _, t := range rr.%s { l += len(t) + 1 }
\n
"
)
case
st
.
Tag
(
i
)
==
`dns:"uint48"`
:
o
(
"l += 6 // %s
\n
"
)
case
st
.
Tag
(
i
)
==
""
:
switch
st
.
Field
(
i
)
.
Type
()
.
(
*
types
.
Basic
)
.
Kind
()
{
case
types
.
Uint8
:
o
(
"l++ // %s
\n
"
)
case
types
.
Uint16
:
o
(
"l += 2 // %s
\n
"
)
case
types
.
Uint32
:
o
(
"l += 4 // %s
\n
"
)
case
types
.
Uint64
:
o
(
"l += 8 // %s
\n
"
)
case
types
.
String
:
o
(
"l += len(rr.%s) + 1
\n
"
)
default
:
log
.
Fatalln
(
name
,
st
.
Field
(
i
)
.
Name
())
}
default
:
log
.
Fatalln
(
name
,
st
.
Field
(
i
)
.
Name
(),
st
.
Tag
(
i
))
}
}
fmt
.
Fprintf
(
b
,
"return l }
\n
"
)
}
// Generate copy()
fmt
.
Fprint
(
b
,
"// copy() functions
\n
"
)
for
_
,
name
:=
range
namedTypes
{
o
:=
scope
.
Lookup
(
name
)
st
,
isEmbedded
:=
getTypeStruct
(
o
.
Type
(),
scope
)
if
isEmbedded
{
continue
}
fmt
.
Fprintf
(
b
,
"func (rr *%s) copy() RR {
\n
"
,
name
)
fields
:=
[]
string
{
"rr.Hdr"
}
for
i
:=
1
;
i
<
st
.
NumFields
();
i
++
{
f
:=
st
.
Field
(
i
)
.
Name
()
if
sl
,
ok
:=
st
.
Field
(
i
)
.
Type
()
.
(
*
types
.
Slice
);
ok
{
t
:=
sl
.
Underlying
()
.
String
()
t
=
strings
.
TrimPrefix
(
t
,
"[]"
)
if
strings
.
Contains
(
t
,
"."
)
{
splits
:=
strings
.
Split
(
t
,
"."
)
t
=
splits
[
len
(
splits
)
-
1
]
}
// For the EDNS0 interface (used in the OPT RR), we need to call the copy method on each element.
if
t
==
"EDNS0"
{
fmt
.
Fprintf
(
b
,
"%s := make([]%s, len(rr.%s));
\n
for i,e := range rr.%s {
\n
%s[i] = e.copy()
\n
}
\n
"
,
f
,
t
,
f
,
f
,
f
)
fields
=
append
(
fields
,
f
)
continue
}
fmt
.
Fprintf
(
b
,
"%s := make([]%s, len(rr.%s)); copy(%s, rr.%s)
\n
"
,
f
,
t
,
f
,
f
,
f
)
fields
=
append
(
fields
,
f
)
continue
}
if
st
.
Field
(
i
)
.
Type
()
.
String
()
==
"net.IP"
{
fields
=
append
(
fields
,
"copyIP(rr."
+
f
+
")"
)
continue
}
fields
=
append
(
fields
,
"rr."
+
f
)
}
fmt
.
Fprintf
(
b
,
"return &%s{%s}
\n
"
,
name
,
strings
.
Join
(
fields
,
","
))
fmt
.
Fprintf
(
b
,
"}
\n
"
)
}
// gofmt
res
,
err
:=
format
.
Source
(
b
.
Bytes
())
if
err
!=
nil
{
b
.
WriteTo
(
os
.
Stderr
)
log
.
Fatal
(
err
)
}
// write result
f
,
err
:=
os
.
Create
(
"ztypes.go"
)
fatalIfErr
(
err
)
defer
f
.
Close
()
f
.
Write
(
res
)
}
func
fatalIfErr
(
err
error
)
{
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
vendor/golang.org/x/net/html/atom/gen.go
0 → 100644
View file @
564c1aeb
// Copyright 2012 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
//go:generate go run gen.go
//go:generate go run gen.go -test
package
main
import
(
"bytes"
"flag"
"fmt"
"go/format"
"io/ioutil"
"math/rand"
"os"
"sort"
"strings"
)
// identifier converts s to a Go exported identifier.
// It converts "div" to "Div" and "accept-charset" to "AcceptCharset".
func
identifier
(
s
string
)
string
{
b
:=
make
([]
byte
,
0
,
len
(
s
))
cap
:=
true
for
_
,
c
:=
range
s
{
if
c
==
'-'
{
cap
=
true
continue
}
if
cap
&&
'a'
<=
c
&&
c
<=
'z'
{
c
-=
'a'
-
'A'
}
cap
=
false
b
=
append
(
b
,
byte
(
c
))
}
return
string
(
b
)
}
var
test
=
flag
.
Bool
(
"test"
,
false
,
"generate table_test.go"
)
func
genFile
(
name
string
,
buf
*
bytes
.
Buffer
)
{
b
,
err
:=
format
.
Source
(
buf
.
Bytes
())
if
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
err
)
os
.
Exit
(
1
)
}
if
err
:=
ioutil
.
WriteFile
(
name
,
b
,
0644
);
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
err
)
os
.
Exit
(
1
)
}
}
func
main
()
{
flag
.
Parse
()
var
all
[]
string
all
=
append
(
all
,
elements
...
)
all
=
append
(
all
,
attributes
...
)
all
=
append
(
all
,
eventHandlers
...
)
all
=
append
(
all
,
extra
...
)
sort
.
Strings
(
all
)
// uniq - lists have dups
w
:=
0
for
_
,
s
:=
range
all
{
if
w
==
0
||
all
[
w
-
1
]
!=
s
{
all
[
w
]
=
s
w
++
}
}
all
=
all
[
:
w
]
if
*
test
{
var
buf
bytes
.
Buffer
fmt
.
Fprintln
(
&
buf
,
"// Code generated by go generate gen.go; DO NOT EDIT.
\n
"
)
fmt
.
Fprintln
(
&
buf
,
"//go:generate go run gen.go -test
\n
"
)
fmt
.
Fprintln
(
&
buf
,
"package atom
\n
"
)
fmt
.
Fprintln
(
&
buf
,
"var testAtomList = []string{"
)
for
_
,
s
:=
range
all
{
fmt
.
Fprintf
(
&
buf
,
"
\t
%q,
\n
"
,
s
)
}
fmt
.
Fprintln
(
&
buf
,
"}"
)
genFile
(
"table_test.go"
,
&
buf
)
return
}
// Find hash that minimizes table size.
var
best
*
table
for
i
:=
0
;
i
<
1000000
;
i
++
{
if
best
!=
nil
&&
1
<<
(
best
.
k
-
1
)
<
len
(
all
)
{
break
}
h
:=
rand
.
Uint32
()
for
k
:=
uint
(
0
);
k
<=
16
;
k
++
{
if
best
!=
nil
&&
k
>=
best
.
k
{
break
}
var
t
table
if
t
.
init
(
h
,
k
,
all
)
{
best
=
&
t
break
}
}
}
if
best
==
nil
{
fmt
.
Fprintf
(
os
.
Stderr
,
"failed to construct string table
\n
"
)
os
.
Exit
(
1
)
}
// Lay out strings, using overlaps when possible.
layout
:=
append
([]
string
{},
all
...
)
// Remove strings that are substrings of other strings
for
changed
:=
true
;
changed
;
{
changed
=
false
for
i
,
s
:=
range
layout
{
if
s
==
""
{
continue
}
for
j
,
t
:=
range
layout
{
if
i
!=
j
&&
t
!=
""
&&
strings
.
Contains
(
s
,
t
)
{
changed
=
true
layout
[
j
]
=
""
}
}
}
}
// Join strings where one suffix matches another prefix.
for
{
// Find best i, j, k such that layout[i][len-k:] == layout[j][:k],
// maximizing overlap length k.
besti
:=
-
1
bestj
:=
-
1
bestk
:=
0
for
i
,
s
:=
range
layout
{
if
s
==
""
{
continue
}
for
j
,
t
:=
range
layout
{
if
i
==
j
{
continue
}
for
k
:=
bestk
+
1
;
k
<=
len
(
s
)
&&
k
<=
len
(
t
);
k
++
{
if
s
[
len
(
s
)
-
k
:
]
==
t
[
:
k
]
{
besti
=
i
bestj
=
j
bestk
=
k
}
}
}
}
if
bestk
>
0
{
layout
[
besti
]
+=
layout
[
bestj
][
bestk
:
]
layout
[
bestj
]
=
""
continue
}
break
}
text
:=
strings
.
Join
(
layout
,
""
)
atom
:=
map
[
string
]
uint32
{}
for
_
,
s
:=
range
all
{
off
:=
strings
.
Index
(
text
,
s
)
if
off
<
0
{
panic
(
"lost string "
+
s
)
}
atom
[
s
]
=
uint32
(
off
<<
8
|
len
(
s
))
}
var
buf
bytes
.
Buffer
// Generate the Go code.
fmt
.
Fprintln
(
&
buf
,
"// Code generated by go generate gen.go; DO NOT EDIT.
\n
"
)
fmt
.
Fprintln
(
&
buf
,
"//go:generate go run gen.go
\n
"
)
fmt
.
Fprintln
(
&
buf
,
"package atom
\n\n
const ("
)
// compute max len
maxLen
:=
0
for
_
,
s
:=
range
all
{
if
maxLen
<
len
(
s
)
{
maxLen
=
len
(
s
)
}
fmt
.
Fprintf
(
&
buf
,
"
\t
%s Atom = %#x
\n
"
,
identifier
(
s
),
atom
[
s
])
}
fmt
.
Fprintln
(
&
buf
,
")
\n
"
)
fmt
.
Fprintf
(
&
buf
,
"const hash0 = %#x
\n\n
"
,
best
.
h0
)
fmt
.
Fprintf
(
&
buf
,
"const maxAtomLen = %d
\n\n
"
,
maxLen
)
fmt
.
Fprintf
(
&
buf
,
"var table = [1<<%d]Atom{
\n
"
,
best
.
k
)
for
i
,
s
:=
range
best
.
tab
{
if
s
==
""
{
continue
}
fmt
.
Fprintf
(
&
buf
,
"
\t
%#x: %#x, // %s
\n
"
,
i
,
atom
[
s
],
s
)
}
fmt
.
Fprintf
(
&
buf
,
"}
\n
"
)
datasize
:=
(
1
<<
best
.
k
)
*
4
fmt
.
Fprintln
(
&
buf
,
"const atomText ="
)
textsize
:=
len
(
text
)
for
len
(
text
)
>
60
{
fmt
.
Fprintf
(
&
buf
,
"
\t
%q +
\n
"
,
text
[
:
60
])
text
=
text
[
60
:
]
}
fmt
.
Fprintf
(
&
buf
,
"
\t
%q
\n\n
"
,
text
)
genFile
(
"table.go"
,
&
buf
)
fmt
.
Fprintf
(
os
.
Stdout
,
"%d atoms; %d string bytes + %d tables = %d total data
\n
"
,
len
(
all
),
textsize
,
datasize
,
textsize
+
datasize
)
}
type
byLen
[]
string
func
(
x
byLen
)
Less
(
i
,
j
int
)
bool
{
return
len
(
x
[
i
])
>
len
(
x
[
j
])
}
func
(
x
byLen
)
Swap
(
i
,
j
int
)
{
x
[
i
],
x
[
j
]
=
x
[
j
],
x
[
i
]
}
func
(
x
byLen
)
Len
()
int
{
return
len
(
x
)
}
// fnv computes the FNV hash with an arbitrary starting value h.
func
fnv
(
h
uint32
,
s
string
)
uint32
{
for
i
:=
0
;
i
<
len
(
s
);
i
++
{
h
^=
uint32
(
s
[
i
])
h
*=
16777619
}
return
h
}
// A table represents an attempt at constructing the lookup table.
// The lookup table uses cuckoo hashing, meaning that each string
// can be found in one of two positions.
type
table
struct
{
h0
uint32
k
uint
mask
uint32
tab
[]
string
}
// hash returns the two hashes for s.
func
(
t
*
table
)
hash
(
s
string
)
(
h1
,
h2
uint32
)
{
h
:=
fnv
(
t
.
h0
,
s
)
h1
=
h
&
t
.
mask
h2
=
(
h
>>
16
)
&
t
.
mask
return
}
// init initializes the table with the given parameters.
// h0 is the initial hash value,
// k is the number of bits of hash value to use, and
// x is the list of strings to store in the table.
// init returns false if the table cannot be constructed.
func
(
t
*
table
)
init
(
h0
uint32
,
k
uint
,
x
[]
string
)
bool
{
t
.
h0
=
h0
t
.
k
=
k
t
.
tab
=
make
([]
string
,
1
<<
k
)
t
.
mask
=
1
<<
k
-
1
for
_
,
s
:=
range
x
{
if
!
t
.
insert
(
s
)
{
return
false
}
}
return
true
}
// insert inserts s in the table.
func
(
t
*
table
)
insert
(
s
string
)
bool
{
h1
,
h2
:=
t
.
hash
(
s
)
if
t
.
tab
[
h1
]
==
""
{
t
.
tab
[
h1
]
=
s
return
true
}
if
t
.
tab
[
h2
]
==
""
{
t
.
tab
[
h2
]
=
s
return
true
}
if
t
.
push
(
h1
,
0
)
{
t
.
tab
[
h1
]
=
s
return
true
}
if
t
.
push
(
h2
,
0
)
{
t
.
tab
[
h2
]
=
s
return
true
}
return
false
}
// push attempts to push aside the entry in slot i.
func
(
t
*
table
)
push
(
i
uint32
,
depth
int
)
bool
{
if
depth
>
len
(
t
.
tab
)
{
return
false
}
s
:=
t
.
tab
[
i
]
h1
,
h2
:=
t
.
hash
(
s
)
j
:=
h1
+
h2
-
i
if
t
.
tab
[
j
]
!=
""
&&
!
t
.
push
(
j
,
depth
+
1
)
{
return
false
}
t
.
tab
[
j
]
=
s
return
true
}
// The lists of element names and attribute keys were taken from
// https://html.spec.whatwg.org/multipage/indices.html#index
// as of the "HTML Living Standard - Last Updated 16 April 2018" version.
// "command", "keygen" and "menuitem" have been removed from the spec,
// but are kept here for backwards compatibility.
var
elements
=
[]
string
{
"a"
,
"abbr"
,
"address"
,
"area"
,
"article"
,
"aside"
,
"audio"
,
"b"
,
"base"
,
"bdi"
,
"bdo"
,
"blockquote"
,
"body"
,
"br"
,
"button"
,
"canvas"
,
"caption"
,
"cite"
,
"code"
,
"col"
,
"colgroup"
,
"command"
,
"data"
,
"datalist"
,
"dd"
,
"del"
,
"details"
,
"dfn"
,
"dialog"
,
"div"
,
"dl"
,
"dt"
,
"em"
,
"embed"
,
"fieldset"
,
"figcaption"
,
"figure"
,
"footer"
,
"form"
,
"h1"
,
"h2"
,
"h3"
,
"h4"
,
"h5"
,
"h6"
,
"head"
,
"header"
,
"hgroup"
,
"hr"
,
"html"
,
"i"
,
"iframe"
,
"img"
,
"input"
,
"ins"
,
"kbd"
,
"keygen"
,
"label"
,
"legend"
,
"li"
,
"link"
,
"main"
,
"map"
,
"mark"
,
"menu"
,
"menuitem"
,
"meta"
,
"meter"
,
"nav"
,
"noscript"
,
"object"
,
"ol"
,
"optgroup"
,
"option"
,
"output"
,
"p"
,
"param"
,
"picture"
,
"pre"
,
"progress"
,
"q"
,
"rp"
,
"rt"
,
"ruby"
,
"s"
,
"samp"
,
"script"
,
"section"
,
"select"
,
"slot"
,
"small"
,
"source"
,
"span"
,
"strong"
,
"style"
,
"sub"
,
"summary"
,
"sup"
,
"table"
,
"tbody"
,
"td"
,
"template"
,
"textarea"
,
"tfoot"
,
"th"
,
"thead"
,
"time"
,
"title"
,
"tr"
,
"track"
,
"u"
,
"ul"
,
"var"
,
"video"
,
"wbr"
,
}
// https://html.spec.whatwg.org/multipage/indices.html#attributes-3
//
// "challenge", "command", "contextmenu", "dropzone", "icon", "keytype", "mediagroup",
// "radiogroup", "spellcheck", "scoped", "seamless", "sortable" and "sorted" have been removed from the spec,
// but are kept here for backwards compatibility.
var
attributes
=
[]
string
{
"abbr"
,
"accept"
,
"accept-charset"
,
"accesskey"
,
"action"
,
"allowfullscreen"
,
"allowpaymentrequest"
,
"allowusermedia"
,
"alt"
,
"as"
,
"async"
,
"autocomplete"
,
"autofocus"
,
"autoplay"
,
"challenge"
,
"charset"
,
"checked"
,
"cite"
,
"class"
,
"color"
,
"cols"
,
"colspan"
,
"command"
,
"content"
,
"contenteditable"
,
"contextmenu"
,
"controls"
,
"coords"
,
"crossorigin"
,
"data"
,
"datetime"
,
"default"
,
"defer"
,
"dir"
,
"dirname"
,
"disabled"
,
"download"
,
"draggable"
,
"dropzone"
,
"enctype"
,
"for"
,
"form"
,
"formaction"
,
"formenctype"
,
"formmethod"
,
"formnovalidate"
,
"formtarget"
,
"headers"
,
"height"
,
"hidden"
,
"high"
,
"href"
,
"hreflang"
,
"http-equiv"
,
"icon"
,
"id"
,
"inputmode"
,
"integrity"
,
"is"
,
"ismap"
,
"itemid"
,
"itemprop"
,
"itemref"
,
"itemscope"
,
"itemtype"
,
"keytype"
,
"kind"
,
"label"
,
"lang"
,
"list"
,
"loop"
,
"low"
,
"manifest"
,
"max"
,
"maxlength"
,
"media"
,
"mediagroup"
,
"method"
,
"min"
,
"minlength"
,
"multiple"
,
"muted"
,
"name"
,
"nomodule"
,
"nonce"
,
"novalidate"
,
"open"
,
"optimum"
,
"pattern"
,
"ping"
,
"placeholder"
,
"playsinline"
,
"poster"
,
"preload"
,
"radiogroup"
,
"readonly"
,
"referrerpolicy"
,
"rel"
,
"required"
,
"reversed"
,
"rows"
,
"rowspan"
,
"sandbox"
,
"spellcheck"
,
"scope"
,
"scoped"
,
"seamless"
,
"selected"
,
"shape"
,
"size"
,
"sizes"
,
"sortable"
,
"sorted"
,
"slot"
,
"span"
,
"spellcheck"
,
"src"
,
"srcdoc"
,
"srclang"
,
"srcset"
,
"start"
,
"step"
,
"style"
,
"tabindex"
,
"target"
,
"title"
,
"translate"
,
"type"
,
"typemustmatch"
,
"updateviacache"
,
"usemap"
,
"value"
,
"width"
,
"workertype"
,
"wrap"
,
}
// "onautocomplete", "onautocompleteerror", "onmousewheel",
// "onshow" and "onsort" have been removed from the spec,
// but are kept here for backwards compatibility.
var
eventHandlers
=
[]
string
{
"onabort"
,
"onautocomplete"
,
"onautocompleteerror"
,
"onauxclick"
,
"onafterprint"
,
"onbeforeprint"
,
"onbeforeunload"
,
"onblur"
,
"oncancel"
,
"oncanplay"
,
"oncanplaythrough"
,
"onchange"
,
"onclick"
,
"onclose"
,
"oncontextmenu"
,
"oncopy"
,
"oncuechange"
,
"oncut"
,
"ondblclick"
,
"ondrag"
,
"ondragend"
,
"ondragenter"
,
"ondragexit"
,
"ondragleave"
,
"ondragover"
,
"ondragstart"
,
"ondrop"
,
"ondurationchange"
,
"onemptied"
,
"onended"
,
"onerror"
,
"onfocus"
,
"onhashchange"
,
"oninput"
,
"oninvalid"
,
"onkeydown"
,
"onkeypress"
,
"onkeyup"
,
"onlanguagechange"
,
"onload"
,
"onloadeddata"
,
"onloadedmetadata"
,
"onloadend"
,
"onloadstart"
,
"onmessage"
,
"onmessageerror"
,
"onmousedown"
,
"onmouseenter"
,
"onmouseleave"
,
"onmousemove"
,
"onmouseout"
,
"onmouseover"
,
"onmouseup"
,
"onmousewheel"
,
"onwheel"
,
"onoffline"
,
"ononline"
,
"onpagehide"
,
"onpageshow"
,
"onpaste"
,
"onpause"
,
"onplay"
,
"onplaying"
,
"onpopstate"
,
"onprogress"
,
"onratechange"
,
"onreset"
,
"onresize"
,
"onrejectionhandled"
,
"onscroll"
,
"onsecuritypolicyviolation"
,
"onseeked"
,
"onseeking"
,
"onselect"
,
"onshow"
,
"onsort"
,
"onstalled"
,
"onstorage"
,
"onsubmit"
,
"onsuspend"
,
"ontimeupdate"
,
"ontoggle"
,
"onunhandledrejection"
,
"onunload"
,
"onvolumechange"
,
"onwaiting"
,
}
// extra are ad-hoc values not covered by any of the lists above.
var
extra
=
[]
string
{
"acronym"
,
"align"
,
"annotation"
,
"annotation-xml"
,
"applet"
,
"basefont"
,
"bgsound"
,
"big"
,
"blink"
,
"center"
,
"color"
,
"desc"
,
"face"
,
"font"
,
"foreignObject"
,
// HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive.
"foreignobject"
,
"frame"
,
"frameset"
,
"image"
,
"isindex"
,
"listing"
,
"malignmark"
,
"marquee"
,
"math"
,
"mglyph"
,
"mi"
,
"mn"
,
"mo"
,
"ms"
,
"mtext"
,
"nobr"
,
"noembed"
,
"noframes"
,
"plaintext"
,
"prompt"
,
"public"
,
"rb"
,
"rtc"
,
"spacer"
,
"strike"
,
"svg"
,
"system"
,
"tt"
,
"xmp"
,
}
vendor/golang.org/x/net/internal/iana/gen.go
0 → 100644
View file @
564c1aeb
// Copyright 2013 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
//go:generate go run gen.go
// This program generates internet protocol constants and tables by
// reading IANA protocol registries.
package
main
import
(
"bytes"
"encoding/xml"
"fmt"
"go/format"
"io"
"io/ioutil"
"net/http"
"os"
"strconv"
"strings"
)
var
registries
=
[]
struct
{
url
string
parse
func
(
io
.
Writer
,
io
.
Reader
)
error
}{
{
"https://www.iana.org/assignments/dscp-registry/dscp-registry.xml"
,
parseDSCPRegistry
,
},
{
"https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml"
,
parseProtocolNumbers
,
},
{
"https://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml"
,
parseAddrFamilyNumbers
,
},
}
func
main
()
{
var
bb
bytes
.
Buffer
fmt
.
Fprintf
(
&
bb
,
"// go generate gen.go
\n
"
)
fmt
.
Fprintf
(
&
bb
,
"// Code generated by the command above; DO NOT EDIT.
\n\n
"
)
fmt
.
Fprintf
(
&
bb
,
"// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA).
\n
"
)
fmt
.
Fprintf
(
&
bb
,
`package iana // import "golang.org/x/net/internal/iana"`
+
"
\n\n
"
)
for
_
,
r
:=
range
registries
{
resp
,
err
:=
http
.
Get
(
r
.
url
)
if
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
err
)
os
.
Exit
(
1
)
}
defer
resp
.
Body
.
Close
()
if
resp
.
StatusCode
!=
http
.
StatusOK
{
fmt
.
Fprintf
(
os
.
Stderr
,
"got HTTP status code %v for %v
\n
"
,
resp
.
StatusCode
,
r
.
url
)
os
.
Exit
(
1
)
}
if
err
:=
r
.
parse
(
&
bb
,
resp
.
Body
);
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
err
)
os
.
Exit
(
1
)
}
fmt
.
Fprintf
(
&
bb
,
"
\n
"
)
}
b
,
err
:=
format
.
Source
(
bb
.
Bytes
())
if
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
err
)
os
.
Exit
(
1
)
}
if
err
:=
ioutil
.
WriteFile
(
"const.go"
,
b
,
0644
);
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
err
)
os
.
Exit
(
1
)
}
}
func
parseDSCPRegistry
(
w
io
.
Writer
,
r
io
.
Reader
)
error
{
dec
:=
xml
.
NewDecoder
(
r
)
var
dr
dscpRegistry
if
err
:=
dec
.
Decode
(
&
dr
);
err
!=
nil
{
return
err
}
fmt
.
Fprintf
(
w
,
"// %s, Updated: %s
\n
"
,
dr
.
Title
,
dr
.
Updated
)
fmt
.
Fprintf
(
w
,
"const (
\n
"
)
for
_
,
dr
:=
range
dr
.
escapeDSCP
()
{
fmt
.
Fprintf
(
w
,
"DiffServ%s = %#02x"
,
dr
.
Name
,
dr
.
Value
)
fmt
.
Fprintf
(
w
,
"// %s
\n
"
,
dr
.
OrigName
)
}
for
_
,
er
:=
range
dr
.
escapeECN
()
{
fmt
.
Fprintf
(
w
,
"%s = %#02x"
,
er
.
Descr
,
er
.
Value
)
fmt
.
Fprintf
(
w
,
"// %s
\n
"
,
er
.
OrigDescr
)
}
fmt
.
Fprintf
(
w
,
")
\n
"
)
return
nil
}
type
dscpRegistry
struct
{
XMLName
xml
.
Name
`xml:"registry"`
Title
string
`xml:"title"`
Updated
string
`xml:"updated"`
Note
string
`xml:"note"`
Registries
[]
struct
{
Title
string
`xml:"title"`
Registries
[]
struct
{
Title
string
`xml:"title"`
Records
[]
struct
{
Name
string
`xml:"name"`
Space
string
`xml:"space"`
}
`xml:"record"`
}
`xml:"registry"`
Records
[]
struct
{
Value
string
`xml:"value"`
Descr
string
`xml:"description"`
}
`xml:"record"`
}
`xml:"registry"`
}
type
canonDSCPRecord
struct
{
OrigName
string
Name
string
Value
int
}
func
(
drr
*
dscpRegistry
)
escapeDSCP
()
[]
canonDSCPRecord
{
var
drs
[]
canonDSCPRecord
for
_
,
preg
:=
range
drr
.
Registries
{
if
!
strings
.
Contains
(
preg
.
Title
,
"Differentiated Services Field Codepoints"
)
{
continue
}
for
_
,
reg
:=
range
preg
.
Registries
{
if
!
strings
.
Contains
(
reg
.
Title
,
"Pool 1 Codepoints"
)
{
continue
}
drs
=
make
([]
canonDSCPRecord
,
len
(
reg
.
Records
))
sr
:=
strings
.
NewReplacer
(
"+"
,
""
,
"-"
,
""
,
"/"
,
""
,
"."
,
""
,
" "
,
""
,
)
for
i
,
dr
:=
range
reg
.
Records
{
s
:=
strings
.
TrimSpace
(
dr
.
Name
)
drs
[
i
]
.
OrigName
=
s
drs
[
i
]
.
Name
=
sr
.
Replace
(
s
)
n
,
err
:=
strconv
.
ParseUint
(
dr
.
Space
,
2
,
8
)
if
err
!=
nil
{
continue
}
drs
[
i
]
.
Value
=
int
(
n
)
<<
2
}
}
}
return
drs
}
type
canonECNRecord
struct
{
OrigDescr
string
Descr
string
Value
int
}
func
(
drr
*
dscpRegistry
)
escapeECN
()
[]
canonECNRecord
{
var
ers
[]
canonECNRecord
for
_
,
reg
:=
range
drr
.
Registries
{
if
!
strings
.
Contains
(
reg
.
Title
,
"ECN Field"
)
{
continue
}
ers
=
make
([]
canonECNRecord
,
len
(
reg
.
Records
))
sr
:=
strings
.
NewReplacer
(
"Capable"
,
""
,
"Not-ECT"
,
""
,
"ECT(1)"
,
""
,
"ECT(0)"
,
""
,
"CE"
,
""
,
"("
,
""
,
")"
,
""
,
"+"
,
""
,
"-"
,
""
,
"/"
,
""
,
"."
,
""
,
" "
,
""
,
)
for
i
,
er
:=
range
reg
.
Records
{
s
:=
strings
.
TrimSpace
(
er
.
Descr
)
ers
[
i
]
.
OrigDescr
=
s
ss
:=
strings
.
Split
(
s
,
" "
)
if
len
(
ss
)
>
1
{
ers
[
i
]
.
Descr
=
strings
.
Join
(
ss
[
1
:
],
" "
)
}
else
{
ers
[
i
]
.
Descr
=
ss
[
0
]
}
ers
[
i
]
.
Descr
=
sr
.
Replace
(
er
.
Descr
)
n
,
err
:=
strconv
.
ParseUint
(
er
.
Value
,
2
,
8
)
if
err
!=
nil
{
continue
}
ers
[
i
]
.
Value
=
int
(
n
)
}
}
return
ers
}
func
parseProtocolNumbers
(
w
io
.
Writer
,
r
io
.
Reader
)
error
{
dec
:=
xml
.
NewDecoder
(
r
)
var
pn
protocolNumbers
if
err
:=
dec
.
Decode
(
&
pn
);
err
!=
nil
{
return
err
}
prs
:=
pn
.
escape
()
prs
=
append
([]
canonProtocolRecord
{{
Name
:
"IP"
,
Descr
:
"IPv4 encapsulation, pseudo protocol number"
,
Value
:
0
,
}},
prs
...
)
fmt
.
Fprintf
(
w
,
"// %s, Updated: %s
\n
"
,
pn
.
Title
,
pn
.
Updated
)
fmt
.
Fprintf
(
w
,
"const (
\n
"
)
for
_
,
pr
:=
range
prs
{
if
pr
.
Name
==
""
{
continue
}
fmt
.
Fprintf
(
w
,
"Protocol%s = %d"
,
pr
.
Name
,
pr
.
Value
)
s
:=
pr
.
Descr
if
s
==
""
{
s
=
pr
.
OrigName
}
fmt
.
Fprintf
(
w
,
"// %s
\n
"
,
s
)
}
fmt
.
Fprintf
(
w
,
")
\n
"
)
return
nil
}
type
protocolNumbers
struct
{
XMLName
xml
.
Name
`xml:"registry"`
Title
string
`xml:"title"`
Updated
string
`xml:"updated"`
RegTitle
string
`xml:"registry>title"`
Note
string
`xml:"registry>note"`
Records
[]
struct
{
Value
string
`xml:"value"`
Name
string
`xml:"name"`
Descr
string
`xml:"description"`
}
`xml:"registry>record"`
}
type
canonProtocolRecord
struct
{
OrigName
string
Name
string
Descr
string
Value
int
}
func
(
pn
*
protocolNumbers
)
escape
()
[]
canonProtocolRecord
{
prs
:=
make
([]
canonProtocolRecord
,
len
(
pn
.
Records
))
sr
:=
strings
.
NewReplacer
(
"-in-"
,
"in"
,
"-within-"
,
"within"
,
"-over-"
,
"over"
,
"+"
,
"P"
,
"-"
,
""
,
"/"
,
""
,
"."
,
""
,
" "
,
""
,
)
for
i
,
pr
:=
range
pn
.
Records
{
if
strings
.
Contains
(
pr
.
Name
,
"Deprecated"
)
||
strings
.
Contains
(
pr
.
Name
,
"deprecated"
)
{
continue
}
prs
[
i
]
.
OrigName
=
pr
.
Name
s
:=
strings
.
TrimSpace
(
pr
.
Name
)
switch
pr
.
Name
{
case
"ISIS over IPv4"
:
prs
[
i
]
.
Name
=
"ISIS"
case
"manet"
:
prs
[
i
]
.
Name
=
"MANET"
default
:
prs
[
i
]
.
Name
=
sr
.
Replace
(
s
)
}
ss
:=
strings
.
Split
(
pr
.
Descr
,
"
\n
"
)
for
i
:=
range
ss
{
ss
[
i
]
=
strings
.
TrimSpace
(
ss
[
i
])
}
if
len
(
ss
)
>
1
{
prs
[
i
]
.
Descr
=
strings
.
Join
(
ss
,
" "
)
}
else
{
prs
[
i
]
.
Descr
=
ss
[
0
]
}
prs
[
i
]
.
Value
,
_
=
strconv
.
Atoi
(
pr
.
Value
)
}
return
prs
}
func
parseAddrFamilyNumbers
(
w
io
.
Writer
,
r
io
.
Reader
)
error
{
dec
:=
xml
.
NewDecoder
(
r
)
var
afn
addrFamilylNumbers
if
err
:=
dec
.
Decode
(
&
afn
);
err
!=
nil
{
return
err
}
afrs
:=
afn
.
escape
()
fmt
.
Fprintf
(
w
,
"// %s, Updated: %s
\n
"
,
afn
.
Title
,
afn
.
Updated
)
fmt
.
Fprintf
(
w
,
"const (
\n
"
)
for
_
,
afr
:=
range
afrs
{
if
afr
.
Name
==
""
{
continue
}
fmt
.
Fprintf
(
w
,
"AddrFamily%s = %d"
,
afr
.
Name
,
afr
.
Value
)
fmt
.
Fprintf
(
w
,
"// %s
\n
"
,
afr
.
Descr
)
}
fmt
.
Fprintf
(
w
,
")
\n
"
)
return
nil
}
type
addrFamilylNumbers
struct
{
XMLName
xml
.
Name
`xml:"registry"`
Title
string
`xml:"title"`
Updated
string
`xml:"updated"`
RegTitle
string
`xml:"registry>title"`
Note
string
`xml:"registry>note"`
Records
[]
struct
{
Value
string
`xml:"value"`
Descr
string
`xml:"description"`
}
`xml:"registry>record"`
}
type
canonAddrFamilyRecord
struct
{
Name
string
Descr
string
Value
int
}
func
(
afn
*
addrFamilylNumbers
)
escape
()
[]
canonAddrFamilyRecord
{
afrs
:=
make
([]
canonAddrFamilyRecord
,
len
(
afn
.
Records
))
sr
:=
strings
.
NewReplacer
(
"IP version 4"
,
"IPv4"
,
"IP version 6"
,
"IPv6"
,
"Identifier"
,
"ID"
,
"-"
,
""
,
"-"
,
""
,
"/"
,
""
,
"."
,
""
,
" "
,
""
,
)
for
i
,
afr
:=
range
afn
.
Records
{
if
strings
.
Contains
(
afr
.
Descr
,
"Unassigned"
)
||
strings
.
Contains
(
afr
.
Descr
,
"Reserved"
)
{
continue
}
afrs
[
i
]
.
Descr
=
afr
.
Descr
s
:=
strings
.
TrimSpace
(
afr
.
Descr
)
switch
s
{
case
"IP (IP version 4)"
:
afrs
[
i
]
.
Name
=
"IPv4"
case
"IP6 (IP version 6)"
:
afrs
[
i
]
.
Name
=
"IPv6"
case
"AFI for L2VPN information"
:
afrs
[
i
]
.
Name
=
"L2VPN"
case
"E.164 with NSAP format subaddress"
:
afrs
[
i
]
.
Name
=
"E164withSubaddress"
case
"MT IP: Multi-Topology IP version 4"
:
afrs
[
i
]
.
Name
=
"MTIPv4"
case
"MAC/24"
:
afrs
[
i
]
.
Name
=
"MACFinal24bits"
case
"MAC/40"
:
afrs
[
i
]
.
Name
=
"MACFinal40bits"
case
"IPv6/64"
:
afrs
[
i
]
.
Name
=
"IPv6Initial64bits"
default
:
n
:=
strings
.
Index
(
s
,
"("
)
if
n
>
0
{
s
=
s
[
:
n
]
}
n
=
strings
.
Index
(
s
,
":"
)
if
n
>
0
{
s
=
s
[
:
n
]
}
afrs
[
i
]
.
Name
=
sr
.
Replace
(
s
)
}
afrs
[
i
]
.
Value
,
_
=
strconv
.
Atoi
(
afr
.
Value
)
}
return
afrs
}
vendor/golang.org/x/net/internal/socket/defs_darwin.go
0 → 100644
View file @
564c1aeb
// Copyright 2017 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
// +godefs map struct_in_addr [4]byte /* in_addr */
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
socket
/*
#include <sys/socket.h>
#include <netinet/in.h>
*/
import
"C"
const
(
sysAF_UNSPEC
=
C
.
AF_UNSPEC
sysAF_INET
=
C
.
AF_INET
sysAF_INET6
=
C
.
AF_INET6
sysSOCK_RAW
=
C
.
SOCK_RAW
)
type
iovec
C
.
struct_iovec
type
msghdr
C
.
struct_msghdr
type
cmsghdr
C
.
struct_cmsghdr
type
sockaddrInet
C
.
struct_sockaddr_in
type
sockaddrInet6
C
.
struct_sockaddr_in6
const
(
sizeofIovec
=
C
.
sizeof_struct_iovec
sizeofMsghdr
=
C
.
sizeof_struct_msghdr
sizeofCmsghdr
=
C
.
sizeof_struct_cmsghdr
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
)
vendor/golang.org/x/net/internal/socket/defs_dragonfly.go
0 → 100644
View file @
564c1aeb
// Copyright 2017 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
// +godefs map struct_in_addr [4]byte /* in_addr */
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
socket
/*
#include <sys/socket.h>
#include <netinet/in.h>
*/
import
"C"
const
(
sysAF_UNSPEC
=
C
.
AF_UNSPEC
sysAF_INET
=
C
.
AF_INET
sysAF_INET6
=
C
.
AF_INET6
sysSOCK_RAW
=
C
.
SOCK_RAW
)
type
iovec
C
.
struct_iovec
type
msghdr
C
.
struct_msghdr
type
cmsghdr
C
.
struct_cmsghdr
type
sockaddrInet
C
.
struct_sockaddr_in
type
sockaddrInet6
C
.
struct_sockaddr_in6
const
(
sizeofIovec
=
C
.
sizeof_struct_iovec
sizeofMsghdr
=
C
.
sizeof_struct_msghdr
sizeofCmsghdr
=
C
.
sizeof_struct_cmsghdr
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
)
vendor/golang.org/x/net/internal/socket/defs_freebsd.go
0 → 100644
View file @
564c1aeb
// Copyright 2017 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
// +godefs map struct_in_addr [4]byte /* in_addr */
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
socket
/*
#include <sys/socket.h>
#include <netinet/in.h>
*/
import
"C"
const
(
sysAF_UNSPEC
=
C
.
AF_UNSPEC
sysAF_INET
=
C
.
AF_INET
sysAF_INET6
=
C
.
AF_INET6
sysSOCK_RAW
=
C
.
SOCK_RAW
)
type
iovec
C
.
struct_iovec
type
msghdr
C
.
struct_msghdr
type
cmsghdr
C
.
struct_cmsghdr
type
sockaddrInet
C
.
struct_sockaddr_in
type
sockaddrInet6
C
.
struct_sockaddr_in6
const
(
sizeofIovec
=
C
.
sizeof_struct_iovec
sizeofMsghdr
=
C
.
sizeof_struct_msghdr
sizeofCmsghdr
=
C
.
sizeof_struct_cmsghdr
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
)
vendor/golang.org/x/net/internal/socket/defs_linux.go
0 → 100644
View file @
564c1aeb
// Copyright 2017 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
// +godefs map struct_in_addr [4]byte /* in_addr */
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
socket
/*
#include <linux/in.h>
#include <linux/in6.h>
#define _GNU_SOURCE
#include <sys/socket.h>
*/
import
"C"
const
(
sysAF_UNSPEC
=
C
.
AF_UNSPEC
sysAF_INET
=
C
.
AF_INET
sysAF_INET6
=
C
.
AF_INET6
sysSOCK_RAW
=
C
.
SOCK_RAW
)
type
iovec
C
.
struct_iovec
type
msghdr
C
.
struct_msghdr
type
mmsghdr
C
.
struct_mmsghdr
type
cmsghdr
C
.
struct_cmsghdr
type
sockaddrInet
C
.
struct_sockaddr_in
type
sockaddrInet6
C
.
struct_sockaddr_in6
const
(
sizeofIovec
=
C
.
sizeof_struct_iovec
sizeofMsghdr
=
C
.
sizeof_struct_msghdr
sizeofMmsghdr
=
C
.
sizeof_struct_mmsghdr
sizeofCmsghdr
=
C
.
sizeof_struct_cmsghdr
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
)
vendor/golang.org/x/net/internal/socket/defs_netbsd.go
0 → 100644
View file @
564c1aeb
// Copyright 2017 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
// +godefs map struct_in_addr [4]byte /* in_addr */
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
socket
/*
#include <sys/socket.h>
#include <netinet/in.h>
*/
import
"C"
const
(
sysAF_UNSPEC
=
C
.
AF_UNSPEC
sysAF_INET
=
C
.
AF_INET
sysAF_INET6
=
C
.
AF_INET6
sysSOCK_RAW
=
C
.
SOCK_RAW
)
type
iovec
C
.
struct_iovec
type
msghdr
C
.
struct_msghdr
type
mmsghdr
C
.
struct_mmsghdr
type
cmsghdr
C
.
struct_cmsghdr
type
sockaddrInet
C
.
struct_sockaddr_in
type
sockaddrInet6
C
.
struct_sockaddr_in6
const
(
sizeofIovec
=
C
.
sizeof_struct_iovec
sizeofMsghdr
=
C
.
sizeof_struct_msghdr
sizeofMmsghdr
=
C
.
sizeof_struct_mmsghdr
sizeofCmsghdr
=
C
.
sizeof_struct_cmsghdr
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
)
vendor/golang.org/x/net/internal/socket/defs_openbsd.go
0 → 100644
View file @
564c1aeb
// Copyright 2017 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
// +godefs map struct_in_addr [4]byte /* in_addr */
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
socket
/*
#include <sys/socket.h>
#include <netinet/in.h>
*/
import
"C"
const
(
sysAF_UNSPEC
=
C
.
AF_UNSPEC
sysAF_INET
=
C
.
AF_INET
sysAF_INET6
=
C
.
AF_INET6
sysSOCK_RAW
=
C
.
SOCK_RAW
)
type
iovec
C
.
struct_iovec
type
msghdr
C
.
struct_msghdr
type
cmsghdr
C
.
struct_cmsghdr
type
sockaddrInet
C
.
struct_sockaddr_in
type
sockaddrInet6
C
.
struct_sockaddr_in6
const
(
sizeofIovec
=
C
.
sizeof_struct_iovec
sizeofMsghdr
=
C
.
sizeof_struct_msghdr
sizeofCmsghdr
=
C
.
sizeof_struct_cmsghdr
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
)
vendor/golang.org/x/net/internal/socket/defs_solaris.go
0 → 100644
View file @
564c1aeb
// Copyright 2017 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
// +godefs map struct_in_addr [4]byte /* in_addr */
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
socket
/*
#include <sys/socket.h>
#include <netinet/in.h>
*/
import
"C"
const
(
sysAF_UNSPEC
=
C
.
AF_UNSPEC
sysAF_INET
=
C
.
AF_INET
sysAF_INET6
=
C
.
AF_INET6
sysSOCK_RAW
=
C
.
SOCK_RAW
)
type
iovec
C
.
struct_iovec
type
msghdr
C
.
struct_msghdr
type
cmsghdr
C
.
struct_cmsghdr
type
sockaddrInet
C
.
struct_sockaddr_in
type
sockaddrInet6
C
.
struct_sockaddr_in6
const
(
sizeofIovec
=
C
.
sizeof_struct_iovec
sizeofMsghdr
=
C
.
sizeof_struct_msghdr
sizeofCmsghdr
=
C
.
sizeof_struct_cmsghdr
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
)
vendor/golang.org/x/net/ipv4/defs_darwin.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in_addr [4]byte /* in_addr */
package
ipv4
/*
#include <sys/socket.h>
#include <netinet/in.h>
*/
import
"C"
const
(
sysIP_OPTIONS
=
C
.
IP_OPTIONS
sysIP_HDRINCL
=
C
.
IP_HDRINCL
sysIP_TOS
=
C
.
IP_TOS
sysIP_TTL
=
C
.
IP_TTL
sysIP_RECVOPTS
=
C
.
IP_RECVOPTS
sysIP_RECVRETOPTS
=
C
.
IP_RECVRETOPTS
sysIP_RECVDSTADDR
=
C
.
IP_RECVDSTADDR
sysIP_RETOPTS
=
C
.
IP_RETOPTS
sysIP_RECVIF
=
C
.
IP_RECVIF
sysIP_STRIPHDR
=
C
.
IP_STRIPHDR
sysIP_RECVTTL
=
C
.
IP_RECVTTL
sysIP_BOUND_IF
=
C
.
IP_BOUND_IF
sysIP_PKTINFO
=
C
.
IP_PKTINFO
sysIP_RECVPKTINFO
=
C
.
IP_RECVPKTINFO
sysIP_MULTICAST_IF
=
C
.
IP_MULTICAST_IF
sysIP_MULTICAST_TTL
=
C
.
IP_MULTICAST_TTL
sysIP_MULTICAST_LOOP
=
C
.
IP_MULTICAST_LOOP
sysIP_ADD_MEMBERSHIP
=
C
.
IP_ADD_MEMBERSHIP
sysIP_DROP_MEMBERSHIP
=
C
.
IP_DROP_MEMBERSHIP
sysIP_MULTICAST_VIF
=
C
.
IP_MULTICAST_VIF
sysIP_MULTICAST_IFINDEX
=
C
.
IP_MULTICAST_IFINDEX
sysIP_ADD_SOURCE_MEMBERSHIP
=
C
.
IP_ADD_SOURCE_MEMBERSHIP
sysIP_DROP_SOURCE_MEMBERSHIP
=
C
.
IP_DROP_SOURCE_MEMBERSHIP
sysIP_BLOCK_SOURCE
=
C
.
IP_BLOCK_SOURCE
sysIP_UNBLOCK_SOURCE
=
C
.
IP_UNBLOCK_SOURCE
sysMCAST_JOIN_GROUP
=
C
.
MCAST_JOIN_GROUP
sysMCAST_LEAVE_GROUP
=
C
.
MCAST_LEAVE_GROUP
sysMCAST_JOIN_SOURCE_GROUP
=
C
.
MCAST_JOIN_SOURCE_GROUP
sysMCAST_LEAVE_SOURCE_GROUP
=
C
.
MCAST_LEAVE_SOURCE_GROUP
sysMCAST_BLOCK_SOURCE
=
C
.
MCAST_BLOCK_SOURCE
sysMCAST_UNBLOCK_SOURCE
=
C
.
MCAST_UNBLOCK_SOURCE
sizeofSockaddrStorage
=
C
.
sizeof_struct_sockaddr_storage
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofInetPktinfo
=
C
.
sizeof_struct_in_pktinfo
sizeofIPMreq
=
C
.
sizeof_struct_ip_mreq
sizeofIPMreqn
=
C
.
sizeof_struct_ip_mreqn
sizeofIPMreqSource
=
C
.
sizeof_struct_ip_mreq_source
sizeofGroupReq
=
C
.
sizeof_struct_group_req
sizeofGroupSourceReq
=
C
.
sizeof_struct_group_source_req
)
type
sockaddrStorage
C
.
struct_sockaddr_storage
type
sockaddrInet
C
.
struct_sockaddr_in
type
inetPktinfo
C
.
struct_in_pktinfo
type
ipMreq
C
.
struct_ip_mreq
type
ipMreqn
C
.
struct_ip_mreqn
type
ipMreqSource
C
.
struct_ip_mreq_source
type
groupReq
C
.
struct_group_req
type
groupSourceReq
C
.
struct_group_source_req
vendor/golang.org/x/net/ipv4/defs_dragonfly.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in_addr [4]byte /* in_addr */
package
ipv4
/*
#include <netinet/in.h>
*/
import
"C"
const
(
sysIP_OPTIONS
=
C
.
IP_OPTIONS
sysIP_HDRINCL
=
C
.
IP_HDRINCL
sysIP_TOS
=
C
.
IP_TOS
sysIP_TTL
=
C
.
IP_TTL
sysIP_RECVOPTS
=
C
.
IP_RECVOPTS
sysIP_RECVRETOPTS
=
C
.
IP_RECVRETOPTS
sysIP_RECVDSTADDR
=
C
.
IP_RECVDSTADDR
sysIP_RETOPTS
=
C
.
IP_RETOPTS
sysIP_RECVIF
=
C
.
IP_RECVIF
sysIP_RECVTTL
=
C
.
IP_RECVTTL
sysIP_MULTICAST_IF
=
C
.
IP_MULTICAST_IF
sysIP_MULTICAST_TTL
=
C
.
IP_MULTICAST_TTL
sysIP_MULTICAST_LOOP
=
C
.
IP_MULTICAST_LOOP
sysIP_MULTICAST_VIF
=
C
.
IP_MULTICAST_VIF
sysIP_ADD_MEMBERSHIP
=
C
.
IP_ADD_MEMBERSHIP
sysIP_DROP_MEMBERSHIP
=
C
.
IP_DROP_MEMBERSHIP
sizeofIPMreq
=
C
.
sizeof_struct_ip_mreq
)
type
ipMreq
C
.
struct_ip_mreq
vendor/golang.org/x/net/ipv4/defs_freebsd.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in_addr [4]byte /* in_addr */
package
ipv4
/*
#include <sys/socket.h>
#include <netinet/in.h>
*/
import
"C"
const
(
sysIP_OPTIONS
=
C
.
IP_OPTIONS
sysIP_HDRINCL
=
C
.
IP_HDRINCL
sysIP_TOS
=
C
.
IP_TOS
sysIP_TTL
=
C
.
IP_TTL
sysIP_RECVOPTS
=
C
.
IP_RECVOPTS
sysIP_RECVRETOPTS
=
C
.
IP_RECVRETOPTS
sysIP_RECVDSTADDR
=
C
.
IP_RECVDSTADDR
sysIP_SENDSRCADDR
=
C
.
IP_SENDSRCADDR
sysIP_RETOPTS
=
C
.
IP_RETOPTS
sysIP_RECVIF
=
C
.
IP_RECVIF
sysIP_ONESBCAST
=
C
.
IP_ONESBCAST
sysIP_BINDANY
=
C
.
IP_BINDANY
sysIP_RECVTTL
=
C
.
IP_RECVTTL
sysIP_MINTTL
=
C
.
IP_MINTTL
sysIP_DONTFRAG
=
C
.
IP_DONTFRAG
sysIP_RECVTOS
=
C
.
IP_RECVTOS
sysIP_MULTICAST_IF
=
C
.
IP_MULTICAST_IF
sysIP_MULTICAST_TTL
=
C
.
IP_MULTICAST_TTL
sysIP_MULTICAST_LOOP
=
C
.
IP_MULTICAST_LOOP
sysIP_ADD_MEMBERSHIP
=
C
.
IP_ADD_MEMBERSHIP
sysIP_DROP_MEMBERSHIP
=
C
.
IP_DROP_MEMBERSHIP
sysIP_MULTICAST_VIF
=
C
.
IP_MULTICAST_VIF
sysIP_ADD_SOURCE_MEMBERSHIP
=
C
.
IP_ADD_SOURCE_MEMBERSHIP
sysIP_DROP_SOURCE_MEMBERSHIP
=
C
.
IP_DROP_SOURCE_MEMBERSHIP
sysIP_BLOCK_SOURCE
=
C
.
IP_BLOCK_SOURCE
sysIP_UNBLOCK_SOURCE
=
C
.
IP_UNBLOCK_SOURCE
sysMCAST_JOIN_GROUP
=
C
.
MCAST_JOIN_GROUP
sysMCAST_LEAVE_GROUP
=
C
.
MCAST_LEAVE_GROUP
sysMCAST_JOIN_SOURCE_GROUP
=
C
.
MCAST_JOIN_SOURCE_GROUP
sysMCAST_LEAVE_SOURCE_GROUP
=
C
.
MCAST_LEAVE_SOURCE_GROUP
sysMCAST_BLOCK_SOURCE
=
C
.
MCAST_BLOCK_SOURCE
sysMCAST_UNBLOCK_SOURCE
=
C
.
MCAST_UNBLOCK_SOURCE
sizeofSockaddrStorage
=
C
.
sizeof_struct_sockaddr_storage
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofIPMreq
=
C
.
sizeof_struct_ip_mreq
sizeofIPMreqn
=
C
.
sizeof_struct_ip_mreqn
sizeofIPMreqSource
=
C
.
sizeof_struct_ip_mreq_source
sizeofGroupReq
=
C
.
sizeof_struct_group_req
sizeofGroupSourceReq
=
C
.
sizeof_struct_group_source_req
)
type
sockaddrStorage
C
.
struct_sockaddr_storage
type
sockaddrInet
C
.
struct_sockaddr_in
type
ipMreq
C
.
struct_ip_mreq
type
ipMreqn
C
.
struct_ip_mreqn
type
ipMreqSource
C
.
struct_ip_mreq_source
type
groupReq
C
.
struct_group_req
type
groupSourceReq
C
.
struct_group_source_req
vendor/golang.org/x/net/ipv4/defs_linux.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in_addr [4]byte /* in_addr */
package
ipv4
/*
#include <time.h>
#include <linux/errqueue.h>
#include <linux/icmp.h>
#include <linux/in.h>
#include <linux/filter.h>
#include <sys/socket.h>
*/
import
"C"
const
(
sysIP_TOS
=
C
.
IP_TOS
sysIP_TTL
=
C
.
IP_TTL
sysIP_HDRINCL
=
C
.
IP_HDRINCL
sysIP_OPTIONS
=
C
.
IP_OPTIONS
sysIP_ROUTER_ALERT
=
C
.
IP_ROUTER_ALERT
sysIP_RECVOPTS
=
C
.
IP_RECVOPTS
sysIP_RETOPTS
=
C
.
IP_RETOPTS
sysIP_PKTINFO
=
C
.
IP_PKTINFO
sysIP_PKTOPTIONS
=
C
.
IP_PKTOPTIONS
sysIP_MTU_DISCOVER
=
C
.
IP_MTU_DISCOVER
sysIP_RECVERR
=
C
.
IP_RECVERR
sysIP_RECVTTL
=
C
.
IP_RECVTTL
sysIP_RECVTOS
=
C
.
IP_RECVTOS
sysIP_MTU
=
C
.
IP_MTU
sysIP_FREEBIND
=
C
.
IP_FREEBIND
sysIP_TRANSPARENT
=
C
.
IP_TRANSPARENT
sysIP_RECVRETOPTS
=
C
.
IP_RECVRETOPTS
sysIP_ORIGDSTADDR
=
C
.
IP_ORIGDSTADDR
sysIP_RECVORIGDSTADDR
=
C
.
IP_RECVORIGDSTADDR
sysIP_MINTTL
=
C
.
IP_MINTTL
sysIP_NODEFRAG
=
C
.
IP_NODEFRAG
sysIP_UNICAST_IF
=
C
.
IP_UNICAST_IF
sysIP_MULTICAST_IF
=
C
.
IP_MULTICAST_IF
sysIP_MULTICAST_TTL
=
C
.
IP_MULTICAST_TTL
sysIP_MULTICAST_LOOP
=
C
.
IP_MULTICAST_LOOP
sysIP_ADD_MEMBERSHIP
=
C
.
IP_ADD_MEMBERSHIP
sysIP_DROP_MEMBERSHIP
=
C
.
IP_DROP_MEMBERSHIP
sysIP_UNBLOCK_SOURCE
=
C
.
IP_UNBLOCK_SOURCE
sysIP_BLOCK_SOURCE
=
C
.
IP_BLOCK_SOURCE
sysIP_ADD_SOURCE_MEMBERSHIP
=
C
.
IP_ADD_SOURCE_MEMBERSHIP
sysIP_DROP_SOURCE_MEMBERSHIP
=
C
.
IP_DROP_SOURCE_MEMBERSHIP
sysIP_MSFILTER
=
C
.
IP_MSFILTER
sysMCAST_JOIN_GROUP
=
C
.
MCAST_JOIN_GROUP
sysMCAST_LEAVE_GROUP
=
C
.
MCAST_LEAVE_GROUP
sysMCAST_JOIN_SOURCE_GROUP
=
C
.
MCAST_JOIN_SOURCE_GROUP
sysMCAST_LEAVE_SOURCE_GROUP
=
C
.
MCAST_LEAVE_SOURCE_GROUP
sysMCAST_BLOCK_SOURCE
=
C
.
MCAST_BLOCK_SOURCE
sysMCAST_UNBLOCK_SOURCE
=
C
.
MCAST_UNBLOCK_SOURCE
sysMCAST_MSFILTER
=
C
.
MCAST_MSFILTER
sysIP_MULTICAST_ALL
=
C
.
IP_MULTICAST_ALL
//sysIP_PMTUDISC_DONT = C.IP_PMTUDISC_DONT
//sysIP_PMTUDISC_WANT = C.IP_PMTUDISC_WANT
//sysIP_PMTUDISC_DO = C.IP_PMTUDISC_DO
//sysIP_PMTUDISC_PROBE = C.IP_PMTUDISC_PROBE
//sysIP_PMTUDISC_INTERFACE = C.IP_PMTUDISC_INTERFACE
//sysIP_PMTUDISC_OMIT = C.IP_PMTUDISC_OMIT
sysICMP_FILTER
=
C
.
ICMP_FILTER
sysSO_EE_ORIGIN_NONE
=
C
.
SO_EE_ORIGIN_NONE
sysSO_EE_ORIGIN_LOCAL
=
C
.
SO_EE_ORIGIN_LOCAL
sysSO_EE_ORIGIN_ICMP
=
C
.
SO_EE_ORIGIN_ICMP
sysSO_EE_ORIGIN_ICMP6
=
C
.
SO_EE_ORIGIN_ICMP6
sysSO_EE_ORIGIN_TXSTATUS
=
C
.
SO_EE_ORIGIN_TXSTATUS
sysSO_EE_ORIGIN_TIMESTAMPING
=
C
.
SO_EE_ORIGIN_TIMESTAMPING
sysSOL_SOCKET
=
C
.
SOL_SOCKET
sysSO_ATTACH_FILTER
=
C
.
SO_ATTACH_FILTER
sizeofKernelSockaddrStorage
=
C
.
sizeof_struct___kernel_sockaddr_storage
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofInetPktinfo
=
C
.
sizeof_struct_in_pktinfo
sizeofSockExtendedErr
=
C
.
sizeof_struct_sock_extended_err
sizeofIPMreq
=
C
.
sizeof_struct_ip_mreq
sizeofIPMreqn
=
C
.
sizeof_struct_ip_mreqn
sizeofIPMreqSource
=
C
.
sizeof_struct_ip_mreq_source
sizeofGroupReq
=
C
.
sizeof_struct_group_req
sizeofGroupSourceReq
=
C
.
sizeof_struct_group_source_req
sizeofICMPFilter
=
C
.
sizeof_struct_icmp_filter
sizeofSockFprog
=
C
.
sizeof_struct_sock_fprog
)
type
kernelSockaddrStorage
C
.
struct___kernel_sockaddr_storage
type
sockaddrInet
C
.
struct_sockaddr_in
type
inetPktinfo
C
.
struct_in_pktinfo
type
sockExtendedErr
C
.
struct_sock_extended_err
type
ipMreq
C
.
struct_ip_mreq
type
ipMreqn
C
.
struct_ip_mreqn
type
ipMreqSource
C
.
struct_ip_mreq_source
type
groupReq
C
.
struct_group_req
type
groupSourceReq
C
.
struct_group_source_req
type
icmpFilter
C
.
struct_icmp_filter
type
sockFProg
C
.
struct_sock_fprog
type
sockFilter
C
.
struct_sock_filter
vendor/golang.org/x/net/ipv4/defs_netbsd.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in_addr [4]byte /* in_addr */
package
ipv4
/*
#include <netinet/in.h>
*/
import
"C"
const
(
sysIP_OPTIONS
=
C
.
IP_OPTIONS
sysIP_HDRINCL
=
C
.
IP_HDRINCL
sysIP_TOS
=
C
.
IP_TOS
sysIP_TTL
=
C
.
IP_TTL
sysIP_RECVOPTS
=
C
.
IP_RECVOPTS
sysIP_RECVRETOPTS
=
C
.
IP_RECVRETOPTS
sysIP_RECVDSTADDR
=
C
.
IP_RECVDSTADDR
sysIP_RETOPTS
=
C
.
IP_RETOPTS
sysIP_RECVIF
=
C
.
IP_RECVIF
sysIP_RECVTTL
=
C
.
IP_RECVTTL
sysIP_MULTICAST_IF
=
C
.
IP_MULTICAST_IF
sysIP_MULTICAST_TTL
=
C
.
IP_MULTICAST_TTL
sysIP_MULTICAST_LOOP
=
C
.
IP_MULTICAST_LOOP
sysIP_ADD_MEMBERSHIP
=
C
.
IP_ADD_MEMBERSHIP
sysIP_DROP_MEMBERSHIP
=
C
.
IP_DROP_MEMBERSHIP
sizeofIPMreq
=
C
.
sizeof_struct_ip_mreq
)
type
ipMreq
C
.
struct_ip_mreq
vendor/golang.org/x/net/ipv4/defs_openbsd.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in_addr [4]byte /* in_addr */
package
ipv4
/*
#include <netinet/in.h>
*/
import
"C"
const
(
sysIP_OPTIONS
=
C
.
IP_OPTIONS
sysIP_HDRINCL
=
C
.
IP_HDRINCL
sysIP_TOS
=
C
.
IP_TOS
sysIP_TTL
=
C
.
IP_TTL
sysIP_RECVOPTS
=
C
.
IP_RECVOPTS
sysIP_RECVRETOPTS
=
C
.
IP_RECVRETOPTS
sysIP_RECVDSTADDR
=
C
.
IP_RECVDSTADDR
sysIP_RETOPTS
=
C
.
IP_RETOPTS
sysIP_RECVIF
=
C
.
IP_RECVIF
sysIP_RECVTTL
=
C
.
IP_RECVTTL
sysIP_MULTICAST_IF
=
C
.
IP_MULTICAST_IF
sysIP_MULTICAST_TTL
=
C
.
IP_MULTICAST_TTL
sysIP_MULTICAST_LOOP
=
C
.
IP_MULTICAST_LOOP
sysIP_ADD_MEMBERSHIP
=
C
.
IP_ADD_MEMBERSHIP
sysIP_DROP_MEMBERSHIP
=
C
.
IP_DROP_MEMBERSHIP
sizeofIPMreq
=
C
.
sizeof_struct_ip_mreq
)
type
ipMreq
C
.
struct_ip_mreq
vendor/golang.org/x/net/ipv4/defs_solaris.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in_addr [4]byte /* in_addr */
package
ipv4
/*
#include <sys/socket.h>
#include <netinet/in.h>
*/
import
"C"
const
(
sysIP_OPTIONS
=
C
.
IP_OPTIONS
sysIP_HDRINCL
=
C
.
IP_HDRINCL
sysIP_TOS
=
C
.
IP_TOS
sysIP_TTL
=
C
.
IP_TTL
sysIP_RECVOPTS
=
C
.
IP_RECVOPTS
sysIP_RECVRETOPTS
=
C
.
IP_RECVRETOPTS
sysIP_RECVDSTADDR
=
C
.
IP_RECVDSTADDR
sysIP_RETOPTS
=
C
.
IP_RETOPTS
sysIP_RECVIF
=
C
.
IP_RECVIF
sysIP_RECVSLLA
=
C
.
IP_RECVSLLA
sysIP_RECVTTL
=
C
.
IP_RECVTTL
sysIP_MULTICAST_IF
=
C
.
IP_MULTICAST_IF
sysIP_MULTICAST_TTL
=
C
.
IP_MULTICAST_TTL
sysIP_MULTICAST_LOOP
=
C
.
IP_MULTICAST_LOOP
sysIP_ADD_MEMBERSHIP
=
C
.
IP_ADD_MEMBERSHIP
sysIP_DROP_MEMBERSHIP
=
C
.
IP_DROP_MEMBERSHIP
sysIP_BLOCK_SOURCE
=
C
.
IP_BLOCK_SOURCE
sysIP_UNBLOCK_SOURCE
=
C
.
IP_UNBLOCK_SOURCE
sysIP_ADD_SOURCE_MEMBERSHIP
=
C
.
IP_ADD_SOURCE_MEMBERSHIP
sysIP_DROP_SOURCE_MEMBERSHIP
=
C
.
IP_DROP_SOURCE_MEMBERSHIP
sysIP_NEXTHOP
=
C
.
IP_NEXTHOP
sysIP_PKTINFO
=
C
.
IP_PKTINFO
sysIP_RECVPKTINFO
=
C
.
IP_RECVPKTINFO
sysIP_DONTFRAG
=
C
.
IP_DONTFRAG
sysIP_BOUND_IF
=
C
.
IP_BOUND_IF
sysIP_UNSPEC_SRC
=
C
.
IP_UNSPEC_SRC
sysIP_BROADCAST_TTL
=
C
.
IP_BROADCAST_TTL
sysIP_DHCPINIT_IF
=
C
.
IP_DHCPINIT_IF
sysIP_REUSEADDR
=
C
.
IP_REUSEADDR
sysIP_DONTROUTE
=
C
.
IP_DONTROUTE
sysIP_BROADCAST
=
C
.
IP_BROADCAST
sysMCAST_JOIN_GROUP
=
C
.
MCAST_JOIN_GROUP
sysMCAST_LEAVE_GROUP
=
C
.
MCAST_LEAVE_GROUP
sysMCAST_BLOCK_SOURCE
=
C
.
MCAST_BLOCK_SOURCE
sysMCAST_UNBLOCK_SOURCE
=
C
.
MCAST_UNBLOCK_SOURCE
sysMCAST_JOIN_SOURCE_GROUP
=
C
.
MCAST_JOIN_SOURCE_GROUP
sysMCAST_LEAVE_SOURCE_GROUP
=
C
.
MCAST_LEAVE_SOURCE_GROUP
sizeofSockaddrStorage
=
C
.
sizeof_struct_sockaddr_storage
sizeofSockaddrInet
=
C
.
sizeof_struct_sockaddr_in
sizeofInetPktinfo
=
C
.
sizeof_struct_in_pktinfo
sizeofIPMreq
=
C
.
sizeof_struct_ip_mreq
sizeofIPMreqSource
=
C
.
sizeof_struct_ip_mreq_source
sizeofGroupReq
=
C
.
sizeof_struct_group_req
sizeofGroupSourceReq
=
C
.
sizeof_struct_group_source_req
)
type
sockaddrStorage
C
.
struct_sockaddr_storage
type
sockaddrInet
C
.
struct_sockaddr_in
type
inetPktinfo
C
.
struct_in_pktinfo
type
ipMreq
C
.
struct_ip_mreq
type
ipMreqSource
C
.
struct_ip_mreq_source
type
groupReq
C
.
struct_group_req
type
groupSourceReq
C
.
struct_group_source_req
vendor/golang.org/x/net/ipv4/gen.go
0 → 100644
View file @
564c1aeb
// Copyright 2013 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
//go:generate go run gen.go
// This program generates system adaptation constants and types,
// internet protocol constants and tables by reading template files
// and IANA protocol registries.
package
main
import
(
"bytes"
"encoding/xml"
"fmt"
"go/format"
"io"
"io/ioutil"
"net/http"
"os"
"os/exec"
"runtime"
"strconv"
"strings"
)
func
main
()
{
if
err
:=
genzsys
();
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
err
)
os
.
Exit
(
1
)
}
if
err
:=
geniana
();
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
err
)
os
.
Exit
(
1
)
}
}
func
genzsys
()
error
{
defs
:=
"defs_"
+
runtime
.
GOOS
+
".go"
f
,
err
:=
os
.
Open
(
defs
)
if
err
!=
nil
{
if
os
.
IsNotExist
(
err
)
{
return
nil
}
return
err
}
f
.
Close
()
cmd
:=
exec
.
Command
(
"go"
,
"tool"
,
"cgo"
,
"-godefs"
,
defs
)
b
,
err
:=
cmd
.
Output
()
if
err
!=
nil
{
return
err
}
b
,
err
=
format
.
Source
(
b
)
if
err
!=
nil
{
return
err
}
zsys
:=
"zsys_"
+
runtime
.
GOOS
+
".go"
switch
runtime
.
GOOS
{
case
"freebsd"
,
"linux"
:
zsys
=
"zsys_"
+
runtime
.
GOOS
+
"_"
+
runtime
.
GOARCH
+
".go"
}
if
err
:=
ioutil
.
WriteFile
(
zsys
,
b
,
0644
);
err
!=
nil
{
return
err
}
return
nil
}
var
registries
=
[]
struct
{
url
string
parse
func
(
io
.
Writer
,
io
.
Reader
)
error
}{
{
"https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml"
,
parseICMPv4Parameters
,
},
}
func
geniana
()
error
{
var
bb
bytes
.
Buffer
fmt
.
Fprintf
(
&
bb
,
"// go generate gen.go
\n
"
)
fmt
.
Fprintf
(
&
bb
,
"// Code generated by the command above; DO NOT EDIT.
\n\n
"
)
fmt
.
Fprintf
(
&
bb
,
"package ipv4
\n\n
"
)
for
_
,
r
:=
range
registries
{
resp
,
err
:=
http
.
Get
(
r
.
url
)
if
err
!=
nil
{
return
err
}
defer
resp
.
Body
.
Close
()
if
resp
.
StatusCode
!=
http
.
StatusOK
{
return
fmt
.
Errorf
(
"got HTTP status code %v for %v
\n
"
,
resp
.
StatusCode
,
r
.
url
)
}
if
err
:=
r
.
parse
(
&
bb
,
resp
.
Body
);
err
!=
nil
{
return
err
}
fmt
.
Fprintf
(
&
bb
,
"
\n
"
)
}
b
,
err
:=
format
.
Source
(
bb
.
Bytes
())
if
err
!=
nil
{
return
err
}
if
err
:=
ioutil
.
WriteFile
(
"iana.go"
,
b
,
0644
);
err
!=
nil
{
return
err
}
return
nil
}
func
parseICMPv4Parameters
(
w
io
.
Writer
,
r
io
.
Reader
)
error
{
dec
:=
xml
.
NewDecoder
(
r
)
var
icp
icmpv4Parameters
if
err
:=
dec
.
Decode
(
&
icp
);
err
!=
nil
{
return
err
}
prs
:=
icp
.
escape
()
fmt
.
Fprintf
(
w
,
"// %s, Updated: %s
\n
"
,
icp
.
Title
,
icp
.
Updated
)
fmt
.
Fprintf
(
w
,
"const (
\n
"
)
for
_
,
pr
:=
range
prs
{
if
pr
.
Descr
==
""
{
continue
}
fmt
.
Fprintf
(
w
,
"ICMPType%s ICMPType = %d"
,
pr
.
Descr
,
pr
.
Value
)
fmt
.
Fprintf
(
w
,
"// %s
\n
"
,
pr
.
OrigDescr
)
}
fmt
.
Fprintf
(
w
,
")
\n\n
"
)
fmt
.
Fprintf
(
w
,
"// %s, Updated: %s
\n
"
,
icp
.
Title
,
icp
.
Updated
)
fmt
.
Fprintf
(
w
,
"var icmpTypes = map[ICMPType]string{
\n
"
)
for
_
,
pr
:=
range
prs
{
if
pr
.
Descr
==
""
{
continue
}
fmt
.
Fprintf
(
w
,
"%d: %q,
\n
"
,
pr
.
Value
,
strings
.
ToLower
(
pr
.
OrigDescr
))
}
fmt
.
Fprintf
(
w
,
"}
\n
"
)
return
nil
}
type
icmpv4Parameters
struct
{
XMLName
xml
.
Name
`xml:"registry"`
Title
string
`xml:"title"`
Updated
string
`xml:"updated"`
Registries
[]
struct
{
Title
string
`xml:"title"`
Records
[]
struct
{
Value
string
`xml:"value"`
Descr
string
`xml:"description"`
}
`xml:"record"`
}
`xml:"registry"`
}
type
canonICMPv4ParamRecord
struct
{
OrigDescr
string
Descr
string
Value
int
}
func
(
icp
*
icmpv4Parameters
)
escape
()
[]
canonICMPv4ParamRecord
{
id
:=
-
1
for
i
,
r
:=
range
icp
.
Registries
{
if
strings
.
Contains
(
r
.
Title
,
"Type"
)
||
strings
.
Contains
(
r
.
Title
,
"type"
)
{
id
=
i
break
}
}
if
id
<
0
{
return
nil
}
prs
:=
make
([]
canonICMPv4ParamRecord
,
len
(
icp
.
Registries
[
id
]
.
Records
))
sr
:=
strings
.
NewReplacer
(
"Messages"
,
""
,
"Message"
,
""
,
"ICMP"
,
""
,
"+"
,
"P"
,
"-"
,
""
,
"/"
,
""
,
"."
,
""
,
" "
,
""
,
)
for
i
,
pr
:=
range
icp
.
Registries
[
id
]
.
Records
{
if
strings
.
Contains
(
pr
.
Descr
,
"Reserved"
)
||
strings
.
Contains
(
pr
.
Descr
,
"Unassigned"
)
||
strings
.
Contains
(
pr
.
Descr
,
"Deprecated"
)
||
strings
.
Contains
(
pr
.
Descr
,
"Experiment"
)
||
strings
.
Contains
(
pr
.
Descr
,
"experiment"
)
{
continue
}
ss
:=
strings
.
Split
(
pr
.
Descr
,
"
\n
"
)
if
len
(
ss
)
>
1
{
prs
[
i
]
.
Descr
=
strings
.
Join
(
ss
,
" "
)
}
else
{
prs
[
i
]
.
Descr
=
ss
[
0
]
}
s
:=
strings
.
TrimSpace
(
prs
[
i
]
.
Descr
)
prs
[
i
]
.
OrigDescr
=
s
prs
[
i
]
.
Descr
=
sr
.
Replace
(
s
)
prs
[
i
]
.
Value
,
_
=
strconv
.
Atoi
(
pr
.
Value
)
}
return
prs
}
vendor/golang.org/x/net/ipv6/defs_darwin.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
ipv6
/*
#define __APPLE_USE_RFC_3542
#include <netinet/in.h>
#include <netinet/icmp6.h>
*/
import
"C"
const
(
sysIPV6_UNICAST_HOPS
=
C
.
IPV6_UNICAST_HOPS
sysIPV6_MULTICAST_IF
=
C
.
IPV6_MULTICAST_IF
sysIPV6_MULTICAST_HOPS
=
C
.
IPV6_MULTICAST_HOPS
sysIPV6_MULTICAST_LOOP
=
C
.
IPV6_MULTICAST_LOOP
sysIPV6_JOIN_GROUP
=
C
.
IPV6_JOIN_GROUP
sysIPV6_LEAVE_GROUP
=
C
.
IPV6_LEAVE_GROUP
sysIPV6_PORTRANGE
=
C
.
IPV6_PORTRANGE
sysICMP6_FILTER
=
C
.
ICMP6_FILTER
sysIPV6_2292PKTINFO
=
C
.
IPV6_2292PKTINFO
sysIPV6_2292HOPLIMIT
=
C
.
IPV6_2292HOPLIMIT
sysIPV6_2292NEXTHOP
=
C
.
IPV6_2292NEXTHOP
sysIPV6_2292HOPOPTS
=
C
.
IPV6_2292HOPOPTS
sysIPV6_2292DSTOPTS
=
C
.
IPV6_2292DSTOPTS
sysIPV6_2292RTHDR
=
C
.
IPV6_2292RTHDR
sysIPV6_2292PKTOPTIONS
=
C
.
IPV6_2292PKTOPTIONS
sysIPV6_CHECKSUM
=
C
.
IPV6_CHECKSUM
sysIPV6_V6ONLY
=
C
.
IPV6_V6ONLY
sysIPV6_IPSEC_POLICY
=
C
.
IPV6_IPSEC_POLICY
sysIPV6_RECVTCLASS
=
C
.
IPV6_RECVTCLASS
sysIPV6_TCLASS
=
C
.
IPV6_TCLASS
sysIPV6_RTHDRDSTOPTS
=
C
.
IPV6_RTHDRDSTOPTS
sysIPV6_RECVPKTINFO
=
C
.
IPV6_RECVPKTINFO
sysIPV6_RECVHOPLIMIT
=
C
.
IPV6_RECVHOPLIMIT
sysIPV6_RECVRTHDR
=
C
.
IPV6_RECVRTHDR
sysIPV6_RECVHOPOPTS
=
C
.
IPV6_RECVHOPOPTS
sysIPV6_RECVDSTOPTS
=
C
.
IPV6_RECVDSTOPTS
sysIPV6_USE_MIN_MTU
=
C
.
IPV6_USE_MIN_MTU
sysIPV6_RECVPATHMTU
=
C
.
IPV6_RECVPATHMTU
sysIPV6_PATHMTU
=
C
.
IPV6_PATHMTU
sysIPV6_PKTINFO
=
C
.
IPV6_PKTINFO
sysIPV6_HOPLIMIT
=
C
.
IPV6_HOPLIMIT
sysIPV6_NEXTHOP
=
C
.
IPV6_NEXTHOP
sysIPV6_HOPOPTS
=
C
.
IPV6_HOPOPTS
sysIPV6_DSTOPTS
=
C
.
IPV6_DSTOPTS
sysIPV6_RTHDR
=
C
.
IPV6_RTHDR
sysIPV6_AUTOFLOWLABEL
=
C
.
IPV6_AUTOFLOWLABEL
sysIPV6_DONTFRAG
=
C
.
IPV6_DONTFRAG
sysIPV6_PREFER_TEMPADDR
=
C
.
IPV6_PREFER_TEMPADDR
sysIPV6_MSFILTER
=
C
.
IPV6_MSFILTER
sysMCAST_JOIN_GROUP
=
C
.
MCAST_JOIN_GROUP
sysMCAST_LEAVE_GROUP
=
C
.
MCAST_LEAVE_GROUP
sysMCAST_JOIN_SOURCE_GROUP
=
C
.
MCAST_JOIN_SOURCE_GROUP
sysMCAST_LEAVE_SOURCE_GROUP
=
C
.
MCAST_LEAVE_SOURCE_GROUP
sysMCAST_BLOCK_SOURCE
=
C
.
MCAST_BLOCK_SOURCE
sysMCAST_UNBLOCK_SOURCE
=
C
.
MCAST_UNBLOCK_SOURCE
sysIPV6_BOUND_IF
=
C
.
IPV6_BOUND_IF
sysIPV6_PORTRANGE_DEFAULT
=
C
.
IPV6_PORTRANGE_DEFAULT
sysIPV6_PORTRANGE_HIGH
=
C
.
IPV6_PORTRANGE_HIGH
sysIPV6_PORTRANGE_LOW
=
C
.
IPV6_PORTRANGE_LOW
sizeofSockaddrStorage
=
C
.
sizeof_struct_sockaddr_storage
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
sizeofInet6Pktinfo
=
C
.
sizeof_struct_in6_pktinfo
sizeofIPv6Mtuinfo
=
C
.
sizeof_struct_ip6_mtuinfo
sizeofIPv6Mreq
=
C
.
sizeof_struct_ipv6_mreq
sizeofGroupReq
=
C
.
sizeof_struct_group_req
sizeofGroupSourceReq
=
C
.
sizeof_struct_group_source_req
sizeofICMPv6Filter
=
C
.
sizeof_struct_icmp6_filter
)
type
sockaddrStorage
C
.
struct_sockaddr_storage
type
sockaddrInet6
C
.
struct_sockaddr_in6
type
inet6Pktinfo
C
.
struct_in6_pktinfo
type
ipv6Mtuinfo
C
.
struct_ip6_mtuinfo
type
ipv6Mreq
C
.
struct_ipv6_mreq
type
icmpv6Filter
C
.
struct_icmp6_filter
type
groupReq
C
.
struct_group_req
type
groupSourceReq
C
.
struct_group_source_req
vendor/golang.org/x/net/ipv6/defs_dragonfly.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
ipv6
/*
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/icmp6.h>
*/
import
"C"
const
(
sysIPV6_UNICAST_HOPS
=
C
.
IPV6_UNICAST_HOPS
sysIPV6_MULTICAST_IF
=
C
.
IPV6_MULTICAST_IF
sysIPV6_MULTICAST_HOPS
=
C
.
IPV6_MULTICAST_HOPS
sysIPV6_MULTICAST_LOOP
=
C
.
IPV6_MULTICAST_LOOP
sysIPV6_JOIN_GROUP
=
C
.
IPV6_JOIN_GROUP
sysIPV6_LEAVE_GROUP
=
C
.
IPV6_LEAVE_GROUP
sysIPV6_PORTRANGE
=
C
.
IPV6_PORTRANGE
sysICMP6_FILTER
=
C
.
ICMP6_FILTER
sysIPV6_CHECKSUM
=
C
.
IPV6_CHECKSUM
sysIPV6_V6ONLY
=
C
.
IPV6_V6ONLY
sysIPV6_IPSEC_POLICY
=
C
.
IPV6_IPSEC_POLICY
sysIPV6_RTHDRDSTOPTS
=
C
.
IPV6_RTHDRDSTOPTS
sysIPV6_RECVPKTINFO
=
C
.
IPV6_RECVPKTINFO
sysIPV6_RECVHOPLIMIT
=
C
.
IPV6_RECVHOPLIMIT
sysIPV6_RECVRTHDR
=
C
.
IPV6_RECVRTHDR
sysIPV6_RECVHOPOPTS
=
C
.
IPV6_RECVHOPOPTS
sysIPV6_RECVDSTOPTS
=
C
.
IPV6_RECVDSTOPTS
sysIPV6_USE_MIN_MTU
=
C
.
IPV6_USE_MIN_MTU
sysIPV6_RECVPATHMTU
=
C
.
IPV6_RECVPATHMTU
sysIPV6_PATHMTU
=
C
.
IPV6_PATHMTU
sysIPV6_PKTINFO
=
C
.
IPV6_PKTINFO
sysIPV6_HOPLIMIT
=
C
.
IPV6_HOPLIMIT
sysIPV6_NEXTHOP
=
C
.
IPV6_NEXTHOP
sysIPV6_HOPOPTS
=
C
.
IPV6_HOPOPTS
sysIPV6_DSTOPTS
=
C
.
IPV6_DSTOPTS
sysIPV6_RTHDR
=
C
.
IPV6_RTHDR
sysIPV6_RECVTCLASS
=
C
.
IPV6_RECVTCLASS
sysIPV6_AUTOFLOWLABEL
=
C
.
IPV6_AUTOFLOWLABEL
sysIPV6_TCLASS
=
C
.
IPV6_TCLASS
sysIPV6_DONTFRAG
=
C
.
IPV6_DONTFRAG
sysIPV6_PREFER_TEMPADDR
=
C
.
IPV6_PREFER_TEMPADDR
sysIPV6_PORTRANGE_DEFAULT
=
C
.
IPV6_PORTRANGE_DEFAULT
sysIPV6_PORTRANGE_HIGH
=
C
.
IPV6_PORTRANGE_HIGH
sysIPV6_PORTRANGE_LOW
=
C
.
IPV6_PORTRANGE_LOW
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
sizeofInet6Pktinfo
=
C
.
sizeof_struct_in6_pktinfo
sizeofIPv6Mtuinfo
=
C
.
sizeof_struct_ip6_mtuinfo
sizeofIPv6Mreq
=
C
.
sizeof_struct_ipv6_mreq
sizeofICMPv6Filter
=
C
.
sizeof_struct_icmp6_filter
)
type
sockaddrInet6
C
.
struct_sockaddr_in6
type
inet6Pktinfo
C
.
struct_in6_pktinfo
type
ipv6Mtuinfo
C
.
struct_ip6_mtuinfo
type
ipv6Mreq
C
.
struct_ipv6_mreq
type
icmpv6Filter
C
.
struct_icmp6_filter
vendor/golang.org/x/net/ipv6/defs_freebsd.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
ipv6
/*
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/icmp6.h>
*/
import
"C"
const
(
sysIPV6_UNICAST_HOPS
=
C
.
IPV6_UNICAST_HOPS
sysIPV6_MULTICAST_IF
=
C
.
IPV6_MULTICAST_IF
sysIPV6_MULTICAST_HOPS
=
C
.
IPV6_MULTICAST_HOPS
sysIPV6_MULTICAST_LOOP
=
C
.
IPV6_MULTICAST_LOOP
sysIPV6_JOIN_GROUP
=
C
.
IPV6_JOIN_GROUP
sysIPV6_LEAVE_GROUP
=
C
.
IPV6_LEAVE_GROUP
sysIPV6_PORTRANGE
=
C
.
IPV6_PORTRANGE
sysICMP6_FILTER
=
C
.
ICMP6_FILTER
sysIPV6_CHECKSUM
=
C
.
IPV6_CHECKSUM
sysIPV6_V6ONLY
=
C
.
IPV6_V6ONLY
sysIPV6_IPSEC_POLICY
=
C
.
IPV6_IPSEC_POLICY
sysIPV6_RTHDRDSTOPTS
=
C
.
IPV6_RTHDRDSTOPTS
sysIPV6_RECVPKTINFO
=
C
.
IPV6_RECVPKTINFO
sysIPV6_RECVHOPLIMIT
=
C
.
IPV6_RECVHOPLIMIT
sysIPV6_RECVRTHDR
=
C
.
IPV6_RECVRTHDR
sysIPV6_RECVHOPOPTS
=
C
.
IPV6_RECVHOPOPTS
sysIPV6_RECVDSTOPTS
=
C
.
IPV6_RECVDSTOPTS
sysIPV6_USE_MIN_MTU
=
C
.
IPV6_USE_MIN_MTU
sysIPV6_RECVPATHMTU
=
C
.
IPV6_RECVPATHMTU
sysIPV6_PATHMTU
=
C
.
IPV6_PATHMTU
sysIPV6_PKTINFO
=
C
.
IPV6_PKTINFO
sysIPV6_HOPLIMIT
=
C
.
IPV6_HOPLIMIT
sysIPV6_NEXTHOP
=
C
.
IPV6_NEXTHOP
sysIPV6_HOPOPTS
=
C
.
IPV6_HOPOPTS
sysIPV6_DSTOPTS
=
C
.
IPV6_DSTOPTS
sysIPV6_RTHDR
=
C
.
IPV6_RTHDR
sysIPV6_RECVTCLASS
=
C
.
IPV6_RECVTCLASS
sysIPV6_AUTOFLOWLABEL
=
C
.
IPV6_AUTOFLOWLABEL
sysIPV6_TCLASS
=
C
.
IPV6_TCLASS
sysIPV6_DONTFRAG
=
C
.
IPV6_DONTFRAG
sysIPV6_PREFER_TEMPADDR
=
C
.
IPV6_PREFER_TEMPADDR
sysIPV6_BINDANY
=
C
.
IPV6_BINDANY
sysIPV6_MSFILTER
=
C
.
IPV6_MSFILTER
sysMCAST_JOIN_GROUP
=
C
.
MCAST_JOIN_GROUP
sysMCAST_LEAVE_GROUP
=
C
.
MCAST_LEAVE_GROUP
sysMCAST_JOIN_SOURCE_GROUP
=
C
.
MCAST_JOIN_SOURCE_GROUP
sysMCAST_LEAVE_SOURCE_GROUP
=
C
.
MCAST_LEAVE_SOURCE_GROUP
sysMCAST_BLOCK_SOURCE
=
C
.
MCAST_BLOCK_SOURCE
sysMCAST_UNBLOCK_SOURCE
=
C
.
MCAST_UNBLOCK_SOURCE
sysIPV6_PORTRANGE_DEFAULT
=
C
.
IPV6_PORTRANGE_DEFAULT
sysIPV6_PORTRANGE_HIGH
=
C
.
IPV6_PORTRANGE_HIGH
sysIPV6_PORTRANGE_LOW
=
C
.
IPV6_PORTRANGE_LOW
sizeofSockaddrStorage
=
C
.
sizeof_struct_sockaddr_storage
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
sizeofInet6Pktinfo
=
C
.
sizeof_struct_in6_pktinfo
sizeofIPv6Mtuinfo
=
C
.
sizeof_struct_ip6_mtuinfo
sizeofIPv6Mreq
=
C
.
sizeof_struct_ipv6_mreq
sizeofGroupReq
=
C
.
sizeof_struct_group_req
sizeofGroupSourceReq
=
C
.
sizeof_struct_group_source_req
sizeofICMPv6Filter
=
C
.
sizeof_struct_icmp6_filter
)
type
sockaddrStorage
C
.
struct_sockaddr_storage
type
sockaddrInet6
C
.
struct_sockaddr_in6
type
inet6Pktinfo
C
.
struct_in6_pktinfo
type
ipv6Mtuinfo
C
.
struct_ip6_mtuinfo
type
ipv6Mreq
C
.
struct_ipv6_mreq
type
groupReq
C
.
struct_group_req
type
groupSourceReq
C
.
struct_group_source_req
type
icmpv6Filter
C
.
struct_icmp6_filter
vendor/golang.org/x/net/ipv6/defs_linux.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
ipv6
/*
#include <linux/in.h>
#include <linux/in6.h>
#include <linux/ipv6.h>
#include <linux/icmpv6.h>
#include <linux/filter.h>
#include <sys/socket.h>
*/
import
"C"
const
(
sysIPV6_ADDRFORM
=
C
.
IPV6_ADDRFORM
sysIPV6_2292PKTINFO
=
C
.
IPV6_2292PKTINFO
sysIPV6_2292HOPOPTS
=
C
.
IPV6_2292HOPOPTS
sysIPV6_2292DSTOPTS
=
C
.
IPV6_2292DSTOPTS
sysIPV6_2292RTHDR
=
C
.
IPV6_2292RTHDR
sysIPV6_2292PKTOPTIONS
=
C
.
IPV6_2292PKTOPTIONS
sysIPV6_CHECKSUM
=
C
.
IPV6_CHECKSUM
sysIPV6_2292HOPLIMIT
=
C
.
IPV6_2292HOPLIMIT
sysIPV6_NEXTHOP
=
C
.
IPV6_NEXTHOP
sysIPV6_FLOWINFO
=
C
.
IPV6_FLOWINFO
sysIPV6_UNICAST_HOPS
=
C
.
IPV6_UNICAST_HOPS
sysIPV6_MULTICAST_IF
=
C
.
IPV6_MULTICAST_IF
sysIPV6_MULTICAST_HOPS
=
C
.
IPV6_MULTICAST_HOPS
sysIPV6_MULTICAST_LOOP
=
C
.
IPV6_MULTICAST_LOOP
sysIPV6_ADD_MEMBERSHIP
=
C
.
IPV6_ADD_MEMBERSHIP
sysIPV6_DROP_MEMBERSHIP
=
C
.
IPV6_DROP_MEMBERSHIP
sysMCAST_JOIN_GROUP
=
C
.
MCAST_JOIN_GROUP
sysMCAST_LEAVE_GROUP
=
C
.
MCAST_LEAVE_GROUP
sysMCAST_JOIN_SOURCE_GROUP
=
C
.
MCAST_JOIN_SOURCE_GROUP
sysMCAST_LEAVE_SOURCE_GROUP
=
C
.
MCAST_LEAVE_SOURCE_GROUP
sysMCAST_BLOCK_SOURCE
=
C
.
MCAST_BLOCK_SOURCE
sysMCAST_UNBLOCK_SOURCE
=
C
.
MCAST_UNBLOCK_SOURCE
sysMCAST_MSFILTER
=
C
.
MCAST_MSFILTER
sysIPV6_ROUTER_ALERT
=
C
.
IPV6_ROUTER_ALERT
sysIPV6_MTU_DISCOVER
=
C
.
IPV6_MTU_DISCOVER
sysIPV6_MTU
=
C
.
IPV6_MTU
sysIPV6_RECVERR
=
C
.
IPV6_RECVERR
sysIPV6_V6ONLY
=
C
.
IPV6_V6ONLY
sysIPV6_JOIN_ANYCAST
=
C
.
IPV6_JOIN_ANYCAST
sysIPV6_LEAVE_ANYCAST
=
C
.
IPV6_LEAVE_ANYCAST
//sysIPV6_PMTUDISC_DONT = C.IPV6_PMTUDISC_DONT
//sysIPV6_PMTUDISC_WANT = C.IPV6_PMTUDISC_WANT
//sysIPV6_PMTUDISC_DO = C.IPV6_PMTUDISC_DO
//sysIPV6_PMTUDISC_PROBE = C.IPV6_PMTUDISC_PROBE
//sysIPV6_PMTUDISC_INTERFACE = C.IPV6_PMTUDISC_INTERFACE
//sysIPV6_PMTUDISC_OMIT = C.IPV6_PMTUDISC_OMIT
sysIPV6_FLOWLABEL_MGR
=
C
.
IPV6_FLOWLABEL_MGR
sysIPV6_FLOWINFO_SEND
=
C
.
IPV6_FLOWINFO_SEND
sysIPV6_IPSEC_POLICY
=
C
.
IPV6_IPSEC_POLICY
sysIPV6_XFRM_POLICY
=
C
.
IPV6_XFRM_POLICY
sysIPV6_RECVPKTINFO
=
C
.
IPV6_RECVPKTINFO
sysIPV6_PKTINFO
=
C
.
IPV6_PKTINFO
sysIPV6_RECVHOPLIMIT
=
C
.
IPV6_RECVHOPLIMIT
sysIPV6_HOPLIMIT
=
C
.
IPV6_HOPLIMIT
sysIPV6_RECVHOPOPTS
=
C
.
IPV6_RECVHOPOPTS
sysIPV6_HOPOPTS
=
C
.
IPV6_HOPOPTS
sysIPV6_RTHDRDSTOPTS
=
C
.
IPV6_RTHDRDSTOPTS
sysIPV6_RECVRTHDR
=
C
.
IPV6_RECVRTHDR
sysIPV6_RTHDR
=
C
.
IPV6_RTHDR
sysIPV6_RECVDSTOPTS
=
C
.
IPV6_RECVDSTOPTS
sysIPV6_DSTOPTS
=
C
.
IPV6_DSTOPTS
sysIPV6_RECVPATHMTU
=
C
.
IPV6_RECVPATHMTU
sysIPV6_PATHMTU
=
C
.
IPV6_PATHMTU
sysIPV6_DONTFRAG
=
C
.
IPV6_DONTFRAG
sysIPV6_RECVTCLASS
=
C
.
IPV6_RECVTCLASS
sysIPV6_TCLASS
=
C
.
IPV6_TCLASS
sysIPV6_ADDR_PREFERENCES
=
C
.
IPV6_ADDR_PREFERENCES
sysIPV6_PREFER_SRC_TMP
=
C
.
IPV6_PREFER_SRC_TMP
sysIPV6_PREFER_SRC_PUBLIC
=
C
.
IPV6_PREFER_SRC_PUBLIC
sysIPV6_PREFER_SRC_PUBTMP_DEFAULT
=
C
.
IPV6_PREFER_SRC_PUBTMP_DEFAULT
sysIPV6_PREFER_SRC_COA
=
C
.
IPV6_PREFER_SRC_COA
sysIPV6_PREFER_SRC_HOME
=
C
.
IPV6_PREFER_SRC_HOME
sysIPV6_PREFER_SRC_CGA
=
C
.
IPV6_PREFER_SRC_CGA
sysIPV6_PREFER_SRC_NONCGA
=
C
.
IPV6_PREFER_SRC_NONCGA
sysIPV6_MINHOPCOUNT
=
C
.
IPV6_MINHOPCOUNT
sysIPV6_ORIGDSTADDR
=
C
.
IPV6_ORIGDSTADDR
sysIPV6_RECVORIGDSTADDR
=
C
.
IPV6_RECVORIGDSTADDR
sysIPV6_TRANSPARENT
=
C
.
IPV6_TRANSPARENT
sysIPV6_UNICAST_IF
=
C
.
IPV6_UNICAST_IF
sysICMPV6_FILTER
=
C
.
ICMPV6_FILTER
sysICMPV6_FILTER_BLOCK
=
C
.
ICMPV6_FILTER_BLOCK
sysICMPV6_FILTER_PASS
=
C
.
ICMPV6_FILTER_PASS
sysICMPV6_FILTER_BLOCKOTHERS
=
C
.
ICMPV6_FILTER_BLOCKOTHERS
sysICMPV6_FILTER_PASSONLY
=
C
.
ICMPV6_FILTER_PASSONLY
sysSOL_SOCKET
=
C
.
SOL_SOCKET
sysSO_ATTACH_FILTER
=
C
.
SO_ATTACH_FILTER
sizeofKernelSockaddrStorage
=
C
.
sizeof_struct___kernel_sockaddr_storage
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
sizeofInet6Pktinfo
=
C
.
sizeof_struct_in6_pktinfo
sizeofIPv6Mtuinfo
=
C
.
sizeof_struct_ip6_mtuinfo
sizeofIPv6FlowlabelReq
=
C
.
sizeof_struct_in6_flowlabel_req
sizeofIPv6Mreq
=
C
.
sizeof_struct_ipv6_mreq
sizeofGroupReq
=
C
.
sizeof_struct_group_req
sizeofGroupSourceReq
=
C
.
sizeof_struct_group_source_req
sizeofICMPv6Filter
=
C
.
sizeof_struct_icmp6_filter
sizeofSockFprog
=
C
.
sizeof_struct_sock_fprog
)
type
kernelSockaddrStorage
C
.
struct___kernel_sockaddr_storage
type
sockaddrInet6
C
.
struct_sockaddr_in6
type
inet6Pktinfo
C
.
struct_in6_pktinfo
type
ipv6Mtuinfo
C
.
struct_ip6_mtuinfo
type
ipv6FlowlabelReq
C
.
struct_in6_flowlabel_req
type
ipv6Mreq
C
.
struct_ipv6_mreq
type
groupReq
C
.
struct_group_req
type
groupSourceReq
C
.
struct_group_source_req
type
icmpv6Filter
C
.
struct_icmp6_filter
type
sockFProg
C
.
struct_sock_fprog
type
sockFilter
C
.
struct_sock_filter
vendor/golang.org/x/net/ipv6/defs_netbsd.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
ipv6
/*
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/icmp6.h>
*/
import
"C"
const
(
sysIPV6_UNICAST_HOPS
=
C
.
IPV6_UNICAST_HOPS
sysIPV6_MULTICAST_IF
=
C
.
IPV6_MULTICAST_IF
sysIPV6_MULTICAST_HOPS
=
C
.
IPV6_MULTICAST_HOPS
sysIPV6_MULTICAST_LOOP
=
C
.
IPV6_MULTICAST_LOOP
sysIPV6_JOIN_GROUP
=
C
.
IPV6_JOIN_GROUP
sysIPV6_LEAVE_GROUP
=
C
.
IPV6_LEAVE_GROUP
sysIPV6_PORTRANGE
=
C
.
IPV6_PORTRANGE
sysICMP6_FILTER
=
C
.
ICMP6_FILTER
sysIPV6_CHECKSUM
=
C
.
IPV6_CHECKSUM
sysIPV6_V6ONLY
=
C
.
IPV6_V6ONLY
sysIPV6_IPSEC_POLICY
=
C
.
IPV6_IPSEC_POLICY
sysIPV6_RTHDRDSTOPTS
=
C
.
IPV6_RTHDRDSTOPTS
sysIPV6_RECVPKTINFO
=
C
.
IPV6_RECVPKTINFO
sysIPV6_RECVHOPLIMIT
=
C
.
IPV6_RECVHOPLIMIT
sysIPV6_RECVRTHDR
=
C
.
IPV6_RECVRTHDR
sysIPV6_RECVHOPOPTS
=
C
.
IPV6_RECVHOPOPTS
sysIPV6_RECVDSTOPTS
=
C
.
IPV6_RECVDSTOPTS
sysIPV6_USE_MIN_MTU
=
C
.
IPV6_USE_MIN_MTU
sysIPV6_RECVPATHMTU
=
C
.
IPV6_RECVPATHMTU
sysIPV6_PATHMTU
=
C
.
IPV6_PATHMTU
sysIPV6_PKTINFO
=
C
.
IPV6_PKTINFO
sysIPV6_HOPLIMIT
=
C
.
IPV6_HOPLIMIT
sysIPV6_NEXTHOP
=
C
.
IPV6_NEXTHOP
sysIPV6_HOPOPTS
=
C
.
IPV6_HOPOPTS
sysIPV6_DSTOPTS
=
C
.
IPV6_DSTOPTS
sysIPV6_RTHDR
=
C
.
IPV6_RTHDR
sysIPV6_RECVTCLASS
=
C
.
IPV6_RECVTCLASS
sysIPV6_TCLASS
=
C
.
IPV6_TCLASS
sysIPV6_DONTFRAG
=
C
.
IPV6_DONTFRAG
sysIPV6_PORTRANGE_DEFAULT
=
C
.
IPV6_PORTRANGE_DEFAULT
sysIPV6_PORTRANGE_HIGH
=
C
.
IPV6_PORTRANGE_HIGH
sysIPV6_PORTRANGE_LOW
=
C
.
IPV6_PORTRANGE_LOW
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
sizeofInet6Pktinfo
=
C
.
sizeof_struct_in6_pktinfo
sizeofIPv6Mtuinfo
=
C
.
sizeof_struct_ip6_mtuinfo
sizeofIPv6Mreq
=
C
.
sizeof_struct_ipv6_mreq
sizeofICMPv6Filter
=
C
.
sizeof_struct_icmp6_filter
)
type
sockaddrInet6
C
.
struct_sockaddr_in6
type
inet6Pktinfo
C
.
struct_in6_pktinfo
type
ipv6Mtuinfo
C
.
struct_ip6_mtuinfo
type
ipv6Mreq
C
.
struct_ipv6_mreq
type
icmpv6Filter
C
.
struct_icmp6_filter
vendor/golang.org/x/net/ipv6/defs_openbsd.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
ipv6
/*
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/icmp6.h>
*/
import
"C"
const
(
sysIPV6_UNICAST_HOPS
=
C
.
IPV6_UNICAST_HOPS
sysIPV6_MULTICAST_IF
=
C
.
IPV6_MULTICAST_IF
sysIPV6_MULTICAST_HOPS
=
C
.
IPV6_MULTICAST_HOPS
sysIPV6_MULTICAST_LOOP
=
C
.
IPV6_MULTICAST_LOOP
sysIPV6_JOIN_GROUP
=
C
.
IPV6_JOIN_GROUP
sysIPV6_LEAVE_GROUP
=
C
.
IPV6_LEAVE_GROUP
sysIPV6_PORTRANGE
=
C
.
IPV6_PORTRANGE
sysICMP6_FILTER
=
C
.
ICMP6_FILTER
sysIPV6_CHECKSUM
=
C
.
IPV6_CHECKSUM
sysIPV6_V6ONLY
=
C
.
IPV6_V6ONLY
sysIPV6_RTHDRDSTOPTS
=
C
.
IPV6_RTHDRDSTOPTS
sysIPV6_RECVPKTINFO
=
C
.
IPV6_RECVPKTINFO
sysIPV6_RECVHOPLIMIT
=
C
.
IPV6_RECVHOPLIMIT
sysIPV6_RECVRTHDR
=
C
.
IPV6_RECVRTHDR
sysIPV6_RECVHOPOPTS
=
C
.
IPV6_RECVHOPOPTS
sysIPV6_RECVDSTOPTS
=
C
.
IPV6_RECVDSTOPTS
sysIPV6_USE_MIN_MTU
=
C
.
IPV6_USE_MIN_MTU
sysIPV6_RECVPATHMTU
=
C
.
IPV6_RECVPATHMTU
sysIPV6_PATHMTU
=
C
.
IPV6_PATHMTU
sysIPV6_PKTINFO
=
C
.
IPV6_PKTINFO
sysIPV6_HOPLIMIT
=
C
.
IPV6_HOPLIMIT
sysIPV6_NEXTHOP
=
C
.
IPV6_NEXTHOP
sysIPV6_HOPOPTS
=
C
.
IPV6_HOPOPTS
sysIPV6_DSTOPTS
=
C
.
IPV6_DSTOPTS
sysIPV6_RTHDR
=
C
.
IPV6_RTHDR
sysIPV6_AUTH_LEVEL
=
C
.
IPV6_AUTH_LEVEL
sysIPV6_ESP_TRANS_LEVEL
=
C
.
IPV6_ESP_TRANS_LEVEL
sysIPV6_ESP_NETWORK_LEVEL
=
C
.
IPV6_ESP_NETWORK_LEVEL
sysIPSEC6_OUTSA
=
C
.
IPSEC6_OUTSA
sysIPV6_RECVTCLASS
=
C
.
IPV6_RECVTCLASS
sysIPV6_AUTOFLOWLABEL
=
C
.
IPV6_AUTOFLOWLABEL
sysIPV6_IPCOMP_LEVEL
=
C
.
IPV6_IPCOMP_LEVEL
sysIPV6_TCLASS
=
C
.
IPV6_TCLASS
sysIPV6_DONTFRAG
=
C
.
IPV6_DONTFRAG
sysIPV6_PIPEX
=
C
.
IPV6_PIPEX
sysIPV6_RTABLE
=
C
.
IPV6_RTABLE
sysIPV6_PORTRANGE_DEFAULT
=
C
.
IPV6_PORTRANGE_DEFAULT
sysIPV6_PORTRANGE_HIGH
=
C
.
IPV6_PORTRANGE_HIGH
sysIPV6_PORTRANGE_LOW
=
C
.
IPV6_PORTRANGE_LOW
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
sizeofInet6Pktinfo
=
C
.
sizeof_struct_in6_pktinfo
sizeofIPv6Mtuinfo
=
C
.
sizeof_struct_ip6_mtuinfo
sizeofIPv6Mreq
=
C
.
sizeof_struct_ipv6_mreq
sizeofICMPv6Filter
=
C
.
sizeof_struct_icmp6_filter
)
type
sockaddrInet6
C
.
struct_sockaddr_in6
type
inet6Pktinfo
C
.
struct_in6_pktinfo
type
ipv6Mtuinfo
C
.
struct_ip6_mtuinfo
type
ipv6Mreq
C
.
struct_ipv6_mreq
type
icmpv6Filter
C
.
struct_icmp6_filter
vendor/golang.org/x/net/ipv6/defs_solaris.go
0 → 100644
View file @
564c1aeb
// Copyright 2014 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
// +godefs map struct_in6_addr [16]byte /* in6_addr */
package
ipv6
/*
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/icmp6.h>
*/
import
"C"
const
(
sysIPV6_UNICAST_HOPS
=
C
.
IPV6_UNICAST_HOPS
sysIPV6_MULTICAST_IF
=
C
.
IPV6_MULTICAST_IF
sysIPV6_MULTICAST_HOPS
=
C
.
IPV6_MULTICAST_HOPS
sysIPV6_MULTICAST_LOOP
=
C
.
IPV6_MULTICAST_LOOP
sysIPV6_JOIN_GROUP
=
C
.
IPV6_JOIN_GROUP
sysIPV6_LEAVE_GROUP
=
C
.
IPV6_LEAVE_GROUP
sysIPV6_PKTINFO
=
C
.
IPV6_PKTINFO
sysIPV6_HOPLIMIT
=
C
.
IPV6_HOPLIMIT
sysIPV6_NEXTHOP
=
C
.
IPV6_NEXTHOP
sysIPV6_HOPOPTS
=
C
.
IPV6_HOPOPTS
sysIPV6_DSTOPTS
=
C
.
IPV6_DSTOPTS
sysIPV6_RTHDR
=
C
.
IPV6_RTHDR
sysIPV6_RTHDRDSTOPTS
=
C
.
IPV6_RTHDRDSTOPTS
sysIPV6_RECVPKTINFO
=
C
.
IPV6_RECVPKTINFO
sysIPV6_RECVHOPLIMIT
=
C
.
IPV6_RECVHOPLIMIT
sysIPV6_RECVHOPOPTS
=
C
.
IPV6_RECVHOPOPTS
sysIPV6_RECVRTHDR
=
C
.
IPV6_RECVRTHDR
sysIPV6_RECVRTHDRDSTOPTS
=
C
.
IPV6_RECVRTHDRDSTOPTS
sysIPV6_CHECKSUM
=
C
.
IPV6_CHECKSUM
sysIPV6_RECVTCLASS
=
C
.
IPV6_RECVTCLASS
sysIPV6_USE_MIN_MTU
=
C
.
IPV6_USE_MIN_MTU
sysIPV6_DONTFRAG
=
C
.
IPV6_DONTFRAG
sysIPV6_SEC_OPT
=
C
.
IPV6_SEC_OPT
sysIPV6_SRC_PREFERENCES
=
C
.
IPV6_SRC_PREFERENCES
sysIPV6_RECVPATHMTU
=
C
.
IPV6_RECVPATHMTU
sysIPV6_PATHMTU
=
C
.
IPV6_PATHMTU
sysIPV6_TCLASS
=
C
.
IPV6_TCLASS
sysIPV6_V6ONLY
=
C
.
IPV6_V6ONLY
sysIPV6_RECVDSTOPTS
=
C
.
IPV6_RECVDSTOPTS
sysMCAST_JOIN_GROUP
=
C
.
MCAST_JOIN_GROUP
sysMCAST_LEAVE_GROUP
=
C
.
MCAST_LEAVE_GROUP
sysMCAST_BLOCK_SOURCE
=
C
.
MCAST_BLOCK_SOURCE
sysMCAST_UNBLOCK_SOURCE
=
C
.
MCAST_UNBLOCK_SOURCE
sysMCAST_JOIN_SOURCE_GROUP
=
C
.
MCAST_JOIN_SOURCE_GROUP
sysMCAST_LEAVE_SOURCE_GROUP
=
C
.
MCAST_LEAVE_SOURCE_GROUP
sysIPV6_PREFER_SRC_HOME
=
C
.
IPV6_PREFER_SRC_HOME
sysIPV6_PREFER_SRC_COA
=
C
.
IPV6_PREFER_SRC_COA
sysIPV6_PREFER_SRC_PUBLIC
=
C
.
IPV6_PREFER_SRC_PUBLIC
sysIPV6_PREFER_SRC_TMP
=
C
.
IPV6_PREFER_SRC_TMP
sysIPV6_PREFER_SRC_NONCGA
=
C
.
IPV6_PREFER_SRC_NONCGA
sysIPV6_PREFER_SRC_CGA
=
C
.
IPV6_PREFER_SRC_CGA
sysIPV6_PREFER_SRC_MIPMASK
=
C
.
IPV6_PREFER_SRC_MIPMASK
sysIPV6_PREFER_SRC_MIPDEFAULT
=
C
.
IPV6_PREFER_SRC_MIPDEFAULT
sysIPV6_PREFER_SRC_TMPMASK
=
C
.
IPV6_PREFER_SRC_TMPMASK
sysIPV6_PREFER_SRC_TMPDEFAULT
=
C
.
IPV6_PREFER_SRC_TMPDEFAULT
sysIPV6_PREFER_SRC_CGAMASK
=
C
.
IPV6_PREFER_SRC_CGAMASK
sysIPV6_PREFER_SRC_CGADEFAULT
=
C
.
IPV6_PREFER_SRC_CGADEFAULT
sysIPV6_PREFER_SRC_MASK
=
C
.
IPV6_PREFER_SRC_MASK
sysIPV6_PREFER_SRC_DEFAULT
=
C
.
IPV6_PREFER_SRC_DEFAULT
sysIPV6_BOUND_IF
=
C
.
IPV6_BOUND_IF
sysIPV6_UNSPEC_SRC
=
C
.
IPV6_UNSPEC_SRC
sysICMP6_FILTER
=
C
.
ICMP6_FILTER
sizeofSockaddrStorage
=
C
.
sizeof_struct_sockaddr_storage
sizeofSockaddrInet6
=
C
.
sizeof_struct_sockaddr_in6
sizeofInet6Pktinfo
=
C
.
sizeof_struct_in6_pktinfo
sizeofIPv6Mtuinfo
=
C
.
sizeof_struct_ip6_mtuinfo
sizeofIPv6Mreq
=
C
.
sizeof_struct_ipv6_mreq
sizeofGroupReq
=
C
.
sizeof_struct_group_req
sizeofGroupSourceReq
=
C
.
sizeof_struct_group_source_req
sizeofICMPv6Filter
=
C
.
sizeof_struct_icmp6_filter
)
type
sockaddrStorage
C
.
struct_sockaddr_storage
type
sockaddrInet6
C
.
struct_sockaddr_in6
type
inet6Pktinfo
C
.
struct_in6_pktinfo
type
ipv6Mtuinfo
C
.
struct_ip6_mtuinfo
type
ipv6Mreq
C
.
struct_ipv6_mreq
type
groupReq
C
.
struct_group_req
type
groupSourceReq
C
.
struct_group_source_req
type
icmpv6Filter
C
.
struct_icmp6_filter
vendor/golang.org/x/net/ipv6/gen.go
0 → 100644
View file @
564c1aeb
// Copyright 2013 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
//go:generate go run gen.go
// This program generates system adaptation constants and types,
// internet protocol constants and tables by reading template files
// and IANA protocol registries.
package
main
import
(
"bytes"
"encoding/xml"
"fmt"
"go/format"
"io"
"io/ioutil"
"net/http"
"os"
"os/exec"
"runtime"
"strconv"
"strings"
)
func
main
()
{
if
err
:=
genzsys
();
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
err
)
os
.
Exit
(
1
)
}
if
err
:=
geniana
();
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
err
)
os
.
Exit
(
1
)
}
}
func
genzsys
()
error
{
defs
:=
"defs_"
+
runtime
.
GOOS
+
".go"
f
,
err
:=
os
.
Open
(
defs
)
if
err
!=
nil
{
if
os
.
IsNotExist
(
err
)
{
return
nil
}
return
err
}
f
.
Close
()
cmd
:=
exec
.
Command
(
"go"
,
"tool"
,
"cgo"
,
"-godefs"
,
defs
)
b
,
err
:=
cmd
.
Output
()
if
err
!=
nil
{
return
err
}
b
,
err
=
format
.
Source
(
b
)
if
err
!=
nil
{
return
err
}
zsys
:=
"zsys_"
+
runtime
.
GOOS
+
".go"
switch
runtime
.
GOOS
{
case
"freebsd"
,
"linux"
:
zsys
=
"zsys_"
+
runtime
.
GOOS
+
"_"
+
runtime
.
GOARCH
+
".go"
}
if
err
:=
ioutil
.
WriteFile
(
zsys
,
b
,
0644
);
err
!=
nil
{
return
err
}
return
nil
}
var
registries
=
[]
struct
{
url
string
parse
func
(
io
.
Writer
,
io
.
Reader
)
error
}{
{
"https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xml"
,
parseICMPv6Parameters
,
},
}
func
geniana
()
error
{
var
bb
bytes
.
Buffer
fmt
.
Fprintf
(
&
bb
,
"// go generate gen.go
\n
"
)
fmt
.
Fprintf
(
&
bb
,
"// Code generated by the command above; DO NOT EDIT.
\n\n
"
)
fmt
.
Fprintf
(
&
bb
,
"package ipv6
\n\n
"
)
for
_
,
r
:=
range
registries
{
resp
,
err
:=
http
.
Get
(
r
.
url
)
if
err
!=
nil
{
return
err
}
defer
resp
.
Body
.
Close
()
if
resp
.
StatusCode
!=
http
.
StatusOK
{
return
fmt
.
Errorf
(
"got HTTP status code %v for %v
\n
"
,
resp
.
StatusCode
,
r
.
url
)
}
if
err
:=
r
.
parse
(
&
bb
,
resp
.
Body
);
err
!=
nil
{
return
err
}
fmt
.
Fprintf
(
&
bb
,
"
\n
"
)
}
b
,
err
:=
format
.
Source
(
bb
.
Bytes
())
if
err
!=
nil
{
return
err
}
if
err
:=
ioutil
.
WriteFile
(
"iana.go"
,
b
,
0644
);
err
!=
nil
{
return
err
}
return
nil
}
func
parseICMPv6Parameters
(
w
io
.
Writer
,
r
io
.
Reader
)
error
{
dec
:=
xml
.
NewDecoder
(
r
)
var
icp
icmpv6Parameters
if
err
:=
dec
.
Decode
(
&
icp
);
err
!=
nil
{
return
err
}
prs
:=
icp
.
escape
()
fmt
.
Fprintf
(
w
,
"// %s, Updated: %s
\n
"
,
icp
.
Title
,
icp
.
Updated
)
fmt
.
Fprintf
(
w
,
"const (
\n
"
)
for
_
,
pr
:=
range
prs
{
if
pr
.
Name
==
""
{
continue
}
fmt
.
Fprintf
(
w
,
"ICMPType%s ICMPType = %d"
,
pr
.
Name
,
pr
.
Value
)
fmt
.
Fprintf
(
w
,
"// %s
\n
"
,
pr
.
OrigName
)
}
fmt
.
Fprintf
(
w
,
")
\n\n
"
)
fmt
.
Fprintf
(
w
,
"// %s, Updated: %s
\n
"
,
icp
.
Title
,
icp
.
Updated
)
fmt
.
Fprintf
(
w
,
"var icmpTypes = map[ICMPType]string{
\n
"
)
for
_
,
pr
:=
range
prs
{
if
pr
.
Name
==
""
{
continue
}
fmt
.
Fprintf
(
w
,
"%d: %q,
\n
"
,
pr
.
Value
,
strings
.
ToLower
(
pr
.
OrigName
))
}
fmt
.
Fprintf
(
w
,
"}
\n
"
)
return
nil
}
type
icmpv6Parameters
struct
{
XMLName
xml
.
Name
`xml:"registry"`
Title
string
`xml:"title"`
Updated
string
`xml:"updated"`
Registries
[]
struct
{
Title
string
`xml:"title"`
Records
[]
struct
{
Value
string
`xml:"value"`
Name
string
`xml:"name"`
}
`xml:"record"`
}
`xml:"registry"`
}
type
canonICMPv6ParamRecord
struct
{
OrigName
string
Name
string
Value
int
}
func
(
icp
*
icmpv6Parameters
)
escape
()
[]
canonICMPv6ParamRecord
{
id
:=
-
1
for
i
,
r
:=
range
icp
.
Registries
{
if
strings
.
Contains
(
r
.
Title
,
"Type"
)
||
strings
.
Contains
(
r
.
Title
,
"type"
)
{
id
=
i
break
}
}
if
id
<
0
{
return
nil
}
prs
:=
make
([]
canonICMPv6ParamRecord
,
len
(
icp
.
Registries
[
id
]
.
Records
))
sr
:=
strings
.
NewReplacer
(
"Messages"
,
""
,
"Message"
,
""
,
"ICMP"
,
""
,
"+"
,
"P"
,
"-"
,
""
,
"/"
,
""
,
"."
,
""
,
" "
,
""
,
)
for
i
,
pr
:=
range
icp
.
Registries
[
id
]
.
Records
{
if
strings
.
Contains
(
pr
.
Name
,
"Reserved"
)
||
strings
.
Contains
(
pr
.
Name
,
"Unassigned"
)
||
strings
.
Contains
(
pr
.
Name
,
"Deprecated"
)
||
strings
.
Contains
(
pr
.
Name
,
"Experiment"
)
||
strings
.
Contains
(
pr
.
Name
,
"experiment"
)
{
continue
}
ss
:=
strings
.
Split
(
pr
.
Name
,
"
\n
"
)
if
len
(
ss
)
>
1
{
prs
[
i
]
.
Name
=
strings
.
Join
(
ss
,
" "
)
}
else
{
prs
[
i
]
.
Name
=
ss
[
0
]
}
s
:=
strings
.
TrimSpace
(
prs
[
i
]
.
Name
)
prs
[
i
]
.
OrigName
=
s
prs
[
i
]
.
Name
=
sr
.
Replace
(
s
)
prs
[
i
]
.
Value
,
_
=
strconv
.
Atoi
(
pr
.
Value
)
}
return
prs
}
vendor/golang.org/x/sys/unix/mkasm_darwin.go
0 → 100644
View file @
564c1aeb
// 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
,
"
\t
JMP
\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
)
}
}
vendor/golang.org/x/sys/unix/mkpost.go
0 → 100644
View file @
564c1aeb
// 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
)
}
if
goos
==
"aix"
{
// Replace type of Atim, Mtim and Ctim by Timespec in Stat_t
// to avoid having both StTimespec and Timespec.
sttimespec
:=
regexp
.
MustCompile
(
`_Ctype_struct_st_timespec`
)
b
=
sttimespec
.
ReplaceAll
(
b
,
[]
byte
(
"Timespec"
))
}
// Intentionally export __val fields in Fsid and Sigset_t
valRegex
:=
regexp
.
MustCompile
(
`type (Fsid|Sigset_t) struct {(\s+)X__(bits|val)(\s+\S+\s+)}`
)
b
=
valRegex
.
ReplaceAll
(
b
,
[]
byte
(
"type $1 struct {${2}Val$4}"
))
// 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
))
// Rename Stat_t time fields
if
goos
==
"freebsd"
&&
goarch
==
"386"
{
// Hide Stat_t.[AMCB]tim_ext fields
renameStatTimeExtFieldsRegex
:=
regexp
.
MustCompile
(
`[AMCB]tim_ext`
)
b
=
renameStatTimeExtFieldsRegex
.
ReplaceAll
(
b
,
[]
byte
(
"_"
))
}
renameStatTimeFieldsRegex
:=
regexp
.
MustCompile
(
`([AMCB])(?:irth)?time?(?:spec)?\s+(Timespec|StTimespec)`
)
b
=
renameStatTimeFieldsRegex
.
ReplaceAll
(
b
,
[]
byte
(
"${1}tim ${2}"
))
// gofmt
b
,
err
=
format
.
Source
(
b
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
os
.
Stdout
.
Write
(
b
)
}
vendor/golang.org/x/sys/unix/mksyscall.go
0 → 100644
View file @
564c1aeb
// 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
\n
malformed //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
(
"
\t
var _p%d *byte
\n
"
,
n
)
text
+=
fmt
.
Sprintf
(
"
\t
_p%d, %s = BytePtrFromString(%s)
\n
"
,
n
,
errvar
,
p
.
Name
)
text
+=
fmt
.
Sprintf
(
"
\t
if %s != nil {
\n\t\t
return
\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
(
"
\t
var _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
(
"
\t
var _p%d unsafe.Pointer
\n
"
,
n
)
text
+=
fmt
.
Sprintf
(
"
\t
if 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
+=
"
\t
if int32(r0) == -1 {
\n
"
text
+=
"
\t\t
err = e1
\n
"
text
+=
"
\t
}
\n
"
}
else
if
doErrno
{
text
+=
"
\t
if e1 != 0 {
\n
"
text
+=
"
\t\t
err = errnoErr(e1)
\n
"
text
+=
"
\t
}
\n
"
}
text
+=
"
\t
return
\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
`
vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go
0 → 100644
View file @
564c1aeb
// 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
\n
malformed //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
(
"
\t
var _p%d *%s
\n
"
,
n
,
m
[
1
])
text
+=
fmt
.
Sprintf
(
"
\t
if 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
(
"
\t
var _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
(
"
\t
var _p%d uint32
\n
"
,
n
)
text
+=
fmt
.
Sprintf
(
"
\t
if %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
+=
"
\t
if (uintptr(r0) ==^uintptr(0) && er != nil) {
\n
"
body
+=
fmt
.
Sprintf
(
"
\t\t
%s = er
\n
"
,
errvar
)
body
+=
"
\t
}
\n
"
}
else
{
body
+=
"
\t
if (r0 ==-1 && er != nil) {
\n
"
body
+=
fmt
.
Sprintf
(
"
\t\t
%s = er
\n
"
,
errvar
)
body
+=
"
\t
}
\n
"
}
}
else
if
errvar
!=
""
{
body
+=
"
\t
if (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
+=
"
\t
return
\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
`
vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go
0 → 100644
View file @
564c1aeb
// 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
\n
malformed //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
(
"
\t
var _p%d %s
\n
"
,
n
,
strconvtype
)
textcommon
+=
fmt
.
Sprintf
(
"
\t
_p%d, %s = %s(%s)
\n
"
,
n
,
errvar
,
strconvfunc
,
p
.
Name
)
textcommon
+=
fmt
.
Sprintf
(
"
\t
if %s != nil {
\n\t\t
return
\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
(
"
\t
var _p%d %s
\n
"
,
n
,
strconvtype
)
textcommon
+=
fmt
.
Sprintf
(
"
\t
_p%d, %s = %s(%s)
\n
"
,
n
,
errvar
,
strconvfunc
,
p
.
Name
)
textcommon
+=
fmt
.
Sprintf
(
"
\t
if %s != nil {
\n\t\t
return
\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
(
"
\t
var _p%d *%s
\n
"
,
n
,
m
[
1
])
textcommon
+=
fmt
.
Sprintf
(
"
\t
if 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
+=
"
\t
if e1 != 0 {
\n
"
textcommon
+=
"
\t\t
err = errnoErr(e1)
\n
"
textcommon
+=
"
\t
}
\n
"
}
textcommon
+=
"
\t
return
\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
(
"
\t
r1, _, e1 = %s
\n
"
,
callgc
)
textgc
+=
"
\t
return
\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
(
"
\t
r1 = uintptr(%s)
\n
"
,
callgccgo
)
textgccgo
+=
"
\t
e1 = syscall.GetErrno()
\n
"
textgccgo
+=
"
\t
return
\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
`
vendor/golang.org/x/sys/unix/mksyscall_solaris.go
0 → 100644
View file @
564c1aeb
// 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
\n
malformed //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
(
"
\t
var _p%d %s
\n
"
,
n
,
strconvtype
)
text
+=
fmt
.
Sprintf
(
"
\t
_p%d, %s = %s(%s)
\n
"
,
n
,
errvar
,
strconvfunc
,
p
.
Name
)
text
+=
fmt
.
Sprintf
(
"
\t
if %s != nil {
\n\t\t
return
\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
(
"
\t
var _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
(
"
\t
var _p%d *%s
\n
"
,
n
,
s
[
1
])
text
+=
fmt
.
Sprintf
(
"
\t
if 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
(
"
\t
var _p%d uint32
\n
"
,
n
)
text
+=
fmt
.
Sprintf
(
"
\t
if %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
+=
"
\t
if e1 != 0 {
\n
"
text
+=
"
\t\t
err = e1
\n
"
text
+=
"
\t
}
\n
"
}
text
+=
"
\t
return
\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
`
vendor/golang.org/x/sys/unix/mksysctl_openbsd.go
0 → 100644
View file @
564c1aeb
// 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
// Parse the header files for OpenBSD and generate a Go usable sysctl MIB.
//
// Build a MIB with each entry being an array containing the level, type and
// a hash that will contain additional entries if the current entry is a node.
// We then walk this MIB and create a flattened sysctl name to OID hash.
package
main
import
(
"bufio"
"fmt"
"os"
"path/filepath"
"regexp"
"sort"
"strings"
)
var
(
goos
,
goarch
string
)
// cmdLine returns this programs's commandline arguments.
func
cmdLine
()
string
{
return
"go run mksysctl_openbsd.go "
+
strings
.
Join
(
os
.
Args
[
1
:
],
" "
)
}
// buildTags returns build tags.
func
buildTags
()
string
{
return
fmt
.
Sprintf
(
"%s,%s"
,
goarch
,
goos
)
}
// reMatch performs regular expression match and stores the substring slice to value pointed by m.
func
reMatch
(
re
*
regexp
.
Regexp
,
str
string
,
m
*
[]
string
)
bool
{
*
m
=
re
.
FindStringSubmatch
(
str
)
if
*
m
!=
nil
{
return
true
}
return
false
}
type
nodeElement
struct
{
n
int
t
string
pE
*
map
[
string
]
nodeElement
}
var
(
debugEnabled
bool
mib
map
[
string
]
nodeElement
node
*
map
[
string
]
nodeElement
nodeMap
map
[
string
]
string
sysCtl
[]
string
)
var
(
ctlNames1RE
=
regexp
.
MustCompile
(
`^#define\s+(CTL_NAMES)\s+{`
)
ctlNames2RE
=
regexp
.
MustCompile
(
`^#define\s+(CTL_(.*)_NAMES)\s+{`
)
ctlNames3RE
=
regexp
.
MustCompile
(
`^#define\s+((.*)CTL_NAMES)\s+{`
)
netInetRE
=
regexp
.
MustCompile
(
`^netinet/`
)
netInet6RE
=
regexp
.
MustCompile
(
`^netinet6/`
)
netRE
=
regexp
.
MustCompile
(
`^net/`
)
bracesRE
=
regexp
.
MustCompile
(
`{.*}`
)
ctlTypeRE
=
regexp
.
MustCompile
(
`{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}`
)
fsNetKernRE
=
regexp
.
MustCompile
(
`^(fs|net|kern)_`
)
)
func
debug
(
s
string
)
{
if
debugEnabled
{
fmt
.
Fprintln
(
os
.
Stderr
,
s
)
}
}
// Walk the MIB and build a sysctl name to OID mapping.
func
buildSysctl
(
pNode
*
map
[
string
]
nodeElement
,
name
string
,
oid
[]
int
)
{
lNode
:=
pNode
// local copy of pointer to node
var
keys
[]
string
for
k
:=
range
*
lNode
{
keys
=
append
(
keys
,
k
)
}
sort
.
Strings
(
keys
)
for
_
,
key
:=
range
keys
{
nodename
:=
name
if
name
!=
""
{
nodename
+=
"."
}
nodename
+=
key
nodeoid
:=
append
(
oid
,
(
*
pNode
)[
key
]
.
n
)
if
(
*
pNode
)[
key
]
.
t
==
`CTLTYPE_NODE`
{
if
_
,
ok
:=
nodeMap
[
nodename
];
ok
{
lNode
=
&
mib
ctlName
:=
nodeMap
[
nodename
]
for
_
,
part
:=
range
strings
.
Split
(
ctlName
,
"."
)
{
lNode
=
((
*
lNode
)[
part
])
.
pE
}
}
else
{
lNode
=
(
*
pNode
)[
key
]
.
pE
}
buildSysctl
(
lNode
,
nodename
,
nodeoid
)
}
else
if
(
*
pNode
)[
key
]
.
t
!=
""
{
oidStr
:=
[]
string
{}
for
j
:=
range
nodeoid
{
oidStr
=
append
(
oidStr
,
fmt
.
Sprintf
(
"%d"
,
nodeoid
[
j
]))
}
text
:=
"
\t
{
\"
"
+
nodename
+
"
\"
, []_C_int{ "
+
strings
.
Join
(
oidStr
,
", "
)
+
" } },
\n
"
sysCtl
=
append
(
sysCtl
,
text
)
}
}
}
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
)
}
mib
=
make
(
map
[
string
]
nodeElement
)
headers
:=
[
...
]
string
{
`sys/sysctl.h`
,
`sys/socket.h`
,
`sys/tty.h`
,
`sys/malloc.h`
,
`sys/mount.h`
,
`sys/namei.h`
,
`sys/sem.h`
,
`sys/shm.h`
,
`sys/vmmeter.h`
,
`uvm/uvmexp.h`
,
`uvm/uvm_param.h`
,
`uvm/uvm_swap_encrypt.h`
,
`ddb/db_var.h`
,
`net/if.h`
,
`net/if_pfsync.h`
,
`net/pipex.h`
,
`netinet/in.h`
,
`netinet/icmp_var.h`
,
`netinet/igmp_var.h`
,
`netinet/ip_ah.h`
,
`netinet/ip_carp.h`
,
`netinet/ip_divert.h`
,
`netinet/ip_esp.h`
,
`netinet/ip_ether.h`
,
`netinet/ip_gre.h`
,
`netinet/ip_ipcomp.h`
,
`netinet/ip_ipip.h`
,
`netinet/pim_var.h`
,
`netinet/tcp_var.h`
,
`netinet/udp_var.h`
,
`netinet6/in6.h`
,
`netinet6/ip6_divert.h`
,
`netinet6/pim6_var.h`
,
`netinet/icmp6.h`
,
`netmpls/mpls.h`
,
}
ctls
:=
[
...
]
string
{
`kern`
,
`vm`
,
`fs`
,
`net`
,
//debug /* Special handling required */
`hw`
,
//machdep /* Arch specific */
`user`
,
`ddb`
,
//vfs /* Special handling required */
`fs.posix`
,
`kern.forkstat`
,
`kern.intrcnt`
,
`kern.malloc`
,
`kern.nchstats`
,
`kern.seminfo`
,
`kern.shminfo`
,
`kern.timecounter`
,
`kern.tty`
,
`kern.watchdog`
,
`net.bpf`
,
`net.ifq`
,
`net.inet`
,
`net.inet.ah`
,
`net.inet.carp`
,
`net.inet.divert`
,
`net.inet.esp`
,
`net.inet.etherip`
,
`net.inet.gre`
,
`net.inet.icmp`
,
`net.inet.igmp`
,
`net.inet.ip`
,
`net.inet.ip.ifq`
,
`net.inet.ipcomp`
,
`net.inet.ipip`
,
`net.inet.mobileip`
,
`net.inet.pfsync`
,
`net.inet.pim`
,
`net.inet.tcp`
,
`net.inet.udp`
,
`net.inet6`
,
`net.inet6.divert`
,
`net.inet6.ip6`
,
`net.inet6.icmp6`
,
`net.inet6.pim6`
,
`net.inet6.tcp6`
,
`net.inet6.udp6`
,
`net.mpls`
,
`net.mpls.ifq`
,
`net.key`
,
`net.pflow`
,
`net.pfsync`
,
`net.pipex`
,
`net.rt`
,
`vm.swapencrypt`
,
//vfsgenctl /* Special handling required */
}
// Node name "fixups"
ctlMap
:=
map
[
string
]
string
{
"ipproto"
:
"net.inet"
,
"net.inet.ipproto"
:
"net.inet"
,
"net.inet6.ipv6proto"
:
"net.inet6"
,
"net.inet6.ipv6"
:
"net.inet6.ip6"
,
"net.inet.icmpv6"
:
"net.inet6.icmp6"
,
"net.inet6.divert6"
:
"net.inet6.divert"
,
"net.inet6.tcp6"
:
"net.inet.tcp"
,
"net.inet6.udp6"
:
"net.inet.udp"
,
"mpls"
:
"net.mpls"
,
"swpenc"
:
"vm.swapencrypt"
,
}
// Node mappings
nodeMap
=
map
[
string
]
string
{
"net.inet.ip.ifq"
:
"net.ifq"
,
"net.inet.pfsync"
:
"net.pfsync"
,
"net.mpls.ifq"
:
"net.ifq"
,
}
mCtls
:=
make
(
map
[
string
]
bool
)
for
_
,
ctl
:=
range
ctls
{
mCtls
[
ctl
]
=
true
}
for
_
,
header
:=
range
headers
{
debug
(
"Processing "
+
header
)
file
,
err
:=
os
.
Open
(
filepath
.
Join
(
"/usr/include"
,
header
))
if
err
!=
nil
{
fmt
.
Fprintf
(
os
.
Stderr
,
"%v
\n
"
,
err
)
os
.
Exit
(
1
)
}
s
:=
bufio
.
NewScanner
(
file
)
for
s
.
Scan
()
{
var
sub
[]
string
if
reMatch
(
ctlNames1RE
,
s
.
Text
(),
&
sub
)
||
reMatch
(
ctlNames2RE
,
s
.
Text
(),
&
sub
)
||
reMatch
(
ctlNames3RE
,
s
.
Text
(),
&
sub
)
{
if
sub
[
1
]
==
`CTL_NAMES`
{
// Top level.
node
=
&
mib
}
else
{
// Node.
nodename
:=
strings
.
ToLower
(
sub
[
2
])
ctlName
:=
""
if
reMatch
(
netInetRE
,
header
,
&
sub
)
{
ctlName
=
"net.inet."
+
nodename
}
else
if
reMatch
(
netInet6RE
,
header
,
&
sub
)
{
ctlName
=
"net.inet6."
+
nodename
}
else
if
reMatch
(
netRE
,
header
,
&
sub
)
{
ctlName
=
"net."
+
nodename
}
else
{
ctlName
=
nodename
ctlName
=
fsNetKernRE
.
ReplaceAllString
(
ctlName
,
`$1.`
)
}
if
val
,
ok
:=
ctlMap
[
ctlName
];
ok
{
ctlName
=
val
}
if
_
,
ok
:=
mCtls
[
ctlName
];
!
ok
{
debug
(
"Ignoring "
+
ctlName
+
"..."
)
continue
}
// Walk down from the top of the MIB.
node
=
&
mib
for
_
,
part
:=
range
strings
.
Split
(
ctlName
,
"."
)
{
if
_
,
ok
:=
(
*
node
)[
part
];
!
ok
{
debug
(
"Missing node "
+
part
)
(
*
node
)[
part
]
=
nodeElement
{
n
:
0
,
t
:
""
,
pE
:
&
map
[
string
]
nodeElement
{}}
}
node
=
(
*
node
)[
part
]
.
pE
}
}
// Populate current node with entries.
i
:=
-
1
for
!
strings
.
HasPrefix
(
s
.
Text
(),
"}"
)
{
s
.
Scan
()
if
reMatch
(
bracesRE
,
s
.
Text
(),
&
sub
)
{
i
++
}
if
!
reMatch
(
ctlTypeRE
,
s
.
Text
(),
&
sub
)
{
continue
}
(
*
node
)[
sub
[
1
]]
=
nodeElement
{
n
:
i
,
t
:
sub
[
2
],
pE
:
&
map
[
string
]
nodeElement
{}}
}
}
}
err
=
s
.
Err
()
if
err
!=
nil
{
fmt
.
Fprintf
(
os
.
Stderr
,
"%v
\n
"
,
err
)
os
.
Exit
(
1
)
}
file
.
Close
()
}
buildSysctl
(
&
mib
,
""
,
[]
int
{})
sort
.
Strings
(
sysCtl
)
text
:=
strings
.
Join
(
sysCtl
,
""
)
fmt
.
Printf
(
srcTemplate
,
cmdLine
(),
buildTags
(),
text
)
}
const
srcTemplate
=
`// %s
// Code generated by the command above; DO NOT EDIT.
// +build %s
package unix
type mibentry struct {
ctlname string
ctloid []_C_int
}
var sysctlMib = []mibentry {
%s
}
`
vendor/golang.org/x/sys/unix/mksysnum.go
0 → 100644
View file @
564c1aeb
// 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|COMPAT10)\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)`
vendor/golang.org/x/sys/unix/types_aix.go
0 → 100644
View file @
564c1aeb
// 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
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
RawSockaddrDatalink
C
.
struct_sockaddr_dl
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
SizeofSockaddrDatalink
=
C
.
sizeof_struct_sockaddr_dl
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
vendor/golang.org/x/sys/unix/types_darwin.go
0 → 100644
View file @
564c1aeb
// 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
vendor/golang.org/x/sys/unix/types_dragonfly.go
0 → 100644
View file @
564c1aeb
// 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
vendor/golang.org/x/sys/unix/types_freebsd.go
0 → 100644
View file @
564c1aeb
// 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_ATTACH
=
C
.
PT_ATTACH
PTRACE_CONT
=
C
.
PT_CONTINUE
PTRACE_DETACH
=
C
.
PT_DETACH
PTRACE_GETFPREGS
=
C
.
PT_GETFPREGS
PTRACE_GETFSBASE
=
C
.
PT_GETFSBASE
PTRACE_GETLWPLIST
=
C
.
PT_GETLWPLIST
PTRACE_GETNUMLWPS
=
C
.
PT_GETNUMLWPS
PTRACE_GETREGS
=
C
.
PT_GETREGS
PTRACE_GETXSTATE
=
C
.
PT_GETXSTATE
PTRACE_IO
=
C
.
PT_IO
PTRACE_KILL
=
C
.
PT_KILL
PTRACE_LWPEVENTS
=
C
.
PT_LWP_EVENTS
PTRACE_LWPINFO
=
C
.
PT_LWPINFO
PTRACE_SETFPREGS
=
C
.
PT_SETFPREGS
PTRACE_SETREGS
=
C
.
PT_SETREGS
PTRACE_SINGLESTEP
=
C
.
PT_STEP
PTRACE_TRACEME
=
C
.
PT_TRACE_ME
)
const
(
PIOD_READ_D
=
C
.
PIOD_READ_D
PIOD_WRITE_D
=
C
.
PIOD_WRITE_D
PIOD_READ_I
=
C
.
PIOD_READ_I
PIOD_WRITE_I
=
C
.
PIOD_WRITE_I
)
const
(
PL_FLAG_BORN
=
C
.
PL_FLAG_BORN
PL_FLAG_EXITED
=
C
.
PL_FLAG_EXITED
PL_FLAG_SI
=
C
.
PL_FLAG_SI
)
const
(
TRAP_BRKPT
=
C
.
TRAP_BRKPT
TRAP_TRACE
=
C
.
TRAP_TRACE
)
type
PtraceLwpInfoStruct
C
.
struct_ptrace_lwpinfo
type
__Siginfo
C
.
struct___siginfo
type
Sigset_t
C
.
sigset_t
type
Reg
C
.
struct_reg
type
FpReg
C
.
struct_fpreg
type
PtraceIoDesc
C
.
struct_ptrace_io_desc
// 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
vendor/golang.org/x/sys/unix/types_netbsd.go
0 → 100644
View file @
564c1aeb
// 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_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
)
// Sysctl
type
Sysctlnode
C
.
struct_sysctlnode
// Uname
type
Utsname
C
.
struct_utsname
// Clockinfo
const
SizeofClockinfo
=
C
.
sizeof_struct_clockinfo
type
Clockinfo
C
.
struct_clockinfo
vendor/golang.org/x/sys/unix/types_openbsd.go
0 → 100644
View file @
564c1aeb
// 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_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
)
// 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
vendor/golang.org/x/sys/unix/types_solaris.go
0 → 100644
View file @
564c1aeb
// 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
)
vendor/golang.org/x/text/encoding/internal/identifier/gen.go
0 → 100644
View file @
564c1aeb
// 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
(
"bytes"
"encoding/xml"
"fmt"
"io"
"log"
"strings"
"golang.org/x/text/internal/gen"
)
type
registry
struct
{
XMLName
xml
.
Name
`xml:"registry"`
Updated
string
`xml:"updated"`
Registry
[]
struct
{
ID
string
`xml:"id,attr"`
Record
[]
struct
{
Name
string
`xml:"name"`
Xref
[]
struct
{
Type
string
`xml:"type,attr"`
Data
string
`xml:"data,attr"`
}
`xml:"xref"`
Desc
struct
{
Data
string
`xml:",innerxml"`
// Any []struct {
// Data string `xml:",chardata"`
// } `xml:",any"`
// Data string `xml:",chardata"`
}
`xml:"description,"`
MIB
string
`xml:"value"`
Alias
[]
string
`xml:"alias"`
MIME
string
`xml:"preferred_alias"`
}
`xml:"record"`
}
`xml:"registry"`
}
func
main
()
{
r
:=
gen
.
OpenIANAFile
(
"assignments/character-sets/character-sets.xml"
)
reg
:=
&
registry
{}
if
err
:=
xml
.
NewDecoder
(
r
)
.
Decode
(
&
reg
);
err
!=
nil
&&
err
!=
io
.
EOF
{
log
.
Fatalf
(
"Error decoding charset registry: %v"
,
err
)
}
if
len
(
reg
.
Registry
)
==
0
||
reg
.
Registry
[
0
]
.
ID
!=
"character-sets-1"
{
log
.
Fatalf
(
"Unexpected ID %s"
,
reg
.
Registry
[
0
]
.
ID
)
}
w
:=
&
bytes
.
Buffer
{}
fmt
.
Fprintf
(
w
,
"const (
\n
"
)
for
_
,
rec
:=
range
reg
.
Registry
[
0
]
.
Record
{
constName
:=
""
for
_
,
a
:=
range
rec
.
Alias
{
if
strings
.
HasPrefix
(
a
,
"cs"
)
&&
strings
.
IndexByte
(
a
,
'-'
)
==
-
1
{
// Some of the constant definitions have comments in them. Strip those.
constName
=
strings
.
Title
(
strings
.
SplitN
(
a
[
2
:
],
"
\n
"
,
2
)[
0
])
}
}
if
constName
==
""
{
switch
rec
.
MIB
{
case
"2085"
:
constName
=
"HZGB2312"
// Not listed as alias for some reason.
default
:
log
.
Fatalf
(
"No cs alias defined for %s."
,
rec
.
MIB
)
}
}
if
rec
.
MIME
!=
""
{
rec
.
MIME
=
fmt
.
Sprintf
(
" (MIME: %s)"
,
rec
.
MIME
)
}
fmt
.
Fprintf
(
w
,
"// %s is the MIB identifier with IANA name %s%s.
\n
//
\n
"
,
constName
,
rec
.
Name
,
rec
.
MIME
)
if
len
(
rec
.
Desc
.
Data
)
>
0
{
fmt
.
Fprint
(
w
,
"// "
)
d
:=
xml
.
NewDecoder
(
strings
.
NewReader
(
rec
.
Desc
.
Data
))
inElem
:=
true
attr
:=
""
for
{
t
,
err
:=
d
.
Token
()
if
err
!=
nil
{
if
err
!=
io
.
EOF
{
log
.
Fatal
(
err
)
}
break
}
switch
x
:=
t
.
(
type
)
{
case
xml
.
CharData
:
attr
=
""
// Don't need attribute info.
a
:=
bytes
.
Split
([]
byte
(
x
),
[]
byte
(
"
\n
"
))
for
i
,
b
:=
range
a
{
if
b
=
bytes
.
TrimSpace
(
b
);
len
(
b
)
!=
0
{
if
!
inElem
&&
i
>
0
{
fmt
.
Fprint
(
w
,
"
\n
// "
)
}
inElem
=
false
fmt
.
Fprintf
(
w
,
"%s "
,
string
(
b
))
}
}
case
xml
.
StartElement
:
if
x
.
Name
.
Local
==
"xref"
{
inElem
=
true
use
:=
false
for
_
,
a
:=
range
x
.
Attr
{
if
a
.
Name
.
Local
==
"type"
{
use
=
use
||
a
.
Value
!=
"person"
}
if
a
.
Name
.
Local
==
"data"
&&
use
{
// Patch up URLs to use https. From some links, the
// https version is different from the http one.
s
:=
a
.
Value
s
=
strings
.
Replace
(
s
,
"http://"
,
"https://"
,
-
1
)
s
=
strings
.
Replace
(
s
,
"/unicode/"
,
"/"
,
-
1
)
attr
=
s
+
" "
}
}
}
case
xml
.
EndElement
:
inElem
=
false
fmt
.
Fprint
(
w
,
attr
)
}
}
fmt
.
Fprint
(
w
,
"
\n
"
)
}
for
_
,
x
:=
range
rec
.
Xref
{
switch
x
.
Type
{
case
"rfc"
:
fmt
.
Fprintf
(
w
,
"// Reference: %s
\n
"
,
strings
.
ToUpper
(
x
.
Data
))
case
"uri"
:
fmt
.
Fprintf
(
w
,
"// Reference: %s
\n
"
,
x
.
Data
)
}
}
fmt
.
Fprintf
(
w
,
"%s MIB = %s
\n
"
,
constName
,
rec
.
MIB
)
fmt
.
Fprintln
(
w
)
}
fmt
.
Fprintln
(
w
,
")"
)
gen
.
WriteGoFile
(
"mib.go"
,
"identifier"
,
w
.
Bytes
())
}
vendor/golang.org/x/text/unicode/bidi/gen.go
0 → 100644
View file @
564c1aeb
// 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
// https://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
)
vendor/golang.org/x/text/unicode/bidi/gen_ranges.go
0 → 100644
View file @
564c1aeb
// 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:
// https://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
)
}
}
}
vendor/golang.org/x/text/unicode/bidi/gen_trieval.go
0 → 100644
View file @
564c1aeb
// 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
)
vendor/golang.org/x/text/unicode/norm/maketables.go
0 → 100644
View file @
564c1aeb
// 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"
"encoding/binary"
"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 https://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
(
"
\0
00"
)
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
,
`import "sync"`
)
fmt
.
Fprintln
(
w
)
fmt
.
Fprintln
(
w
,
"const ("
)
fmt
.
Fprintln
(
w
,
"
\t
// Version is the Unicode edition from which the tables are derived."
)
fmt
.
Fprintf
(
w
,
"
\t
Version = %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
,
"
\t
MaxTransformChunkSize = %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"
)
fmt
.
Fprintln
(
w
,
"var recompMapOnce sync.Once
\n
"
)
fmt
.
Fprintln
(
w
,
`const recompMapPacked = "" +`
)
var
buf
[
8
]
byte
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
]))
binary
.
BigEndian
.
PutUint32
(
buf
[
:
4
],
key
)
binary
.
BigEndian
.
PutUint32
(
buf
[
4
:
],
uint32
(
i
))
fmt
.
Fprintf
(
w
,
"
\t\t
%q + // 0x%.8X: 0x%.8X
\n
"
,
string
(
buf
[
:
]),
key
,
uint32
(
i
))
}
}
// hack so we don't have to special case the trailing plus sign
fmt
.
Fprintf
(
w
,
` ""`
)
fmt
.
Fprintln
(
w
)
}
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 https://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
())
}
vendor/golang.org/x/text/unicode/norm/triegen.go
0 → 100644
View file @
564c1aeb
// 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
}
vendor/golang.org/x/text/width/gen.go
0 → 100644
View file @
564c1aeb
// 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
// This program generates the trie for width operations. The generated table
// includes width category information as well as the normalization mappings.
package
main
import
(
"bytes"
"fmt"
"io"
"log"
"math"
"unicode/utf8"
"golang.org/x/text/internal/gen"
"golang.org/x/text/internal/triegen"
)
// See gen_common.go for flags.
func
main
()
{
gen
.
Init
()
genTables
()
genTests
()
gen
.
Repackage
(
"gen_trieval.go"
,
"trieval.go"
,
"width"
)
gen
.
Repackage
(
"gen_common.go"
,
"common_test.go"
,
"width"
)
}
func
genTables
()
{
t
:=
triegen
.
NewTrie
(
"width"
)
// fold and inverse mappings. See mapComment for a description of the format
// of each entry. Add dummy value to make an index of 0 mean no mapping.
inverse
:=
[][
4
]
byte
{{}}
mapping
:=
map
[[
4
]
byte
]
int
{[
4
]
byte
{}
:
0
}
getWidthData
(
func
(
r
rune
,
tag
elem
,
alt
rune
)
{
idx
:=
0
if
alt
!=
0
{
var
buf
[
4
]
byte
buf
[
0
]
=
byte
(
utf8
.
EncodeRune
(
buf
[
1
:
],
alt
))
s
:=
string
(
r
)
buf
[
buf
[
0
]]
^=
s
[
len
(
s
)
-
1
]
var
ok
bool
if
idx
,
ok
=
mapping
[
buf
];
!
ok
{
idx
=
len
(
mapping
)
if
idx
>
math
.
MaxUint8
{
log
.
Fatalf
(
"Index %d does not fit in a byte."
,
idx
)
}
mapping
[
buf
]
=
idx
inverse
=
append
(
inverse
,
buf
)
}
}
t
.
Insert
(
r
,
uint64
(
tag
|
elem
(
idx
)))
})
w
:=
&
bytes
.
Buffer
{}
gen
.
WriteUnicodeVersion
(
w
)
sz
,
err
:=
t
.
Gen
(
w
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
sz
+=
writeMappings
(
w
,
inverse
)
fmt
.
Fprintf
(
w
,
"// Total table size %d bytes (%dKiB)
\n
"
,
sz
,
sz
/
1024
)
gen
.
WriteVersionedGoFile
(
*
outputFile
,
"width"
,
w
.
Bytes
())
}
const
inverseDataComment
=
`
// inverseData contains 4-byte entries of the following format:
// <length> <modified UTF-8-encoded rune> <0 padding>
// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the
// UTF-8 encoding of the original rune. Mappings often have the following
// pattern:
// A -> A (U+FF21 -> U+0041)
// B -> B (U+FF22 -> U+0042)
// ...
// By xor-ing the last byte the same entry can be shared by many mappings. This
// reduces the total number of distinct entries by about two thirds.
// The resulting entry for the aforementioned mappings is
// { 0x01, 0xE0, 0x00, 0x00 }
// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get
// E0 ^ A1 = 41.
// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get
// E0 ^ A2 = 42.
// Note that because of the xor-ing, the byte sequence stored in the entry is
// not valid UTF-8.`
func
writeMappings
(
w
io
.
Writer
,
data
[][
4
]
byte
)
int
{
fmt
.
Fprintln
(
w
,
inverseDataComment
)
fmt
.
Fprintf
(
w
,
"var inverseData = [%d][4]byte{
\n
"
,
len
(
data
))
for
_
,
x
:=
range
data
{
fmt
.
Fprintf
(
w
,
"{ 0x%02x, 0x%02x, 0x%02x, 0x%02x },
\n
"
,
x
[
0
],
x
[
1
],
x
[
2
],
x
[
3
])
}
fmt
.
Fprintln
(
w
,
"}"
)
return
len
(
data
)
*
4
}
func
genTests
()
{
w
:=
&
bytes
.
Buffer
{}
fmt
.
Fprintf
(
w
,
"
\n
var mapRunes = map[rune]struct{r rune; e elem}{
\n
"
)
getWidthData
(
func
(
r
rune
,
tag
elem
,
alt
rune
)
{
if
alt
!=
0
{
fmt
.
Fprintf
(
w
,
"
\t
0x%X: {0x%X, 0x%X},
\n
"
,
r
,
alt
,
tag
)
}
})
fmt
.
Fprintln
(
w
,
"}"
)
gen
.
WriteGoFile
(
"runes_test.go"
,
"width"
,
w
.
Bytes
())
}
vendor/golang.org/x/text/width/gen_common.go
0 → 100644
View file @
564c1aeb
// 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
// This code is shared between the main code generator and the test code.
import
(
"flag"
"log"
"strconv"
"strings"
"golang.org/x/text/internal/gen"
"golang.org/x/text/internal/ucd"
)
var
(
outputFile
=
flag
.
String
(
"out"
,
"tables.go"
,
"output file"
)
)
var
typeMap
=
map
[
string
]
elem
{
"A"
:
tagAmbiguous
,
"N"
:
tagNeutral
,
"Na"
:
tagNarrow
,
"W"
:
tagWide
,
"F"
:
tagFullwidth
,
"H"
:
tagHalfwidth
,
}
// getWidthData calls f for every entry for which it is defined.
//
// f may be called multiple times for the same rune. The last call to f is the
// correct value. f is not called for all runes. The default tag type is
// Neutral.
func
getWidthData
(
f
func
(
r
rune
,
tag
elem
,
alt
rune
))
{
// Set the default values for Unified Ideographs. In line with Annex 11,
// we encode full ranges instead of the defined runes in Unified_Ideograph.
for
_
,
b
:=
range
[]
struct
{
lo
,
hi
rune
}{
{
0x4E00
,
0x9FFF
},
// the CJK Unified Ideographs block,
{
0x3400
,
0x4DBF
},
// the CJK Unified Ideographs Externsion A block,
{
0xF900
,
0xFAFF
},
// the CJK Compatibility Ideographs block,
{
0x20000
,
0x2FFFF
},
// the Supplementary Ideographic Plane,
{
0x30000
,
0x3FFFF
},
// the Tertiary Ideographic Plane,
}
{
for
r
:=
b
.
lo
;
r
<=
b
.
hi
;
r
++
{
f
(
r
,
tagWide
,
0
)
}
}
inverse
:=
map
[
rune
]
rune
{}
maps
:=
map
[
string
]
bool
{
"<wide>"
:
true
,
"<narrow>"
:
true
,
}
// We cannot reuse package norm's decomposition, as we need an unexpanded
// decomposition. We make use of the opportunity to verify that the
// decomposition type is as expected.
ucd
.
Parse
(
gen
.
OpenUCDFile
(
"UnicodeData.txt"
),
func
(
p
*
ucd
.
Parser
)
{
r
:=
p
.
Rune
(
0
)
s
:=
strings
.
SplitN
(
p
.
String
(
ucd
.
DecompMapping
),
" "
,
2
)
if
!
maps
[
s
[
0
]]
{
return
}
x
,
err
:=
strconv
.
ParseUint
(
s
[
1
],
16
,
32
)
if
err
!=
nil
{
log
.
Fatalf
(
"Error parsing rune %q"
,
s
[
1
])
}
if
inverse
[
r
]
!=
0
||
inverse
[
rune
(
x
)]
!=
0
{
log
.
Fatalf
(
"Circular dependency in mapping between %U and %U"
,
r
,
x
)
}
inverse
[
r
]
=
rune
(
x
)
inverse
[
rune
(
x
)]
=
r
})
// <rune range>;<type>
ucd
.
Parse
(
gen
.
OpenUCDFile
(
"EastAsianWidth.txt"
),
func
(
p
*
ucd
.
Parser
)
{
tag
,
ok
:=
typeMap
[
p
.
String
(
1
)]
if
!
ok
{
log
.
Fatalf
(
"Unknown width type %q"
,
p
.
String
(
1
))
}
r
:=
p
.
Rune
(
0
)
alt
,
ok
:=
inverse
[
r
]
if
tag
==
tagFullwidth
||
tag
==
tagHalfwidth
&&
r
!=
wonSign
{
tag
|=
tagNeedsFold
if
!
ok
{
log
.
Fatalf
(
"Narrow or wide rune %U has no decomposition"
,
r
)
}
}
f
(
r
,
tag
,
alt
)
})
}
vendor/golang.org/x/text/width/gen_trieval.go
0 → 100644
View file @
564c1aeb
// 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
// elem is an entry of the width trie. The high byte is used to encode the type
// of the rune. The low byte is used to store the index to a mapping entry in
// the inverseData array.
type
elem
uint16
const
(
tagNeutral
elem
=
iota
<<
typeShift
tagAmbiguous
tagWide
tagNarrow
tagFullwidth
tagHalfwidth
)
const
(
numTypeBits
=
3
typeShift
=
16
-
numTypeBits
// tagNeedsFold is true for all fullwidth and halfwidth runes except for
// the Won sign U+20A9.
tagNeedsFold
=
0x1000
// The Korean Won sign is halfwidth, but SHOULD NOT be mapped to a wide
// variant.
wonSign
rune
=
0x20A9
)
vendor/golang.org/x/tools/go/gcexportdata/main.go
0 → 100644
View file @
564c1aeb
// Copyright 2017 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
// The gcexportdata command is a diagnostic tool that displays the
// contents of gc export data files.
package
main
import
(
"flag"
"fmt"
"go/token"
"go/types"
"log"
"os"
"golang.org/x/tools/go/gcexportdata"
"golang.org/x/tools/go/types/typeutil"
)
var
packageFlag
=
flag
.
String
(
"package"
,
""
,
"alternative package to print"
)
func
main
()
{
log
.
SetPrefix
(
"gcexportdata: "
)
log
.
SetFlags
(
0
)
flag
.
Usage
=
func
()
{
fmt
.
Fprintln
(
os
.
Stderr
,
"usage: gcexportdata [-package path] file.a"
)
}
flag
.
Parse
()
if
flag
.
NArg
()
!=
1
{
flag
.
Usage
()
os
.
Exit
(
2
)
}
filename
:=
flag
.
Args
()[
0
]
f
,
err
:=
os
.
Open
(
filename
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
r
,
err
:=
gcexportdata
.
NewReader
(
f
)
if
err
!=
nil
{
log
.
Fatalf
(
"%s: %s"
,
filename
,
err
)
}
// Decode the package.
const
primary
=
"<primary>"
imports
:=
make
(
map
[
string
]
*
types
.
Package
)
fset
:=
token
.
NewFileSet
()
pkg
,
err
:=
gcexportdata
.
Read
(
r
,
fset
,
imports
,
primary
)
if
err
!=
nil
{
log
.
Fatalf
(
"%s: %s"
,
filename
,
err
)
}
// Optionally select an indirectly mentioned package.
if
*
packageFlag
!=
""
{
pkg
=
imports
[
*
packageFlag
]
if
pkg
==
nil
{
fmt
.
Fprintf
(
os
.
Stderr
,
"export data file %s does not mention %s; has:
\n
"
,
filename
,
*
packageFlag
)
for
p
:=
range
imports
{
if
p
!=
primary
{
fmt
.
Fprintf
(
os
.
Stderr
,
"
\t
%s
\n
"
,
p
)
}
}
os
.
Exit
(
1
)
}
}
// Print all package-level declarations, including non-exported ones.
fmt
.
Printf
(
"package %s
\n
"
,
pkg
.
Name
())
for
_
,
imp
:=
range
pkg
.
Imports
()
{
fmt
.
Printf
(
"import %q
\n
"
,
imp
.
Path
())
}
qual
:=
func
(
p
*
types
.
Package
)
string
{
if
pkg
==
p
{
return
""
}
return
p
.
Name
()
}
scope
:=
pkg
.
Scope
()
for
_
,
name
:=
range
scope
.
Names
()
{
obj
:=
scope
.
Lookup
(
name
)
fmt
.
Printf
(
"%s: %s
\n
"
,
fset
.
Position
(
obj
.
Pos
()),
types
.
ObjectString
(
obj
,
qual
))
// For types, print each method.
if
_
,
ok
:=
obj
.
(
*
types
.
TypeName
);
ok
{
for
_
,
method
:=
range
typeutil
.
IntuitiveMethodSet
(
obj
.
Type
(),
nil
)
{
fmt
.
Printf
(
"%s: %s
\n
"
,
fset
.
Position
(
method
.
Obj
()
.
Pos
()),
types
.
SelectionString
(
method
,
qual
))
}
}
}
}
vendor/golang.org/x/tools/internal/imports/mkindex.go
0 → 100644
View file @
564c1aeb
// +build ignore
// Copyright 2013 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.
// Command mkindex creates the file "pkgindex.go" containing an index of the Go
// standard library. The file is intended to be built as part of the imports
// package, so that the package may be used in environments where a GOROOT is
// not available (such as App Engine).
package
imports
import
(
"bytes"
"fmt"
"go/ast"
"go/build"
"go/format"
"go/parser"
"go/token"
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
"strings"
)
var
(
pkgIndex
=
make
(
map
[
string
][]
pkg
)
exports
=
make
(
map
[
string
]
map
[
string
]
bool
)
)
func
main
()
{
// Don't use GOPATH.
ctx
:=
build
.
Default
ctx
.
GOPATH
=
""
// Populate pkgIndex global from GOROOT.
for
_
,
path
:=
range
ctx
.
SrcDirs
()
{
f
,
err
:=
os
.
Open
(
path
)
if
err
!=
nil
{
log
.
Print
(
err
)
continue
}
children
,
err
:=
f
.
Readdir
(
-
1
)
f
.
Close
()
if
err
!=
nil
{
log
.
Print
(
err
)
continue
}
for
_
,
child
:=
range
children
{
if
child
.
IsDir
()
{
loadPkg
(
path
,
child
.
Name
())
}
}
}
// Populate exports global.
for
_
,
ps
:=
range
pkgIndex
{
for
_
,
p
:=
range
ps
{
e
:=
loadExports
(
p
.
dir
)
if
e
!=
nil
{
exports
[
p
.
dir
]
=
e
}
}
}
// Construct source file.
var
buf
bytes
.
Buffer
fmt
.
Fprint
(
&
buf
,
pkgIndexHead
)
fmt
.
Fprintf
(
&
buf
,
"var pkgIndexMaster = %#v
\n
"
,
pkgIndex
)
fmt
.
Fprintf
(
&
buf
,
"var exportsMaster = %#v
\n
"
,
exports
)
src
:=
buf
.
Bytes
()
// Replace main.pkg type name with pkg.
src
=
bytes
.
Replace
(
src
,
[]
byte
(
"main.pkg"
),
[]
byte
(
"pkg"
),
-
1
)
// Replace actual GOROOT with "/go".
src
=
bytes
.
Replace
(
src
,
[]
byte
(
ctx
.
GOROOT
),
[]
byte
(
"/go"
),
-
1
)
// Add some line wrapping.
src
=
bytes
.
Replace
(
src
,
[]
byte
(
"}, "
),
[]
byte
(
"},
\n
"
),
-
1
)
src
=
bytes
.
Replace
(
src
,
[]
byte
(
"true, "
),
[]
byte
(
"true,
\n
"
),
-
1
)
var
err
error
src
,
err
=
format
.
Source
(
src
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
// Write out source file.
err
=
ioutil
.
WriteFile
(
"pkgindex.go"
,
src
,
0644
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
const
pkgIndexHead
=
`package imports
func init() {
pkgIndexOnce.Do(func() {
pkgIndex.m = pkgIndexMaster
})
loadExports = func(dir string) map[string]bool {
return exportsMaster[dir]
}
}
`
type
pkg
struct
{
importpath
string
// full pkg import path, e.g. "net/http"
dir
string
// absolute file path to pkg directory e.g. "/usr/lib/go/src/fmt"
}
var
fset
=
token
.
NewFileSet
()
func
loadPkg
(
root
,
importpath
string
)
{
shortName
:=
path
.
Base
(
importpath
)
if
shortName
==
"testdata"
{
return
}
dir
:=
filepath
.
Join
(
root
,
importpath
)
pkgIndex
[
shortName
]
=
append
(
pkgIndex
[
shortName
],
pkg
{
importpath
:
importpath
,
dir
:
dir
,
})
pkgDir
,
err
:=
os
.
Open
(
dir
)
if
err
!=
nil
{
return
}
children
,
err
:=
pkgDir
.
Readdir
(
-
1
)
pkgDir
.
Close
()
if
err
!=
nil
{
return
}
for
_
,
child
:=
range
children
{
name
:=
child
.
Name
()
if
name
==
""
{
continue
}
if
c
:=
name
[
0
];
c
==
'.'
||
(
'0'
<=
c
&&
c
<=
'9'
)
{
continue
}
if
child
.
IsDir
()
{
loadPkg
(
root
,
filepath
.
Join
(
importpath
,
name
))
}
}
}
func
loadExports
(
dir
string
)
map
[
string
]
bool
{
exports
:=
make
(
map
[
string
]
bool
)
buildPkg
,
err
:=
build
.
ImportDir
(
dir
,
0
)
if
err
!=
nil
{
if
strings
.
Contains
(
err
.
Error
(),
"no buildable Go source files in"
)
{
return
nil
}
log
.
Printf
(
"could not import %q: %v"
,
dir
,
err
)
return
nil
}
for
_
,
file
:=
range
buildPkg
.
GoFiles
{
f
,
err
:=
parser
.
ParseFile
(
fset
,
filepath
.
Join
(
dir
,
file
),
nil
,
0
)
if
err
!=
nil
{
log
.
Printf
(
"could not parse %q: %v"
,
file
,
err
)
continue
}
for
name
:=
range
f
.
Scope
.
Objects
{
if
ast
.
IsExported
(
name
)
{
exports
[
name
]
=
true
}
}
}
return
exports
}
vendor/golang.org/x/tools/internal/imports/mkstdlib.go
0 → 100644
View file @
564c1aeb
// +build ignore
// mkstdlib generates the zstdlib.go file, containing the Go standard
// library API symbols. It's baked into the binary to avoid scanning
// GOPATH in the common case.
package
imports
import
(
"bufio"
"bytes"
"fmt"
"go/format"
"io"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"regexp"
"runtime"
"sort"
"strings"
)
func
mustOpen
(
name
string
)
io
.
Reader
{
f
,
err
:=
os
.
Open
(
name
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
return
f
}
func
api
(
base
string
)
string
{
return
filepath
.
Join
(
runtime
.
GOROOT
(),
"api"
,
base
)
}
var
sym
=
regexp
.
MustCompile
(
`^pkg (\S+).*?, (?:var|func|type|const) ([A-Z]\w*)`
)
var
unsafeSyms
=
map
[
string
]
bool
{
"Alignof"
:
true
,
"ArbitraryType"
:
true
,
"Offsetof"
:
true
,
"Pointer"
:
true
,
"Sizeof"
:
true
}
func
main
()
{
var
buf
bytes
.
Buffer
outf
:=
func
(
format
string
,
args
...
interface
{})
{
fmt
.
Fprintf
(
&
buf
,
format
,
args
...
)
}
outf
(
"// Code generated by mkstdlib.go. DO NOT EDIT.
\n\n
"
)
outf
(
"package imports
\n
"
)
outf
(
"var stdlib = map[string]map[string]bool{
\n
"
)
f
:=
io
.
MultiReader
(
mustOpen
(
api
(
"go1.txt"
)),
mustOpen
(
api
(
"go1.1.txt"
)),
mustOpen
(
api
(
"go1.2.txt"
)),
mustOpen
(
api
(
"go1.3.txt"
)),
mustOpen
(
api
(
"go1.4.txt"
)),
mustOpen
(
api
(
"go1.5.txt"
)),
mustOpen
(
api
(
"go1.6.txt"
)),
mustOpen
(
api
(
"go1.7.txt"
)),
mustOpen
(
api
(
"go1.8.txt"
)),
mustOpen
(
api
(
"go1.9.txt"
)),
mustOpen
(
api
(
"go1.10.txt"
)),
mustOpen
(
api
(
"go1.11.txt"
)),
mustOpen
(
api
(
"go1.12.txt"
)),
// The API of the syscall/js package needs to be computed explicitly,
// because it's not included in the GOROOT/api/go1.*.txt files at this time.
syscallJSAPI
(),
)
sc
:=
bufio
.
NewScanner
(
f
)
pkgs
:=
map
[
string
]
map
[
string
]
bool
{
"unsafe"
:
unsafeSyms
,
}
paths
:=
[]
string
{
"unsafe"
}
for
sc
.
Scan
()
{
l
:=
sc
.
Text
()
has
:=
func
(
v
string
)
bool
{
return
strings
.
Contains
(
l
,
v
)
}
if
has
(
"struct, "
)
||
has
(
"interface, "
)
||
has
(
", method ("
)
{
continue
}
if
m
:=
sym
.
FindStringSubmatch
(
l
);
m
!=
nil
{
path
,
sym
:=
m
[
1
],
m
[
2
]
if
_
,
ok
:=
pkgs
[
path
];
!
ok
{
pkgs
[
path
]
=
map
[
string
]
bool
{}
paths
=
append
(
paths
,
path
)
}
pkgs
[
path
][
sym
]
=
true
}
}
if
err
:=
sc
.
Err
();
err
!=
nil
{
log
.
Fatal
(
err
)
}
sort
.
Strings
(
paths
)
for
_
,
path
:=
range
paths
{
outf
(
"
\t
%q: map[string]bool{
\n
"
,
path
)
pkg
:=
pkgs
[
path
]
var
syms
[]
string
for
sym
:=
range
pkg
{
syms
=
append
(
syms
,
sym
)
}
sort
.
Strings
(
syms
)
for
_
,
sym
:=
range
syms
{
outf
(
"
\t\t
%q: true,
\n
"
,
sym
)
}
outf
(
"},
\n
"
)
}
outf
(
"}
\n
"
)
fmtbuf
,
err
:=
format
.
Source
(
buf
.
Bytes
())
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
err
=
ioutil
.
WriteFile
(
"zstdlib.go"
,
fmtbuf
,
0666
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
// syscallJSAPI returns the API of the syscall/js package.
// It's computed from the contents of $(go env GOROOT)/src/syscall/js.
func
syscallJSAPI
()
io
.
Reader
{
var
exeSuffix
string
if
runtime
.
GOOS
==
"windows"
{
exeSuffix
=
".exe"
}
cmd
:=
exec
.
Command
(
"go"
+
exeSuffix
,
"run"
,
"cmd/api"
,
"-contexts"
,
"js-wasm"
,
"syscall/js"
)
out
,
err
:=
cmd
.
Output
()
if
err
!=
nil
{
log
.
Fatalln
(
err
)
}
return
bytes
.
NewReader
(
out
)
}
vendor/modules.txt
View file @
564c1aeb
This source diff could not be displayed because it is too large. You can
view the blob
instead.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment