Fix godeps.
Signed-off-by: Random-Liu <lantaol@google.com>
This commit is contained in:
parent
cdfdc8d33b
commit
8112c03f15
22
Godeps/Godeps.json
generated
22
Godeps/Godeps.json
generated
@ -101,11 +101,6 @@
|
|||||||
"Comment": "v0.2.3-745-gbbeaab5",
|
"Comment": "v0.2.3-745-gbbeaab5",
|
||||||
"Rev": "bbeaab5ee38568daa84b8c233a8067b524588355"
|
"Rev": "bbeaab5ee38568daa84b8c233a8067b524588355"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"ImportPath": "github.com/containerd/containerd/progress",
|
|
||||||
"Comment": "v0.2.3-745-gbbeaab5",
|
|
||||||
"Rev": "bbeaab5ee38568daa84b8c233a8067b524588355"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/containerd/containerd/reference",
|
"ImportPath": "github.com/containerd/containerd/reference",
|
||||||
"Comment": "v0.2.3-745-gbbeaab5",
|
"Comment": "v0.2.3-745-gbbeaab5",
|
||||||
@ -156,11 +151,6 @@
|
|||||||
"Comment": "v1.1.0",
|
"Comment": "v1.1.0",
|
||||||
"Rev": "346938d642f2ec3594ed81d874461961cd0faa76"
|
"Rev": "346938d642f2ec3594ed81d874461961cd0faa76"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"ImportPath": "github.com/docker/go-units",
|
|
||||||
"Comment": "v0.3.1",
|
|
||||||
"Rev": "f2d77a61e3c169b43402a0a1e84f06daf29b8190"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/gogo/protobuf/gogoproto",
|
"ImportPath": "github.com/gogo/protobuf/gogoproto",
|
||||||
"Comment": "v0.3-150-gd2e1ade2",
|
"Comment": "v0.3-150-gd2e1ade2",
|
||||||
@ -223,7 +213,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/opencontainers/runc/libcontainer/system",
|
"ImportPath": "github.com/opencontainers/runc/libcontainer/system",
|
||||||
"Comment": "v1.0.0-rc3-21-g50401b5",
|
"Comment": "v1.0.0-rc3-21-g50401b5b",
|
||||||
"Rev": "50401b5b4c2e01e4f1372b73a021742deeaf4e2d"
|
"Rev": "50401b5b4c2e01e4f1372b73a021742deeaf4e2d"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -238,7 +228,6 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/pmezard/go-difflib/difflib",
|
"ImportPath": "github.com/pmezard/go-difflib/difflib",
|
||||||
"Comment": "v1.0.0",
|
|
||||||
"Rev": "792786c7400a136282c1664665ae0a8db921c6c2"
|
"Rev": "792786c7400a136282c1664665ae0a8db921c6c2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -254,11 +243,6 @@
|
|||||||
"Comment": "v1.1.4-6-g18a02ba",
|
"Comment": "v1.1.4-6-g18a02ba",
|
||||||
"Rev": "18a02ba4a312f95da08ff4cfc0055750ce50ae9e"
|
"Rev": "18a02ba4a312f95da08ff4cfc0055750ce50ae9e"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"ImportPath": "github.com/stretchr/testify/require",
|
|
||||||
"Comment": "v1.1.4-6-g18a02ba",
|
|
||||||
"Rev": "18a02ba4a312f95da08ff4cfc0055750ce50ae9e"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"ImportPath": "golang.org/x/net/context",
|
"ImportPath": "golang.org/x/net/context",
|
||||||
"Rev": "e90d6d0afc4c315a0d87a568ae68577cc15149a0"
|
"Rev": "e90d6d0afc4c315a0d87a568ae68577cc15149a0"
|
||||||
@ -299,6 +283,10 @@
|
|||||||
"ImportPath": "golang.org/x/sys/unix",
|
"ImportPath": "golang.org/x/sys/unix",
|
||||||
"Rev": "f3918c30c5c2cb527c0b071a27c35120a6c0719a"
|
"Rev": "f3918c30c5c2cb527c0b071a27c35120a6c0719a"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "golang.org/x/sys/windows",
|
||||||
|
"Rev": "f3918c30c5c2cb527c0b071a27c35120a6c0719a"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "google.golang.org/grpc",
|
"ImportPath": "google.golang.org/grpc",
|
||||||
"Comment": "v1.0.5",
|
"Comment": "v1.0.5",
|
||||||
|
65
vendor/github.com/containerd/containerd/progress/bar.go
generated
vendored
65
vendor/github.com/containerd/containerd/progress/bar.go
generated
vendored
@ -1,65 +0,0 @@
|
|||||||
package progress
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODO(stevvooe): We may want to support more interesting parameterization of
|
|
||||||
// the bar. For now, it is very simple.
|
|
||||||
|
|
||||||
// Bar provides a very simple progress bar implementation.
|
|
||||||
//
|
|
||||||
// Use with fmt.Printf and "r" to format the progress bar. A "-" flag makes it
|
|
||||||
// progress from right to left.
|
|
||||||
type Bar float64
|
|
||||||
|
|
||||||
var _ fmt.Formatter = Bar(1.0)
|
|
||||||
|
|
||||||
func (h Bar) Format(state fmt.State, r rune) {
|
|
||||||
switch r {
|
|
||||||
case 'r':
|
|
||||||
default:
|
|
||||||
panic(fmt.Sprintf("%v: unexpected format character", float64(h)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if h > 1.0 {
|
|
||||||
h = 1.0
|
|
||||||
}
|
|
||||||
|
|
||||||
if h < 0.0 {
|
|
||||||
h = 0.0
|
|
||||||
}
|
|
||||||
|
|
||||||
if state.Flag('-') {
|
|
||||||
h = 1.0 - h
|
|
||||||
}
|
|
||||||
|
|
||||||
width, ok := state.Width()
|
|
||||||
if !ok {
|
|
||||||
// default width of 40
|
|
||||||
width = 40
|
|
||||||
}
|
|
||||||
|
|
||||||
var pad int
|
|
||||||
|
|
||||||
extra := len([]byte(green)) + len([]byte(reset))
|
|
||||||
|
|
||||||
p := make([]byte, width+extra)
|
|
||||||
p[0], p[len(p)-1] = '|', '|'
|
|
||||||
pad += 2
|
|
||||||
|
|
||||||
positive := int(Bar(width-pad) * h)
|
|
||||||
negative := width - pad - positive
|
|
||||||
|
|
||||||
n := 1
|
|
||||||
n += copy(p[n:], []byte(green))
|
|
||||||
n += copy(p[n:], bytes.Repeat([]byte("+"), positive))
|
|
||||||
n += copy(p[n:], []byte(reset))
|
|
||||||
|
|
||||||
if negative > 0 {
|
|
||||||
n += copy(p[n:len(p)-1], bytes.Repeat([]byte("-"), negative))
|
|
||||||
}
|
|
||||||
|
|
||||||
state.Write(p)
|
|
||||||
}
|
|
2
vendor/github.com/containerd/containerd/progress/doc.go
generated
vendored
2
vendor/github.com/containerd/containerd/progress/doc.go
generated
vendored
@ -1,2 +0,0 @@
|
|||||||
// Package progress assists in displaying human readable progress information.
|
|
||||||
package progress
|
|
8
vendor/github.com/containerd/containerd/progress/escape.go
generated
vendored
8
vendor/github.com/containerd/containerd/progress/escape.go
generated
vendored
@ -1,8 +0,0 @@
|
|||||||
package progress
|
|
||||||
|
|
||||||
const (
|
|
||||||
escape = "\x1b"
|
|
||||||
reset = escape + "[0m"
|
|
||||||
red = escape + "[31m"
|
|
||||||
green = escape + "[32m"
|
|
||||||
)
|
|
25
vendor/github.com/containerd/containerd/progress/humaans.go
generated
vendored
25
vendor/github.com/containerd/containerd/progress/humaans.go
generated
vendored
@ -1,25 +0,0 @@
|
|||||||
package progress
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
units "github.com/docker/go-units"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Bytes converts a regular int64 to human readable type.
|
|
||||||
type Bytes int64
|
|
||||||
|
|
||||||
func (b Bytes) String() string {
|
|
||||||
return units.CustomSize("%02.1f %s", float64(b), 1024.0, []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"})
|
|
||||||
}
|
|
||||||
|
|
||||||
type BytesPerSecond int64
|
|
||||||
|
|
||||||
func NewBytesPerSecond(n int64, duration time.Duration) BytesPerSecond {
|
|
||||||
return BytesPerSecond(float64(n) / duration.Seconds())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (bps BytesPerSecond) String() string {
|
|
||||||
return fmt.Sprintf("%v/s", Bytes(bps))
|
|
||||||
}
|
|
60
vendor/github.com/containerd/containerd/progress/writer.go
generated
vendored
60
vendor/github.com/containerd/containerd/progress/writer.go
generated
vendored
@ -1,60 +0,0 @@
|
|||||||
package progress
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Writer buffers writes until flush, at which time the last screen is cleared
|
|
||||||
// and the current buffer contents are written. This is useful for
|
|
||||||
// implementing progress displays, such as those implemented in docker and
|
|
||||||
// git.
|
|
||||||
type Writer struct {
|
|
||||||
buf bytes.Buffer
|
|
||||||
w io.Writer
|
|
||||||
lines int
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewWriter(w io.Writer) *Writer {
|
|
||||||
return &Writer{
|
|
||||||
w: w,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *Writer) Write(p []byte) (n int, err error) {
|
|
||||||
return w.buf.Write(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Flush should be called when refreshing the current display.
|
|
||||||
func (w *Writer) Flush() error {
|
|
||||||
if w.buf.Len() == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := w.clear(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
w.lines = bytes.Count(w.buf.Bytes(), []byte("\n"))
|
|
||||||
|
|
||||||
if _, err := w.w.Write(w.buf.Bytes()); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
w.buf.Reset()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(stevvooe): The following are system specific. Break these out if we
|
|
||||||
// decide to build this package further.
|
|
||||||
|
|
||||||
func (w *Writer) clear() error {
|
|
||||||
for i := 0; i < w.lines; i++ {
|
|
||||||
if _, err := fmt.Fprintf(w.w, "\x1b[0A\x1b[2K\r"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
67
vendor/github.com/docker/go-units/CONTRIBUTING.md
generated
vendored
67
vendor/github.com/docker/go-units/CONTRIBUTING.md
generated
vendored
@ -1,67 +0,0 @@
|
|||||||
# Contributing to go-units
|
|
||||||
|
|
||||||
Want to hack on go-units? Awesome! Here are instructions to get you started.
|
|
||||||
|
|
||||||
go-units is a part of the [Docker](https://www.docker.com) project, and follows
|
|
||||||
the same rules and principles. If you're already familiar with the way
|
|
||||||
Docker does things, you'll feel right at home.
|
|
||||||
|
|
||||||
Otherwise, go read Docker's
|
|
||||||
[contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md),
|
|
||||||
[issue triaging](https://github.com/docker/docker/blob/master/project/ISSUE-TRIAGE.md),
|
|
||||||
[review process](https://github.com/docker/docker/blob/master/project/REVIEWING.md) and
|
|
||||||
[branches and tags](https://github.com/docker/docker/blob/master/project/BRANCHES-AND-TAGS.md).
|
|
||||||
|
|
||||||
### Sign your work
|
|
||||||
|
|
||||||
The sign-off is a simple line at the end of the explanation for the patch. Your
|
|
||||||
signature certifies that you wrote the patch or otherwise have the right to pass
|
|
||||||
it on as an open-source patch. The rules are pretty simple: if you can certify
|
|
||||||
the below (from [developercertificate.org](http://developercertificate.org/)):
|
|
||||||
|
|
||||||
```
|
|
||||||
Developer Certificate of Origin
|
|
||||||
Version 1.1
|
|
||||||
|
|
||||||
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
|
||||||
660 York Street, Suite 102,
|
|
||||||
San Francisco, CA 94110 USA
|
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies of this
|
|
||||||
license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Developer's Certificate of Origin 1.1
|
|
||||||
|
|
||||||
By making a contribution to this project, I certify that:
|
|
||||||
|
|
||||||
(a) The contribution was created in whole or in part by me and I
|
|
||||||
have the right to submit it under the open source license
|
|
||||||
indicated in the file; or
|
|
||||||
|
|
||||||
(b) The contribution is based upon previous work that, to the best
|
|
||||||
of my knowledge, is covered under an appropriate open source
|
|
||||||
license and I have the right under that license to submit that
|
|
||||||
work with modifications, whether created in whole or in part
|
|
||||||
by me, under the same open source license (unless I am
|
|
||||||
permitted to submit under a different license), as indicated
|
|
||||||
in the file; or
|
|
||||||
|
|
||||||
(c) The contribution was provided directly to me by some other
|
|
||||||
person who certified (a), (b) or (c) and I have not modified
|
|
||||||
it.
|
|
||||||
|
|
||||||
(d) I understand and agree that this project and the contribution
|
|
||||||
are public and that a record of the contribution (including all
|
|
||||||
personal information I submit with it, including my sign-off) is
|
|
||||||
maintained indefinitely and may be redistributed consistent with
|
|
||||||
this project or the open source license(s) involved.
|
|
||||||
```
|
|
||||||
|
|
||||||
Then you just add a line to every git commit message:
|
|
||||||
|
|
||||||
Signed-off-by: Joe Smith <joe.smith@email.com>
|
|
||||||
|
|
||||||
Use your real name (sorry, no pseudonyms or anonymous contributions.)
|
|
||||||
|
|
||||||
If you set your `user.name` and `user.email` git configs, you can sign your
|
|
||||||
commit automatically with `git commit -s`.
|
|
191
vendor/github.com/docker/go-units/LICENSE
generated
vendored
191
vendor/github.com/docker/go-units/LICENSE
generated
vendored
@ -1,191 +0,0 @@
|
|||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
https://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Copyright 2015 Docker, 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
|
|
||||||
|
|
||||||
https://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.
|
|
27
vendor/github.com/docker/go-units/MAINTAINERS
generated
vendored
27
vendor/github.com/docker/go-units/MAINTAINERS
generated
vendored
@ -1,27 +0,0 @@
|
|||||||
# go-connections maintainers file
|
|
||||||
#
|
|
||||||
# This file describes who runs the docker/go-connections project and how.
|
|
||||||
# This is a living document - if you see something out of date or missing, speak up!
|
|
||||||
#
|
|
||||||
# It is structured to be consumable by both humans and programs.
|
|
||||||
# To extract its contents programmatically, use any TOML-compliant parser.
|
|
||||||
#
|
|
||||||
# This file is compiled into the MAINTAINERS file in docker/opensource.
|
|
||||||
#
|
|
||||||
[Org]
|
|
||||||
[Org."Core maintainers"]
|
|
||||||
people = [
|
|
||||||
"calavera",
|
|
||||||
]
|
|
||||||
|
|
||||||
[people]
|
|
||||||
|
|
||||||
# A reference list of all people associated with the project.
|
|
||||||
# All other sections should refer to people by their canonical key
|
|
||||||
# in the people section.
|
|
||||||
|
|
||||||
# ADD YOURSELF HERE IN ALPHABETICAL ORDER
|
|
||||||
[people.calavera]
|
|
||||||
Name = "David Calavera"
|
|
||||||
Email = "david.calavera@gmail.com"
|
|
||||||
GitHub = "calavera"
|
|
16
vendor/github.com/docker/go-units/README.md
generated
vendored
16
vendor/github.com/docker/go-units/README.md
generated
vendored
@ -1,16 +0,0 @@
|
|||||||
[](https://godoc.org/github.com/docker/go-units)
|
|
||||||
|
|
||||||
# Introduction
|
|
||||||
|
|
||||||
go-units is a library to transform human friendly measurements into machine friendly values.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
See the [docs in godoc](https://godoc.org/github.com/docker/go-units) for examples and documentation.
|
|
||||||
|
|
||||||
## Copyright and license
|
|
||||||
|
|
||||||
Copyright © 2015 Docker, Inc.
|
|
||||||
|
|
||||||
go-units is licensed under the Apache License, Version 2.0.
|
|
||||||
See [LICENSE](LICENSE) for the full text of the license.
|
|
11
vendor/github.com/docker/go-units/circle.yml
generated
vendored
11
vendor/github.com/docker/go-units/circle.yml
generated
vendored
@ -1,11 +0,0 @@
|
|||||||
dependencies:
|
|
||||||
post:
|
|
||||||
# install golint
|
|
||||||
- go get github.com/golang/lint/golint
|
|
||||||
|
|
||||||
test:
|
|
||||||
pre:
|
|
||||||
# run analysis before tests
|
|
||||||
- go vet ./...
|
|
||||||
- test -z "$(golint ./... | tee /dev/stderr)"
|
|
||||||
- test -z "$(gofmt -s -l . | tee /dev/stderr)"
|
|
33
vendor/github.com/docker/go-units/duration.go
generated
vendored
33
vendor/github.com/docker/go-units/duration.go
generated
vendored
@ -1,33 +0,0 @@
|
|||||||
// Package units provides helper function to parse and print size and time units
|
|
||||||
// in human-readable format.
|
|
||||||
package units
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// HumanDuration returns a human-readable approximation of a duration
|
|
||||||
// (eg. "About a minute", "4 hours ago", etc.).
|
|
||||||
func HumanDuration(d time.Duration) string {
|
|
||||||
if seconds := int(d.Seconds()); seconds < 1 {
|
|
||||||
return "Less than a second"
|
|
||||||
} else if seconds < 60 {
|
|
||||||
return fmt.Sprintf("%d seconds", seconds)
|
|
||||||
} else if minutes := int(d.Minutes()); minutes == 1 {
|
|
||||||
return "About a minute"
|
|
||||||
} else if minutes < 60 {
|
|
||||||
return fmt.Sprintf("%d minutes", minutes)
|
|
||||||
} else if hours := int(d.Hours()); hours == 1 {
|
|
||||||
return "About an hour"
|
|
||||||
} else if hours < 48 {
|
|
||||||
return fmt.Sprintf("%d hours", hours)
|
|
||||||
} else if hours < 24*7*2 {
|
|
||||||
return fmt.Sprintf("%d days", hours/24)
|
|
||||||
} else if hours < 24*30*3 {
|
|
||||||
return fmt.Sprintf("%d weeks", hours/24/7)
|
|
||||||
} else if hours < 24*365*2 {
|
|
||||||
return fmt.Sprintf("%d months", hours/24/30)
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%d years", int(d.Hours())/24/365)
|
|
||||||
}
|
|
96
vendor/github.com/docker/go-units/size.go
generated
vendored
96
vendor/github.com/docker/go-units/size.go
generated
vendored
@ -1,96 +0,0 @@
|
|||||||
package units
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"regexp"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// See: http://en.wikipedia.org/wiki/Binary_prefix
|
|
||||||
const (
|
|
||||||
// Decimal
|
|
||||||
|
|
||||||
KB = 1000
|
|
||||||
MB = 1000 * KB
|
|
||||||
GB = 1000 * MB
|
|
||||||
TB = 1000 * GB
|
|
||||||
PB = 1000 * TB
|
|
||||||
|
|
||||||
// Binary
|
|
||||||
|
|
||||||
KiB = 1024
|
|
||||||
MiB = 1024 * KiB
|
|
||||||
GiB = 1024 * MiB
|
|
||||||
TiB = 1024 * GiB
|
|
||||||
PiB = 1024 * TiB
|
|
||||||
)
|
|
||||||
|
|
||||||
type unitMap map[string]int64
|
|
||||||
|
|
||||||
var (
|
|
||||||
decimalMap = unitMap{"k": KB, "m": MB, "g": GB, "t": TB, "p": PB}
|
|
||||||
binaryMap = unitMap{"k": KiB, "m": MiB, "g": GiB, "t": TiB, "p": PiB}
|
|
||||||
sizeRegex = regexp.MustCompile(`^(\d+(\.\d+)*) ?([kKmMgGtTpP])?[bB]?$`)
|
|
||||||
)
|
|
||||||
|
|
||||||
var decimapAbbrs = []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}
|
|
||||||
var binaryAbbrs = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"}
|
|
||||||
|
|
||||||
// CustomSize returns a human-readable approximation of a size
|
|
||||||
// using custom format.
|
|
||||||
func CustomSize(format string, size float64, base float64, _map []string) string {
|
|
||||||
i := 0
|
|
||||||
unitsLimit := len(_map) - 1
|
|
||||||
for size >= base && i < unitsLimit {
|
|
||||||
size = size / base
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
return fmt.Sprintf(format, size, _map[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
// HumanSize returns a human-readable approximation of a size
|
|
||||||
// capped at 4 valid numbers (eg. "2.746 MB", "796 KB").
|
|
||||||
func HumanSize(size float64) string {
|
|
||||||
return CustomSize("%.4g %s", size, 1000.0, decimapAbbrs)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesSize returns a human-readable size in bytes, kibibytes,
|
|
||||||
// mebibytes, gibibytes, or tebibytes (eg. "44kiB", "17MiB").
|
|
||||||
func BytesSize(size float64) string {
|
|
||||||
return CustomSize("%.4g %s", size, 1024.0, binaryAbbrs)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromHumanSize returns an integer from a human-readable specification of a
|
|
||||||
// size using SI standard (eg. "44kB", "17MB").
|
|
||||||
func FromHumanSize(size string) (int64, error) {
|
|
||||||
return parseSize(size, decimalMap)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RAMInBytes parses a human-readable string representing an amount of RAM
|
|
||||||
// in bytes, kibibytes, mebibytes, gibibytes, or tebibytes and
|
|
||||||
// returns the number of bytes, or -1 if the string is unparseable.
|
|
||||||
// Units are case-insensitive, and the 'b' suffix is optional.
|
|
||||||
func RAMInBytes(size string) (int64, error) {
|
|
||||||
return parseSize(size, binaryMap)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parses the human-readable size string into the amount it represents.
|
|
||||||
func parseSize(sizeStr string, uMap unitMap) (int64, error) {
|
|
||||||
matches := sizeRegex.FindStringSubmatch(sizeStr)
|
|
||||||
if len(matches) != 4 {
|
|
||||||
return -1, fmt.Errorf("invalid size: '%s'", sizeStr)
|
|
||||||
}
|
|
||||||
|
|
||||||
size, err := strconv.ParseFloat(matches[1], 64)
|
|
||||||
if err != nil {
|
|
||||||
return -1, err
|
|
||||||
}
|
|
||||||
|
|
||||||
unitPrefix := strings.ToLower(matches[3])
|
|
||||||
if mul, ok := uMap[unitPrefix]; ok {
|
|
||||||
size *= float64(mul)
|
|
||||||
}
|
|
||||||
|
|
||||||
return int64(size), nil
|
|
||||||
}
|
|
118
vendor/github.com/docker/go-units/ulimit.go
generated
vendored
118
vendor/github.com/docker/go-units/ulimit.go
generated
vendored
@ -1,118 +0,0 @@
|
|||||||
package units
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Ulimit is a human friendly version of Rlimit.
|
|
||||||
type Ulimit struct {
|
|
||||||
Name string
|
|
||||||
Hard int64
|
|
||||||
Soft int64
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rlimit specifies the resource limits, such as max open files.
|
|
||||||
type Rlimit struct {
|
|
||||||
Type int `json:"type,omitempty"`
|
|
||||||
Hard uint64 `json:"hard,omitempty"`
|
|
||||||
Soft uint64 `json:"soft,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
// magic numbers for making the syscall
|
|
||||||
// some of these are defined in the syscall package, but not all.
|
|
||||||
// Also since Windows client doesn't get access to the syscall package, need to
|
|
||||||
// define these here
|
|
||||||
rlimitAs = 9
|
|
||||||
rlimitCore = 4
|
|
||||||
rlimitCPU = 0
|
|
||||||
rlimitData = 2
|
|
||||||
rlimitFsize = 1
|
|
||||||
rlimitLocks = 10
|
|
||||||
rlimitMemlock = 8
|
|
||||||
rlimitMsgqueue = 12
|
|
||||||
rlimitNice = 13
|
|
||||||
rlimitNofile = 7
|
|
||||||
rlimitNproc = 6
|
|
||||||
rlimitRss = 5
|
|
||||||
rlimitRtprio = 14
|
|
||||||
rlimitRttime = 15
|
|
||||||
rlimitSigpending = 11
|
|
||||||
rlimitStack = 3
|
|
||||||
)
|
|
||||||
|
|
||||||
var ulimitNameMapping = map[string]int{
|
|
||||||
//"as": rlimitAs, // Disabled since this doesn't seem usable with the way Docker inits a container.
|
|
||||||
"core": rlimitCore,
|
|
||||||
"cpu": rlimitCPU,
|
|
||||||
"data": rlimitData,
|
|
||||||
"fsize": rlimitFsize,
|
|
||||||
"locks": rlimitLocks,
|
|
||||||
"memlock": rlimitMemlock,
|
|
||||||
"msgqueue": rlimitMsgqueue,
|
|
||||||
"nice": rlimitNice,
|
|
||||||
"nofile": rlimitNofile,
|
|
||||||
"nproc": rlimitNproc,
|
|
||||||
"rss": rlimitRss,
|
|
||||||
"rtprio": rlimitRtprio,
|
|
||||||
"rttime": rlimitRttime,
|
|
||||||
"sigpending": rlimitSigpending,
|
|
||||||
"stack": rlimitStack,
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseUlimit parses and returns a Ulimit from the specified string.
|
|
||||||
func ParseUlimit(val string) (*Ulimit, error) {
|
|
||||||
parts := strings.SplitN(val, "=", 2)
|
|
||||||
if len(parts) != 2 {
|
|
||||||
return nil, fmt.Errorf("invalid ulimit argument: %s", val)
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, exists := ulimitNameMapping[parts[0]]; !exists {
|
|
||||||
return nil, fmt.Errorf("invalid ulimit type: %s", parts[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
soft int64
|
|
||||||
hard = &soft // default to soft in case no hard was set
|
|
||||||
temp int64
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
switch limitVals := strings.Split(parts[1], ":"); len(limitVals) {
|
|
||||||
case 2:
|
|
||||||
temp, err = strconv.ParseInt(limitVals[1], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
hard = &temp
|
|
||||||
fallthrough
|
|
||||||
case 1:
|
|
||||||
soft, err = strconv.ParseInt(limitVals[0], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("too many limit value arguments - %s, can only have up to two, `soft[:hard]`", parts[1])
|
|
||||||
}
|
|
||||||
|
|
||||||
if soft > *hard {
|
|
||||||
return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: %d > %d", soft, *hard)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &Ulimit{Name: parts[0], Soft: soft, Hard: *hard}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRlimit returns the RLimit corresponding to Ulimit.
|
|
||||||
func (u *Ulimit) GetRlimit() (*Rlimit, error) {
|
|
||||||
t, exists := ulimitNameMapping[u.Name]
|
|
||||||
if !exists {
|
|
||||||
return nil, fmt.Errorf("invalid ulimit name %s", u.Name)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &Rlimit{Type: t, Soft: uint64(u.Soft), Hard: uint64(u.Hard)}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Ulimit) String() string {
|
|
||||||
return fmt.Sprintf("%s=%d:%d", u.Name, u.Soft, u.Hard)
|
|
||||||
}
|
|
14
vendor/github.com/gogo/protobuf/AUTHORS
generated
vendored
Normal file
14
vendor/github.com/gogo/protobuf/AUTHORS
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# This is the official list of GoGo authors for copyright purposes.
|
||||||
|
# This file is distinct from the CONTRIBUTORS file, which
|
||||||
|
# lists people. For example, employees are listed in CONTRIBUTORS,
|
||||||
|
# but not in AUTHORS, because the employer holds the copyright.
|
||||||
|
|
||||||
|
# Names should be added to this file as one of
|
||||||
|
# Organization's name
|
||||||
|
# Individual's name <submission email address>
|
||||||
|
# Individual's name <submission email address> <email2> <emailN>
|
||||||
|
|
||||||
|
# Please keep the list sorted.
|
||||||
|
|
||||||
|
Vastech SA (PTY) LTD
|
||||||
|
Walter Schulze <awalterschulze@gmail.com>
|
18
vendor/github.com/gogo/protobuf/CONTRIBUTORS
generated
vendored
Normal file
18
vendor/github.com/gogo/protobuf/CONTRIBUTORS
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
Anton Povarov <anton.povarov@gmail.com>
|
||||||
|
Clayton Coleman <ccoleman@redhat.com>
|
||||||
|
Denis Smirnov <denis.smirnov.91@gmail.com>
|
||||||
|
DongYun Kang <ceram1000@gmail.com>
|
||||||
|
Dwayne Schultz <dschultz@pivotal.io>
|
||||||
|
Georg Apitz <gapitz@pivotal.io>
|
||||||
|
Gustav Paul <gustav.paul@gmail.com>
|
||||||
|
Johan Brandhorst <johan.brandhorst@gmail.com>
|
||||||
|
John Shahid <jvshahid@gmail.com>
|
||||||
|
John Tuley <john@tuley.org>
|
||||||
|
Laurent <laurent@adyoulike.com>
|
||||||
|
Patrick Lee <patrick@dropbox.com>
|
||||||
|
Sergio Arbeo <serabe@gmail.com>
|
||||||
|
Stephen J Day <stephen.day@docker.com>
|
||||||
|
Tamir Duberstein <tamird@gmail.com>
|
||||||
|
Todd Eisenberger <teisenberger@dropbox.com>
|
||||||
|
Tormod Erevik Lea <tormodlea@gmail.com>
|
||||||
|
Walter Schulze <awalterschulze@gmail.com>
|
3
vendor/github.com/golang/protobuf/AUTHORS
generated
vendored
Normal file
3
vendor/github.com/golang/protobuf/AUTHORS
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# This source code refers to The Go Authors for copyright purposes.
|
||||||
|
# The master list of authors is in the main Go distribution,
|
||||||
|
# visible at http://tip.golang.org/AUTHORS.
|
3
vendor/github.com/golang/protobuf/CONTRIBUTORS
generated
vendored
Normal file
3
vendor/github.com/golang/protobuf/CONTRIBUTORS
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# This source code was written by the Go contributors.
|
||||||
|
# The master list of contributors is in the main Go distribution,
|
||||||
|
# visible at http://tip.golang.org/CONTRIBUTORS.
|
24
vendor/github.com/pkg/errors/.gitignore
generated
vendored
Normal file
24
vendor/github.com/pkg/errors/.gitignore
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Folders
|
||||||
|
_obj
|
||||||
|
_test
|
||||||
|
|
||||||
|
# Architecture specific extensions/prefixes
|
||||||
|
*.[568vq]
|
||||||
|
[568vq].out
|
||||||
|
|
||||||
|
*.cgo1.go
|
||||||
|
*.cgo2.c
|
||||||
|
_cgo_defun.c
|
||||||
|
_cgo_gotypes.go
|
||||||
|
_cgo_export.*
|
||||||
|
|
||||||
|
_testmain.go
|
||||||
|
|
||||||
|
*.exe
|
||||||
|
*.test
|
||||||
|
*.prof
|
11
vendor/github.com/pkg/errors/.travis.yml
generated
vendored
Normal file
11
vendor/github.com/pkg/errors/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
language: go
|
||||||
|
go_import_path: github.com/pkg/errors
|
||||||
|
go:
|
||||||
|
- 1.4.3
|
||||||
|
- 1.5.4
|
||||||
|
- 1.6.2
|
||||||
|
- 1.7.1
|
||||||
|
- tip
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go test -v ./...
|
63
vendor/github.com/pkg/errors/bench_test.go
generated
vendored
63
vendor/github.com/pkg/errors/bench_test.go
generated
vendored
@ -1,63 +0,0 @@
|
|||||||
// +build go1.7
|
|
||||||
|
|
||||||
package errors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
stderrors "errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
func noErrors(at, depth int) error {
|
|
||||||
if at >= depth {
|
|
||||||
return stderrors.New("no error")
|
|
||||||
}
|
|
||||||
return noErrors(at+1, depth)
|
|
||||||
}
|
|
||||||
|
|
||||||
func yesErrors(at, depth int) error {
|
|
||||||
if at >= depth {
|
|
||||||
return New("ye error")
|
|
||||||
}
|
|
||||||
return yesErrors(at+1, depth)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GlobalE is an exported global to store the result of benchmark results,
|
|
||||||
// preventing the compiler from optimising the benchmark functions away.
|
|
||||||
var GlobalE error
|
|
||||||
|
|
||||||
func BenchmarkErrors(b *testing.B) {
|
|
||||||
type run struct {
|
|
||||||
stack int
|
|
||||||
std bool
|
|
||||||
}
|
|
||||||
runs := []run{
|
|
||||||
{10, false},
|
|
||||||
{10, true},
|
|
||||||
{100, false},
|
|
||||||
{100, true},
|
|
||||||
{1000, false},
|
|
||||||
{1000, true},
|
|
||||||
}
|
|
||||||
for _, r := range runs {
|
|
||||||
part := "pkg/errors"
|
|
||||||
if r.std {
|
|
||||||
part = "errors"
|
|
||||||
}
|
|
||||||
name := fmt.Sprintf("%s-stack-%d", part, r.stack)
|
|
||||||
b.Run(name, func(b *testing.B) {
|
|
||||||
var err error
|
|
||||||
f := yesErrors
|
|
||||||
if r.std {
|
|
||||||
f = noErrors
|
|
||||||
}
|
|
||||||
b.ReportAllocs()
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
err = f(0, r.stack)
|
|
||||||
}
|
|
||||||
b.StopTimer()
|
|
||||||
GlobalE = err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
225
vendor/github.com/pkg/errors/errors_test.go
generated
vendored
225
vendor/github.com/pkg/errors/errors_test.go
generated
vendored
@ -1,225 +0,0 @@
|
|||||||
package errors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestNew(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
err string
|
|
||||||
want error
|
|
||||||
}{
|
|
||||||
{"", fmt.Errorf("")},
|
|
||||||
{"foo", fmt.Errorf("foo")},
|
|
||||||
{"foo", New("foo")},
|
|
||||||
{"string with format specifiers: %v", errors.New("string with format specifiers: %v")},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
got := New(tt.err)
|
|
||||||
if got.Error() != tt.want.Error() {
|
|
||||||
t.Errorf("New.Error(): got: %q, want %q", got, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWrapNil(t *testing.T) {
|
|
||||||
got := Wrap(nil, "no error")
|
|
||||||
if got != nil {
|
|
||||||
t.Errorf("Wrap(nil, \"no error\"): got %#v, expected nil", got)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWrap(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
err error
|
|
||||||
message string
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{io.EOF, "read error", "read error: EOF"},
|
|
||||||
{Wrap(io.EOF, "read error"), "client error", "client error: read error: EOF"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
got := Wrap(tt.err, tt.message).Error()
|
|
||||||
if got != tt.want {
|
|
||||||
t.Errorf("Wrap(%v, %q): got: %v, want %v", tt.err, tt.message, got, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type nilError struct{}
|
|
||||||
|
|
||||||
func (nilError) Error() string { return "nil error" }
|
|
||||||
|
|
||||||
func TestCause(t *testing.T) {
|
|
||||||
x := New("error")
|
|
||||||
tests := []struct {
|
|
||||||
err error
|
|
||||||
want error
|
|
||||||
}{{
|
|
||||||
// nil error is nil
|
|
||||||
err: nil,
|
|
||||||
want: nil,
|
|
||||||
}, {
|
|
||||||
// explicit nil error is nil
|
|
||||||
err: (error)(nil),
|
|
||||||
want: nil,
|
|
||||||
}, {
|
|
||||||
// typed nil is nil
|
|
||||||
err: (*nilError)(nil),
|
|
||||||
want: (*nilError)(nil),
|
|
||||||
}, {
|
|
||||||
// uncaused error is unaffected
|
|
||||||
err: io.EOF,
|
|
||||||
want: io.EOF,
|
|
||||||
}, {
|
|
||||||
// caused error returns cause
|
|
||||||
err: Wrap(io.EOF, "ignored"),
|
|
||||||
want: io.EOF,
|
|
||||||
}, {
|
|
||||||
err: x, // return from errors.New
|
|
||||||
want: x,
|
|
||||||
}, {
|
|
||||||
WithMessage(nil, "whoops"),
|
|
||||||
nil,
|
|
||||||
}, {
|
|
||||||
WithMessage(io.EOF, "whoops"),
|
|
||||||
io.EOF,
|
|
||||||
}, {
|
|
||||||
WithStack(nil),
|
|
||||||
nil,
|
|
||||||
}, {
|
|
||||||
WithStack(io.EOF),
|
|
||||||
io.EOF,
|
|
||||||
}}
|
|
||||||
|
|
||||||
for i, tt := range tests {
|
|
||||||
got := Cause(tt.err)
|
|
||||||
if !reflect.DeepEqual(got, tt.want) {
|
|
||||||
t.Errorf("test %d: got %#v, want %#v", i+1, got, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWrapfNil(t *testing.T) {
|
|
||||||
got := Wrapf(nil, "no error")
|
|
||||||
if got != nil {
|
|
||||||
t.Errorf("Wrapf(nil, \"no error\"): got %#v, expected nil", got)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWrapf(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
err error
|
|
||||||
message string
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{io.EOF, "read error", "read error: EOF"},
|
|
||||||
{Wrapf(io.EOF, "read error without format specifiers"), "client error", "client error: read error without format specifiers: EOF"},
|
|
||||||
{Wrapf(io.EOF, "read error with %d format specifier", 1), "client error", "client error: read error with 1 format specifier: EOF"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
got := Wrapf(tt.err, tt.message).Error()
|
|
||||||
if got != tt.want {
|
|
||||||
t.Errorf("Wrapf(%v, %q): got: %v, want %v", tt.err, tt.message, got, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestErrorf(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
err error
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{Errorf("read error without format specifiers"), "read error without format specifiers"},
|
|
||||||
{Errorf("read error with %d format specifier", 1), "read error with 1 format specifier"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
got := tt.err.Error()
|
|
||||||
if got != tt.want {
|
|
||||||
t.Errorf("Errorf(%v): got: %q, want %q", tt.err, got, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWithStackNil(t *testing.T) {
|
|
||||||
got := WithStack(nil)
|
|
||||||
if got != nil {
|
|
||||||
t.Errorf("WithStack(nil): got %#v, expected nil", got)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWithStack(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
err error
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{io.EOF, "EOF"},
|
|
||||||
{WithStack(io.EOF), "EOF"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
got := WithStack(tt.err).Error()
|
|
||||||
if got != tt.want {
|
|
||||||
t.Errorf("WithStack(%v): got: %v, want %v", tt.err, got, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWithMessageNil(t *testing.T) {
|
|
||||||
got := WithMessage(nil, "no error")
|
|
||||||
if got != nil {
|
|
||||||
t.Errorf("WithMessage(nil, \"no error\"): got %#v, expected nil", got)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWithMessage(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
err error
|
|
||||||
message string
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{io.EOF, "read error", "read error: EOF"},
|
|
||||||
{WithMessage(io.EOF, "read error"), "client error", "client error: read error: EOF"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
got := WithMessage(tt.err, tt.message).Error()
|
|
||||||
if got != tt.want {
|
|
||||||
t.Errorf("WithMessage(%v, %q): got: %q, want %q", tt.err, tt.message, got, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// errors.New, etc values are not expected to be compared by value
|
|
||||||
// but the change in errors#27 made them incomparable. Assert that
|
|
||||||
// various kinds of errors have a functional equality operator, even
|
|
||||||
// if the result of that equality is always false.
|
|
||||||
func TestErrorEquality(t *testing.T) {
|
|
||||||
vals := []error{
|
|
||||||
nil,
|
|
||||||
io.EOF,
|
|
||||||
errors.New("EOF"),
|
|
||||||
New("EOF"),
|
|
||||||
Errorf("EOF"),
|
|
||||||
Wrap(io.EOF, "EOF"),
|
|
||||||
Wrapf(io.EOF, "EOF%d", 2),
|
|
||||||
WithMessage(nil, "whoops"),
|
|
||||||
WithMessage(io.EOF, "whoops"),
|
|
||||||
WithStack(io.EOF),
|
|
||||||
WithStack(nil),
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := range vals {
|
|
||||||
for j := range vals {
|
|
||||||
_ = vals[i] == vals[j] // mustn't panic
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
205
vendor/github.com/pkg/errors/example_test.go
generated
vendored
205
vendor/github.com/pkg/errors/example_test.go
generated
vendored
@ -1,205 +0,0 @@
|
|||||||
package errors_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
func ExampleNew() {
|
|
||||||
err := errors.New("whoops")
|
|
||||||
fmt.Println(err)
|
|
||||||
|
|
||||||
// Output: whoops
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleNew_printf() {
|
|
||||||
err := errors.New("whoops")
|
|
||||||
fmt.Printf("%+v", err)
|
|
||||||
|
|
||||||
// Example output:
|
|
||||||
// whoops
|
|
||||||
// github.com/pkg/errors_test.ExampleNew_printf
|
|
||||||
// /home/dfc/src/github.com/pkg/errors/example_test.go:17
|
|
||||||
// testing.runExample
|
|
||||||
// /home/dfc/go/src/testing/example.go:114
|
|
||||||
// testing.RunExamples
|
|
||||||
// /home/dfc/go/src/testing/example.go:38
|
|
||||||
// testing.(*M).Run
|
|
||||||
// /home/dfc/go/src/testing/testing.go:744
|
|
||||||
// main.main
|
|
||||||
// /github.com/pkg/errors/_test/_testmain.go:106
|
|
||||||
// runtime.main
|
|
||||||
// /home/dfc/go/src/runtime/proc.go:183
|
|
||||||
// runtime.goexit
|
|
||||||
// /home/dfc/go/src/runtime/asm_amd64.s:2059
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleWithMessage() {
|
|
||||||
cause := errors.New("whoops")
|
|
||||||
err := errors.WithMessage(cause, "oh noes")
|
|
||||||
fmt.Println(err)
|
|
||||||
|
|
||||||
// Output: oh noes: whoops
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleWithStack() {
|
|
||||||
cause := errors.New("whoops")
|
|
||||||
err := errors.WithStack(cause)
|
|
||||||
fmt.Println(err)
|
|
||||||
|
|
||||||
// Output: whoops
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleWithStack_printf() {
|
|
||||||
cause := errors.New("whoops")
|
|
||||||
err := errors.WithStack(cause)
|
|
||||||
fmt.Printf("%+v", err)
|
|
||||||
|
|
||||||
// Example Output:
|
|
||||||
// whoops
|
|
||||||
// github.com/pkg/errors_test.ExampleWithStack_printf
|
|
||||||
// /home/fabstu/go/src/github.com/pkg/errors/example_test.go:55
|
|
||||||
// testing.runExample
|
|
||||||
// /usr/lib/go/src/testing/example.go:114
|
|
||||||
// testing.RunExamples
|
|
||||||
// /usr/lib/go/src/testing/example.go:38
|
|
||||||
// testing.(*M).Run
|
|
||||||
// /usr/lib/go/src/testing/testing.go:744
|
|
||||||
// main.main
|
|
||||||
// github.com/pkg/errors/_test/_testmain.go:106
|
|
||||||
// runtime.main
|
|
||||||
// /usr/lib/go/src/runtime/proc.go:183
|
|
||||||
// runtime.goexit
|
|
||||||
// /usr/lib/go/src/runtime/asm_amd64.s:2086
|
|
||||||
// github.com/pkg/errors_test.ExampleWithStack_printf
|
|
||||||
// /home/fabstu/go/src/github.com/pkg/errors/example_test.go:56
|
|
||||||
// testing.runExample
|
|
||||||
// /usr/lib/go/src/testing/example.go:114
|
|
||||||
// testing.RunExamples
|
|
||||||
// /usr/lib/go/src/testing/example.go:38
|
|
||||||
// testing.(*M).Run
|
|
||||||
// /usr/lib/go/src/testing/testing.go:744
|
|
||||||
// main.main
|
|
||||||
// github.com/pkg/errors/_test/_testmain.go:106
|
|
||||||
// runtime.main
|
|
||||||
// /usr/lib/go/src/runtime/proc.go:183
|
|
||||||
// runtime.goexit
|
|
||||||
// /usr/lib/go/src/runtime/asm_amd64.s:2086
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleWrap() {
|
|
||||||
cause := errors.New("whoops")
|
|
||||||
err := errors.Wrap(cause, "oh noes")
|
|
||||||
fmt.Println(err)
|
|
||||||
|
|
||||||
// Output: oh noes: whoops
|
|
||||||
}
|
|
||||||
|
|
||||||
func fn() error {
|
|
||||||
e1 := errors.New("error")
|
|
||||||
e2 := errors.Wrap(e1, "inner")
|
|
||||||
e3 := errors.Wrap(e2, "middle")
|
|
||||||
return errors.Wrap(e3, "outer")
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleCause() {
|
|
||||||
err := fn()
|
|
||||||
fmt.Println(err)
|
|
||||||
fmt.Println(errors.Cause(err))
|
|
||||||
|
|
||||||
// Output: outer: middle: inner: error
|
|
||||||
// error
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleWrap_extended() {
|
|
||||||
err := fn()
|
|
||||||
fmt.Printf("%+v\n", err)
|
|
||||||
|
|
||||||
// Example output:
|
|
||||||
// error
|
|
||||||
// github.com/pkg/errors_test.fn
|
|
||||||
// /home/dfc/src/github.com/pkg/errors/example_test.go:47
|
|
||||||
// github.com/pkg/errors_test.ExampleCause_printf
|
|
||||||
// /home/dfc/src/github.com/pkg/errors/example_test.go:63
|
|
||||||
// testing.runExample
|
|
||||||
// /home/dfc/go/src/testing/example.go:114
|
|
||||||
// testing.RunExamples
|
|
||||||
// /home/dfc/go/src/testing/example.go:38
|
|
||||||
// testing.(*M).Run
|
|
||||||
// /home/dfc/go/src/testing/testing.go:744
|
|
||||||
// main.main
|
|
||||||
// /github.com/pkg/errors/_test/_testmain.go:104
|
|
||||||
// runtime.main
|
|
||||||
// /home/dfc/go/src/runtime/proc.go:183
|
|
||||||
// runtime.goexit
|
|
||||||
// /home/dfc/go/src/runtime/asm_amd64.s:2059
|
|
||||||
// github.com/pkg/errors_test.fn
|
|
||||||
// /home/dfc/src/github.com/pkg/errors/example_test.go:48: inner
|
|
||||||
// github.com/pkg/errors_test.fn
|
|
||||||
// /home/dfc/src/github.com/pkg/errors/example_test.go:49: middle
|
|
||||||
// github.com/pkg/errors_test.fn
|
|
||||||
// /home/dfc/src/github.com/pkg/errors/example_test.go:50: outer
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleWrapf() {
|
|
||||||
cause := errors.New("whoops")
|
|
||||||
err := errors.Wrapf(cause, "oh noes #%d", 2)
|
|
||||||
fmt.Println(err)
|
|
||||||
|
|
||||||
// Output: oh noes #2: whoops
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleErrorf_extended() {
|
|
||||||
err := errors.Errorf("whoops: %s", "foo")
|
|
||||||
fmt.Printf("%+v", err)
|
|
||||||
|
|
||||||
// Example output:
|
|
||||||
// whoops: foo
|
|
||||||
// github.com/pkg/errors_test.ExampleErrorf
|
|
||||||
// /home/dfc/src/github.com/pkg/errors/example_test.go:101
|
|
||||||
// testing.runExample
|
|
||||||
// /home/dfc/go/src/testing/example.go:114
|
|
||||||
// testing.RunExamples
|
|
||||||
// /home/dfc/go/src/testing/example.go:38
|
|
||||||
// testing.(*M).Run
|
|
||||||
// /home/dfc/go/src/testing/testing.go:744
|
|
||||||
// main.main
|
|
||||||
// /github.com/pkg/errors/_test/_testmain.go:102
|
|
||||||
// runtime.main
|
|
||||||
// /home/dfc/go/src/runtime/proc.go:183
|
|
||||||
// runtime.goexit
|
|
||||||
// /home/dfc/go/src/runtime/asm_amd64.s:2059
|
|
||||||
}
|
|
||||||
|
|
||||||
func Example_stackTrace() {
|
|
||||||
type stackTracer interface {
|
|
||||||
StackTrace() errors.StackTrace
|
|
||||||
}
|
|
||||||
|
|
||||||
err, ok := errors.Cause(fn()).(stackTracer)
|
|
||||||
if !ok {
|
|
||||||
panic("oops, err does not implement stackTracer")
|
|
||||||
}
|
|
||||||
|
|
||||||
st := err.StackTrace()
|
|
||||||
fmt.Printf("%+v", st[0:2]) // top two frames
|
|
||||||
|
|
||||||
// Example output:
|
|
||||||
// github.com/pkg/errors_test.fn
|
|
||||||
// /home/dfc/src/github.com/pkg/errors/example_test.go:47
|
|
||||||
// github.com/pkg/errors_test.Example_stackTrace
|
|
||||||
// /home/dfc/src/github.com/pkg/errors/example_test.go:127
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleCause_printf() {
|
|
||||||
err := errors.Wrap(func() error {
|
|
||||||
return func() error {
|
|
||||||
return errors.Errorf("hello %s", fmt.Sprintf("world"))
|
|
||||||
}()
|
|
||||||
}(), "failed")
|
|
||||||
|
|
||||||
fmt.Printf("%v", err)
|
|
||||||
|
|
||||||
// Output: failed: hello world
|
|
||||||
}
|
|
535
vendor/github.com/pkg/errors/format_test.go
generated
vendored
535
vendor/github.com/pkg/errors/format_test.go
generated
vendored
@ -1,535 +0,0 @@
|
|||||||
package errors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestFormatNew(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
error
|
|
||||||
format string
|
|
||||||
want string
|
|
||||||
}{{
|
|
||||||
New("error"),
|
|
||||||
"%s",
|
|
||||||
"error",
|
|
||||||
}, {
|
|
||||||
New("error"),
|
|
||||||
"%v",
|
|
||||||
"error",
|
|
||||||
}, {
|
|
||||||
New("error"),
|
|
||||||
"%+v",
|
|
||||||
"error\n" +
|
|
||||||
"github.com/pkg/errors.TestFormatNew\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:26",
|
|
||||||
}, {
|
|
||||||
New("error"),
|
|
||||||
"%q",
|
|
||||||
`"error"`,
|
|
||||||
}}
|
|
||||||
|
|
||||||
for i, tt := range tests {
|
|
||||||
testFormatRegexp(t, i, tt.error, tt.format, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFormatErrorf(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
error
|
|
||||||
format string
|
|
||||||
want string
|
|
||||||
}{{
|
|
||||||
Errorf("%s", "error"),
|
|
||||||
"%s",
|
|
||||||
"error",
|
|
||||||
}, {
|
|
||||||
Errorf("%s", "error"),
|
|
||||||
"%v",
|
|
||||||
"error",
|
|
||||||
}, {
|
|
||||||
Errorf("%s", "error"),
|
|
||||||
"%+v",
|
|
||||||
"error\n" +
|
|
||||||
"github.com/pkg/errors.TestFormatErrorf\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:56",
|
|
||||||
}}
|
|
||||||
|
|
||||||
for i, tt := range tests {
|
|
||||||
testFormatRegexp(t, i, tt.error, tt.format, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFormatWrap(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
error
|
|
||||||
format string
|
|
||||||
want string
|
|
||||||
}{{
|
|
||||||
Wrap(New("error"), "error2"),
|
|
||||||
"%s",
|
|
||||||
"error2: error",
|
|
||||||
}, {
|
|
||||||
Wrap(New("error"), "error2"),
|
|
||||||
"%v",
|
|
||||||
"error2: error",
|
|
||||||
}, {
|
|
||||||
Wrap(New("error"), "error2"),
|
|
||||||
"%+v",
|
|
||||||
"error\n" +
|
|
||||||
"github.com/pkg/errors.TestFormatWrap\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:82",
|
|
||||||
}, {
|
|
||||||
Wrap(io.EOF, "error"),
|
|
||||||
"%s",
|
|
||||||
"error: EOF",
|
|
||||||
}, {
|
|
||||||
Wrap(io.EOF, "error"),
|
|
||||||
"%v",
|
|
||||||
"error: EOF",
|
|
||||||
}, {
|
|
||||||
Wrap(io.EOF, "error"),
|
|
||||||
"%+v",
|
|
||||||
"EOF\n" +
|
|
||||||
"error\n" +
|
|
||||||
"github.com/pkg/errors.TestFormatWrap\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:96",
|
|
||||||
}, {
|
|
||||||
Wrap(Wrap(io.EOF, "error1"), "error2"),
|
|
||||||
"%+v",
|
|
||||||
"EOF\n" +
|
|
||||||
"error1\n" +
|
|
||||||
"github.com/pkg/errors.TestFormatWrap\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:103\n",
|
|
||||||
}, {
|
|
||||||
Wrap(New("error with space"), "context"),
|
|
||||||
"%q",
|
|
||||||
`"context: error with space"`,
|
|
||||||
}}
|
|
||||||
|
|
||||||
for i, tt := range tests {
|
|
||||||
testFormatRegexp(t, i, tt.error, tt.format, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFormatWrapf(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
error
|
|
||||||
format string
|
|
||||||
want string
|
|
||||||
}{{
|
|
||||||
Wrapf(io.EOF, "error%d", 2),
|
|
||||||
"%s",
|
|
||||||
"error2: EOF",
|
|
||||||
}, {
|
|
||||||
Wrapf(io.EOF, "error%d", 2),
|
|
||||||
"%v",
|
|
||||||
"error2: EOF",
|
|
||||||
}, {
|
|
||||||
Wrapf(io.EOF, "error%d", 2),
|
|
||||||
"%+v",
|
|
||||||
"EOF\n" +
|
|
||||||
"error2\n" +
|
|
||||||
"github.com/pkg/errors.TestFormatWrapf\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:134",
|
|
||||||
}, {
|
|
||||||
Wrapf(New("error"), "error%d", 2),
|
|
||||||
"%s",
|
|
||||||
"error2: error",
|
|
||||||
}, {
|
|
||||||
Wrapf(New("error"), "error%d", 2),
|
|
||||||
"%v",
|
|
||||||
"error2: error",
|
|
||||||
}, {
|
|
||||||
Wrapf(New("error"), "error%d", 2),
|
|
||||||
"%+v",
|
|
||||||
"error\n" +
|
|
||||||
"github.com/pkg/errors.TestFormatWrapf\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:149",
|
|
||||||
}}
|
|
||||||
|
|
||||||
for i, tt := range tests {
|
|
||||||
testFormatRegexp(t, i, tt.error, tt.format, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFormatWithStack(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
error
|
|
||||||
format string
|
|
||||||
want []string
|
|
||||||
}{{
|
|
||||||
WithStack(io.EOF),
|
|
||||||
"%s",
|
|
||||||
[]string{"EOF"},
|
|
||||||
}, {
|
|
||||||
WithStack(io.EOF),
|
|
||||||
"%v",
|
|
||||||
[]string{"EOF"},
|
|
||||||
}, {
|
|
||||||
WithStack(io.EOF),
|
|
||||||
"%+v",
|
|
||||||
[]string{"EOF",
|
|
||||||
"github.com/pkg/errors.TestFormatWithStack\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:175"},
|
|
||||||
}, {
|
|
||||||
WithStack(New("error")),
|
|
||||||
"%s",
|
|
||||||
[]string{"error"},
|
|
||||||
}, {
|
|
||||||
WithStack(New("error")),
|
|
||||||
"%v",
|
|
||||||
[]string{"error"},
|
|
||||||
}, {
|
|
||||||
WithStack(New("error")),
|
|
||||||
"%+v",
|
|
||||||
[]string{"error",
|
|
||||||
"github.com/pkg/errors.TestFormatWithStack\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:189",
|
|
||||||
"github.com/pkg/errors.TestFormatWithStack\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:189"},
|
|
||||||
}, {
|
|
||||||
WithStack(WithStack(io.EOF)),
|
|
||||||
"%+v",
|
|
||||||
[]string{"EOF",
|
|
||||||
"github.com/pkg/errors.TestFormatWithStack\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:197",
|
|
||||||
"github.com/pkg/errors.TestFormatWithStack\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:197"},
|
|
||||||
}, {
|
|
||||||
WithStack(WithStack(Wrapf(io.EOF, "message"))),
|
|
||||||
"%+v",
|
|
||||||
[]string{"EOF",
|
|
||||||
"message",
|
|
||||||
"github.com/pkg/errors.TestFormatWithStack\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:205",
|
|
||||||
"github.com/pkg/errors.TestFormatWithStack\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:205",
|
|
||||||
"github.com/pkg/errors.TestFormatWithStack\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:205"},
|
|
||||||
}, {
|
|
||||||
WithStack(Errorf("error%d", 1)),
|
|
||||||
"%+v",
|
|
||||||
[]string{"error1",
|
|
||||||
"github.com/pkg/errors.TestFormatWithStack\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:216",
|
|
||||||
"github.com/pkg/errors.TestFormatWithStack\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:216"},
|
|
||||||
}}
|
|
||||||
|
|
||||||
for i, tt := range tests {
|
|
||||||
testFormatCompleteCompare(t, i, tt.error, tt.format, tt.want, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFormatWithMessage(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
error
|
|
||||||
format string
|
|
||||||
want []string
|
|
||||||
}{{
|
|
||||||
WithMessage(New("error"), "error2"),
|
|
||||||
"%s",
|
|
||||||
[]string{"error2: error"},
|
|
||||||
}, {
|
|
||||||
WithMessage(New("error"), "error2"),
|
|
||||||
"%v",
|
|
||||||
[]string{"error2: error"},
|
|
||||||
}, {
|
|
||||||
WithMessage(New("error"), "error2"),
|
|
||||||
"%+v",
|
|
||||||
[]string{
|
|
||||||
"error",
|
|
||||||
"github.com/pkg/errors.TestFormatWithMessage\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:244",
|
|
||||||
"error2"},
|
|
||||||
}, {
|
|
||||||
WithMessage(io.EOF, "addition1"),
|
|
||||||
"%s",
|
|
||||||
[]string{"addition1: EOF"},
|
|
||||||
}, {
|
|
||||||
WithMessage(io.EOF, "addition1"),
|
|
||||||
"%v",
|
|
||||||
[]string{"addition1: EOF"},
|
|
||||||
}, {
|
|
||||||
WithMessage(io.EOF, "addition1"),
|
|
||||||
"%+v",
|
|
||||||
[]string{"EOF", "addition1"},
|
|
||||||
}, {
|
|
||||||
WithMessage(WithMessage(io.EOF, "addition1"), "addition2"),
|
|
||||||
"%v",
|
|
||||||
[]string{"addition2: addition1: EOF"},
|
|
||||||
}, {
|
|
||||||
WithMessage(WithMessage(io.EOF, "addition1"), "addition2"),
|
|
||||||
"%+v",
|
|
||||||
[]string{"EOF", "addition1", "addition2"},
|
|
||||||
}, {
|
|
||||||
Wrap(WithMessage(io.EOF, "error1"), "error2"),
|
|
||||||
"%+v",
|
|
||||||
[]string{"EOF", "error1", "error2",
|
|
||||||
"github.com/pkg/errors.TestFormatWithMessage\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:272"},
|
|
||||||
}, {
|
|
||||||
WithMessage(Errorf("error%d", 1), "error2"),
|
|
||||||
"%+v",
|
|
||||||
[]string{"error1",
|
|
||||||
"github.com/pkg/errors.TestFormatWithMessage\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:278",
|
|
||||||
"error2"},
|
|
||||||
}, {
|
|
||||||
WithMessage(WithStack(io.EOF), "error"),
|
|
||||||
"%+v",
|
|
||||||
[]string{
|
|
||||||
"EOF",
|
|
||||||
"github.com/pkg/errors.TestFormatWithMessage\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:285",
|
|
||||||
"error"},
|
|
||||||
}, {
|
|
||||||
WithMessage(Wrap(WithStack(io.EOF), "inside-error"), "outside-error"),
|
|
||||||
"%+v",
|
|
||||||
[]string{
|
|
||||||
"EOF",
|
|
||||||
"github.com/pkg/errors.TestFormatWithMessage\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:293",
|
|
||||||
"inside-error",
|
|
||||||
"github.com/pkg/errors.TestFormatWithMessage\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:293",
|
|
||||||
"outside-error"},
|
|
||||||
}}
|
|
||||||
|
|
||||||
for i, tt := range tests {
|
|
||||||
testFormatCompleteCompare(t, i, tt.error, tt.format, tt.want, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFormatGeneric(t *testing.T) {
|
|
||||||
starts := []struct {
|
|
||||||
err error
|
|
||||||
want []string
|
|
||||||
}{
|
|
||||||
{New("new-error"), []string{
|
|
||||||
"new-error",
|
|
||||||
"github.com/pkg/errors.TestFormatGeneric\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:315"},
|
|
||||||
}, {Errorf("errorf-error"), []string{
|
|
||||||
"errorf-error",
|
|
||||||
"github.com/pkg/errors.TestFormatGeneric\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/format_test.go:319"},
|
|
||||||
}, {errors.New("errors-new-error"), []string{
|
|
||||||
"errors-new-error"},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
wrappers := []wrapper{
|
|
||||||
{
|
|
||||||
func(err error) error { return WithMessage(err, "with-message") },
|
|
||||||
[]string{"with-message"},
|
|
||||||
}, {
|
|
||||||
func(err error) error { return WithStack(err) },
|
|
||||||
[]string{
|
|
||||||
"github.com/pkg/errors.(func·002|TestFormatGeneric.func2)\n\t" +
|
|
||||||
".+/github.com/pkg/errors/format_test.go:333",
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
func(err error) error { return Wrap(err, "wrap-error") },
|
|
||||||
[]string{
|
|
||||||
"wrap-error",
|
|
||||||
"github.com/pkg/errors.(func·003|TestFormatGeneric.func3)\n\t" +
|
|
||||||
".+/github.com/pkg/errors/format_test.go:339",
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
func(err error) error { return Wrapf(err, "wrapf-error%d", 1) },
|
|
||||||
[]string{
|
|
||||||
"wrapf-error1",
|
|
||||||
"github.com/pkg/errors.(func·004|TestFormatGeneric.func4)\n\t" +
|
|
||||||
".+/github.com/pkg/errors/format_test.go:346",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for s := range starts {
|
|
||||||
err := starts[s].err
|
|
||||||
want := starts[s].want
|
|
||||||
testFormatCompleteCompare(t, s, err, "%+v", want, false)
|
|
||||||
testGenericRecursive(t, err, want, wrappers, 3)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func testFormatRegexp(t *testing.T, n int, arg interface{}, format, want string) {
|
|
||||||
got := fmt.Sprintf(format, arg)
|
|
||||||
gotLines := strings.SplitN(got, "\n", -1)
|
|
||||||
wantLines := strings.SplitN(want, "\n", -1)
|
|
||||||
|
|
||||||
if len(wantLines) > len(gotLines) {
|
|
||||||
t.Errorf("test %d: wantLines(%d) > gotLines(%d):\n got: %q\nwant: %q", n+1, len(wantLines), len(gotLines), got, want)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, w := range wantLines {
|
|
||||||
match, err := regexp.MatchString(w, gotLines[i])
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if !match {
|
|
||||||
t.Errorf("test %d: line %d: fmt.Sprintf(%q, err):\n got: %q\nwant: %q", n+1, i+1, format, got, want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var stackLineR = regexp.MustCompile(`\.`)
|
|
||||||
|
|
||||||
// parseBlocks parses input into a slice, where:
|
|
||||||
// - incase entry contains a newline, its a stacktrace
|
|
||||||
// - incase entry contains no newline, its a solo line.
|
|
||||||
//
|
|
||||||
// Detecting stack boundaries only works incase the WithStack-calls are
|
|
||||||
// to be found on the same line, thats why it is optionally here.
|
|
||||||
//
|
|
||||||
// Example use:
|
|
||||||
//
|
|
||||||
// for _, e := range blocks {
|
|
||||||
// if strings.ContainsAny(e, "\n") {
|
|
||||||
// // Match as stack
|
|
||||||
// } else {
|
|
||||||
// // Match as line
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
func parseBlocks(input string, detectStackboundaries bool) ([]string, error) {
|
|
||||||
var blocks []string
|
|
||||||
|
|
||||||
stack := ""
|
|
||||||
wasStack := false
|
|
||||||
lines := map[string]bool{} // already found lines
|
|
||||||
|
|
||||||
for _, l := range strings.Split(input, "\n") {
|
|
||||||
isStackLine := stackLineR.MatchString(l)
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case !isStackLine && wasStack:
|
|
||||||
blocks = append(blocks, stack, l)
|
|
||||||
stack = ""
|
|
||||||
lines = map[string]bool{}
|
|
||||||
case isStackLine:
|
|
||||||
if wasStack {
|
|
||||||
// Detecting two stacks after another, possible cause lines match in
|
|
||||||
// our tests due to WithStack(WithStack(io.EOF)) on same line.
|
|
||||||
if detectStackboundaries {
|
|
||||||
if lines[l] {
|
|
||||||
if len(stack) == 0 {
|
|
||||||
return nil, errors.New("len of block must not be zero here")
|
|
||||||
}
|
|
||||||
|
|
||||||
blocks = append(blocks, stack)
|
|
||||||
stack = l
|
|
||||||
lines = map[string]bool{l: true}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stack = stack + "\n" + l
|
|
||||||
} else {
|
|
||||||
stack = l
|
|
||||||
}
|
|
||||||
lines[l] = true
|
|
||||||
case !isStackLine && !wasStack:
|
|
||||||
blocks = append(blocks, l)
|
|
||||||
default:
|
|
||||||
return nil, errors.New("must not happen")
|
|
||||||
}
|
|
||||||
|
|
||||||
wasStack = isStackLine
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use up stack
|
|
||||||
if stack != "" {
|
|
||||||
blocks = append(blocks, stack)
|
|
||||||
}
|
|
||||||
return blocks, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func testFormatCompleteCompare(t *testing.T, n int, arg interface{}, format string, want []string, detectStackBoundaries bool) {
|
|
||||||
gotStr := fmt.Sprintf(format, arg)
|
|
||||||
|
|
||||||
got, err := parseBlocks(gotStr, detectStackBoundaries)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(got) != len(want) {
|
|
||||||
t.Fatalf("test %d: fmt.Sprintf(%s, err) -> wrong number of blocks: got(%d) want(%d)\n got: %s\nwant: %s\ngotStr: %q",
|
|
||||||
n+1, format, len(got), len(want), prettyBlocks(got), prettyBlocks(want), gotStr)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := range got {
|
|
||||||
if strings.ContainsAny(want[i], "\n") {
|
|
||||||
// Match as stack
|
|
||||||
match, err := regexp.MatchString(want[i], got[i])
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if !match {
|
|
||||||
t.Fatalf("test %d: block %d: fmt.Sprintf(%q, err):\ngot:\n%q\nwant:\n%q\nall-got:\n%s\nall-want:\n%s\n",
|
|
||||||
n+1, i+1, format, got[i], want[i], prettyBlocks(got), prettyBlocks(want))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Match as message
|
|
||||||
if got[i] != want[i] {
|
|
||||||
t.Fatalf("test %d: fmt.Sprintf(%s, err) at block %d got != want:\n got: %q\nwant: %q", n+1, format, i+1, got[i], want[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type wrapper struct {
|
|
||||||
wrap func(err error) error
|
|
||||||
want []string
|
|
||||||
}
|
|
||||||
|
|
||||||
func prettyBlocks(blocks []string, prefix ...string) string {
|
|
||||||
var out []string
|
|
||||||
|
|
||||||
for _, b := range blocks {
|
|
||||||
out = append(out, fmt.Sprintf("%v", b))
|
|
||||||
}
|
|
||||||
|
|
||||||
return " " + strings.Join(out, "\n ")
|
|
||||||
}
|
|
||||||
|
|
||||||
func testGenericRecursive(t *testing.T, beforeErr error, beforeWant []string, list []wrapper, maxDepth int) {
|
|
||||||
if len(beforeWant) == 0 {
|
|
||||||
panic("beforeWant must not be empty")
|
|
||||||
}
|
|
||||||
for _, w := range list {
|
|
||||||
if len(w.want) == 0 {
|
|
||||||
panic("want must not be empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
err := w.wrap(beforeErr)
|
|
||||||
|
|
||||||
// Copy required cause append(beforeWant, ..) modified beforeWant subtly.
|
|
||||||
beforeCopy := make([]string, len(beforeWant))
|
|
||||||
copy(beforeCopy, beforeWant)
|
|
||||||
|
|
||||||
beforeWant := beforeCopy
|
|
||||||
last := len(beforeWant) - 1
|
|
||||||
var want []string
|
|
||||||
|
|
||||||
// Merge two stacks behind each other.
|
|
||||||
if strings.ContainsAny(beforeWant[last], "\n") && strings.ContainsAny(w.want[0], "\n") {
|
|
||||||
want = append(beforeWant[:last], append([]string{beforeWant[last] + "((?s).*)" + w.want[0]}, w.want[1:]...)...)
|
|
||||||
} else {
|
|
||||||
want = append(beforeWant, w.want...)
|
|
||||||
}
|
|
||||||
|
|
||||||
testFormatCompleteCompare(t, maxDepth, err, "%+v", want, false)
|
|
||||||
if maxDepth > 0 {
|
|
||||||
testGenericRecursive(t, err, want, list, maxDepth-1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
292
vendor/github.com/pkg/errors/stack_test.go
generated
vendored
292
vendor/github.com/pkg/errors/stack_test.go
generated
vendored
@ -1,292 +0,0 @@
|
|||||||
package errors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"runtime"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
var initpc, _, _, _ = runtime.Caller(0)
|
|
||||||
|
|
||||||
func TestFrameLine(t *testing.T) {
|
|
||||||
var tests = []struct {
|
|
||||||
Frame
|
|
||||||
want int
|
|
||||||
}{{
|
|
||||||
Frame(initpc),
|
|
||||||
9,
|
|
||||||
}, {
|
|
||||||
func() Frame {
|
|
||||||
var pc, _, _, _ = runtime.Caller(0)
|
|
||||||
return Frame(pc)
|
|
||||||
}(),
|
|
||||||
20,
|
|
||||||
}, {
|
|
||||||
func() Frame {
|
|
||||||
var pc, _, _, _ = runtime.Caller(1)
|
|
||||||
return Frame(pc)
|
|
||||||
}(),
|
|
||||||
28,
|
|
||||||
}, {
|
|
||||||
Frame(0), // invalid PC
|
|
||||||
0,
|
|
||||||
}}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
got := tt.Frame.line()
|
|
||||||
want := tt.want
|
|
||||||
if want != got {
|
|
||||||
t.Errorf("Frame(%v): want: %v, got: %v", uintptr(tt.Frame), want, got)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type X struct{}
|
|
||||||
|
|
||||||
func (x X) val() Frame {
|
|
||||||
var pc, _, _, _ = runtime.Caller(0)
|
|
||||||
return Frame(pc)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *X) ptr() Frame {
|
|
||||||
var pc, _, _, _ = runtime.Caller(0)
|
|
||||||
return Frame(pc)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFrameFormat(t *testing.T) {
|
|
||||||
var tests = []struct {
|
|
||||||
Frame
|
|
||||||
format string
|
|
||||||
want string
|
|
||||||
}{{
|
|
||||||
Frame(initpc),
|
|
||||||
"%s",
|
|
||||||
"stack_test.go",
|
|
||||||
}, {
|
|
||||||
Frame(initpc),
|
|
||||||
"%+s",
|
|
||||||
"github.com/pkg/errors.init\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/stack_test.go",
|
|
||||||
}, {
|
|
||||||
Frame(0),
|
|
||||||
"%s",
|
|
||||||
"unknown",
|
|
||||||
}, {
|
|
||||||
Frame(0),
|
|
||||||
"%+s",
|
|
||||||
"unknown",
|
|
||||||
}, {
|
|
||||||
Frame(initpc),
|
|
||||||
"%d",
|
|
||||||
"9",
|
|
||||||
}, {
|
|
||||||
Frame(0),
|
|
||||||
"%d",
|
|
||||||
"0",
|
|
||||||
}, {
|
|
||||||
Frame(initpc),
|
|
||||||
"%n",
|
|
||||||
"init",
|
|
||||||
}, {
|
|
||||||
func() Frame {
|
|
||||||
var x X
|
|
||||||
return x.ptr()
|
|
||||||
}(),
|
|
||||||
"%n",
|
|
||||||
`\(\*X\).ptr`,
|
|
||||||
}, {
|
|
||||||
func() Frame {
|
|
||||||
var x X
|
|
||||||
return x.val()
|
|
||||||
}(),
|
|
||||||
"%n",
|
|
||||||
"X.val",
|
|
||||||
}, {
|
|
||||||
Frame(0),
|
|
||||||
"%n",
|
|
||||||
"",
|
|
||||||
}, {
|
|
||||||
Frame(initpc),
|
|
||||||
"%v",
|
|
||||||
"stack_test.go:9",
|
|
||||||
}, {
|
|
||||||
Frame(initpc),
|
|
||||||
"%+v",
|
|
||||||
"github.com/pkg/errors.init\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/stack_test.go:9",
|
|
||||||
}, {
|
|
||||||
Frame(0),
|
|
||||||
"%v",
|
|
||||||
"unknown:0",
|
|
||||||
}}
|
|
||||||
|
|
||||||
for i, tt := range tests {
|
|
||||||
testFormatRegexp(t, i, tt.Frame, tt.format, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFuncname(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
name, want string
|
|
||||||
}{
|
|
||||||
{"", ""},
|
|
||||||
{"runtime.main", "main"},
|
|
||||||
{"github.com/pkg/errors.funcname", "funcname"},
|
|
||||||
{"funcname", "funcname"},
|
|
||||||
{"io.copyBuffer", "copyBuffer"},
|
|
||||||
{"main.(*R).Write", "(*R).Write"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tt := range tests {
|
|
||||||
got := funcname(tt.name)
|
|
||||||
want := tt.want
|
|
||||||
if got != want {
|
|
||||||
t.Errorf("funcname(%q): want: %q, got %q", tt.name, want, got)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTrimGOPATH(t *testing.T) {
|
|
||||||
var tests = []struct {
|
|
||||||
Frame
|
|
||||||
want string
|
|
||||||
}{{
|
|
||||||
Frame(initpc),
|
|
||||||
"github.com/pkg/errors/stack_test.go",
|
|
||||||
}}
|
|
||||||
|
|
||||||
for i, tt := range tests {
|
|
||||||
pc := tt.Frame.pc()
|
|
||||||
fn := runtime.FuncForPC(pc)
|
|
||||||
file, _ := fn.FileLine(pc)
|
|
||||||
got := trimGOPATH(fn.Name(), file)
|
|
||||||
testFormatRegexp(t, i, got, "%s", tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestStackTrace(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
err error
|
|
||||||
want []string
|
|
||||||
}{{
|
|
||||||
New("ooh"), []string{
|
|
||||||
"github.com/pkg/errors.TestStackTrace\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/stack_test.go:172",
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
Wrap(New("ooh"), "ahh"), []string{
|
|
||||||
"github.com/pkg/errors.TestStackTrace\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/stack_test.go:177", // this is the stack of Wrap, not New
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
Cause(Wrap(New("ooh"), "ahh")), []string{
|
|
||||||
"github.com/pkg/errors.TestStackTrace\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/stack_test.go:182", // this is the stack of New
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
func() error { return New("ooh") }(), []string{
|
|
||||||
`github.com/pkg/errors.(func·009|TestStackTrace.func1)` +
|
|
||||||
"\n\t.+/github.com/pkg/errors/stack_test.go:187", // this is the stack of New
|
|
||||||
"github.com/pkg/errors.TestStackTrace\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/stack_test.go:187", // this is the stack of New's caller
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
Cause(func() error {
|
|
||||||
return func() error {
|
|
||||||
return Errorf("hello %s", fmt.Sprintf("world"))
|
|
||||||
}()
|
|
||||||
}()), []string{
|
|
||||||
`github.com/pkg/errors.(func·010|TestStackTrace.func2.1)` +
|
|
||||||
"\n\t.+/github.com/pkg/errors/stack_test.go:196", // this is the stack of Errorf
|
|
||||||
`github.com/pkg/errors.(func·011|TestStackTrace.func2)` +
|
|
||||||
"\n\t.+/github.com/pkg/errors/stack_test.go:197", // this is the stack of Errorf's caller
|
|
||||||
"github.com/pkg/errors.TestStackTrace\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/stack_test.go:198", // this is the stack of Errorf's caller's caller
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
for i, tt := range tests {
|
|
||||||
x, ok := tt.err.(interface {
|
|
||||||
StackTrace() StackTrace
|
|
||||||
})
|
|
||||||
if !ok {
|
|
||||||
t.Errorf("expected %#v to implement StackTrace() StackTrace", tt.err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
st := x.StackTrace()
|
|
||||||
for j, want := range tt.want {
|
|
||||||
testFormatRegexp(t, i, st[j], "%+v", want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func stackTrace() StackTrace {
|
|
||||||
const depth = 8
|
|
||||||
var pcs [depth]uintptr
|
|
||||||
n := runtime.Callers(1, pcs[:])
|
|
||||||
var st stack = pcs[0:n]
|
|
||||||
return st.StackTrace()
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestStackTraceFormat(t *testing.T) {
|
|
||||||
tests := []struct {
|
|
||||||
StackTrace
|
|
||||||
format string
|
|
||||||
want string
|
|
||||||
}{{
|
|
||||||
nil,
|
|
||||||
"%s",
|
|
||||||
`\[\]`,
|
|
||||||
}, {
|
|
||||||
nil,
|
|
||||||
"%v",
|
|
||||||
`\[\]`,
|
|
||||||
}, {
|
|
||||||
nil,
|
|
||||||
"%+v",
|
|
||||||
"",
|
|
||||||
}, {
|
|
||||||
nil,
|
|
||||||
"%#v",
|
|
||||||
`\[\]errors.Frame\(nil\)`,
|
|
||||||
}, {
|
|
||||||
make(StackTrace, 0),
|
|
||||||
"%s",
|
|
||||||
`\[\]`,
|
|
||||||
}, {
|
|
||||||
make(StackTrace, 0),
|
|
||||||
"%v",
|
|
||||||
`\[\]`,
|
|
||||||
}, {
|
|
||||||
make(StackTrace, 0),
|
|
||||||
"%+v",
|
|
||||||
"",
|
|
||||||
}, {
|
|
||||||
make(StackTrace, 0),
|
|
||||||
"%#v",
|
|
||||||
`\[\]errors.Frame{}`,
|
|
||||||
}, {
|
|
||||||
stackTrace()[:2],
|
|
||||||
"%s",
|
|
||||||
`\[stack_test.go stack_test.go\]`,
|
|
||||||
}, {
|
|
||||||
stackTrace()[:2],
|
|
||||||
"%v",
|
|
||||||
`\[stack_test.go:225 stack_test.go:272\]`,
|
|
||||||
}, {
|
|
||||||
stackTrace()[:2],
|
|
||||||
"%+v",
|
|
||||||
"\n" +
|
|
||||||
"github.com/pkg/errors.stackTrace\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/stack_test.go:225\n" +
|
|
||||||
"github.com/pkg/errors.TestStackTraceFormat\n" +
|
|
||||||
"\t.+/github.com/pkg/errors/stack_test.go:276",
|
|
||||||
}, {
|
|
||||||
stackTrace()[:2],
|
|
||||||
"%#v",
|
|
||||||
`\[\]errors.Frame{stack_test.go:225, stack_test.go:284}`,
|
|
||||||
}}
|
|
||||||
|
|
||||||
for i, tt := range tests {
|
|
||||||
testFormatRegexp(t, i, tt.StackTrace, tt.format, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
28
vendor/github.com/stretchr/testify/require/doc.go
generated
vendored
28
vendor/github.com/stretchr/testify/require/doc.go
generated
vendored
@ -1,28 +0,0 @@
|
|||||||
// Package require implements the same assertions as the `assert` package but
|
|
||||||
// stops test execution when a test fails.
|
|
||||||
//
|
|
||||||
// Example Usage
|
|
||||||
//
|
|
||||||
// The following is a complete example using require in a standard test function:
|
|
||||||
// import (
|
|
||||||
// "testing"
|
|
||||||
// "github.com/stretchr/testify/require"
|
|
||||||
// )
|
|
||||||
//
|
|
||||||
// func TestSomething(t *testing.T) {
|
|
||||||
//
|
|
||||||
// var a string = "Hello"
|
|
||||||
// var b string = "Hello"
|
|
||||||
//
|
|
||||||
// require.Equal(t, a, b, "The two words should be the same.")
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Assertions
|
|
||||||
//
|
|
||||||
// The `require` package have same global functions as in the `assert` package,
|
|
||||||
// but instead of returning a boolean result they call `t.FailNow()`.
|
|
||||||
//
|
|
||||||
// Every assertion function also takes an optional string message as the final argument,
|
|
||||||
// allowing custom error messages to be appended to the message the assertion method outputs.
|
|
||||||
package require
|
|
16
vendor/github.com/stretchr/testify/require/forward_requirements.go
generated
vendored
16
vendor/github.com/stretchr/testify/require/forward_requirements.go
generated
vendored
@ -1,16 +0,0 @@
|
|||||||
package require
|
|
||||||
|
|
||||||
// Assertions provides assertion methods around the
|
|
||||||
// TestingT interface.
|
|
||||||
type Assertions struct {
|
|
||||||
t TestingT
|
|
||||||
}
|
|
||||||
|
|
||||||
// New makes a new Assertions object for the specified TestingT.
|
|
||||||
func New(t TestingT) *Assertions {
|
|
||||||
return &Assertions{
|
|
||||||
t: t,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//go:generate go run ../_codegen/main.go -output-package=require -template=require_forward.go.tmpl
|
|
423
vendor/github.com/stretchr/testify/require/require.go
generated
vendored
423
vendor/github.com/stretchr/testify/require/require.go
generated
vendored
@ -1,423 +0,0 @@
|
|||||||
/*
|
|
||||||
* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen
|
|
||||||
* THIS FILE MUST NOT BE EDITED BY HAND
|
|
||||||
*/
|
|
||||||
|
|
||||||
package require
|
|
||||||
|
|
||||||
import (
|
|
||||||
assert "github.com/stretchr/testify/assert"
|
|
||||||
http "net/http"
|
|
||||||
url "net/url"
|
|
||||||
time "time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Condition uses a Comparison to assert a complex condition.
|
|
||||||
func Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Condition(t, comp, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Contains asserts that the specified string, list(array, slice...) or map contains the
|
|
||||||
// specified substring or element.
|
|
||||||
//
|
|
||||||
// assert.Contains(t, "Hello World", "World", "But 'Hello World' does contain 'World'")
|
|
||||||
// assert.Contains(t, ["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'")
|
|
||||||
// assert.Contains(t, {"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Contains(t, s, contains, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
|
||||||
// a slice or a channel with len == 0.
|
|
||||||
//
|
|
||||||
// assert.Empty(t, obj)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Empty(t, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equal asserts that two objects are equal.
|
|
||||||
//
|
|
||||||
// assert.Equal(t, 123, 123, "123 and 123 should be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Equal(t, expected, actual, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// EqualError asserts that a function returned an error (i.e. not `nil`)
|
|
||||||
// and that it is equal to the provided error.
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// assert.EqualError(t, err, expectedErrorString, "An error was expected")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.EqualError(t, theError, errString, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// EqualValues asserts that two objects are equal or convertable to the same types
|
|
||||||
// and equal.
|
|
||||||
//
|
|
||||||
// assert.EqualValues(t, uint32(123), int32(123), "123 and 123 should be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.EqualValues(t, expected, actual, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error asserts that a function returned an error (i.e. not `nil`).
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// if assert.Error(t, err, "An error was expected") {
|
|
||||||
// assert.Equal(t, err, expectedError)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Error(t TestingT, err error, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Error(t, err, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exactly asserts that two objects are equal is value and type.
|
|
||||||
//
|
|
||||||
// assert.Exactly(t, int32(123), int64(123), "123 and 123 should NOT be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Exactly(t, expected, actual, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fail reports a failure through
|
|
||||||
func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Fail(t, failureMessage, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FailNow fails test
|
|
||||||
func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.FailNow(t, failureMessage, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// False asserts that the specified value is false.
|
|
||||||
//
|
|
||||||
// assert.False(t, myBool, "myBool should be false")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func False(t TestingT, value bool, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.False(t, value, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyContains asserts that a specified handler returns a
|
|
||||||
// body that contains a string.
|
|
||||||
//
|
|
||||||
// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {
|
|
||||||
if !assert.HTTPBodyContains(t, handler, method, url, values, str) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyNotContains asserts that a specified handler returns a
|
|
||||||
// body that does not contain a string.
|
|
||||||
//
|
|
||||||
// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {
|
|
||||||
if !assert.HTTPBodyNotContains(t, handler, method, url, values, str) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPError asserts that a specified handler returns an error status code.
|
|
||||||
//
|
|
||||||
// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
if !assert.HTTPError(t, handler, method, url, values) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPRedirect asserts that a specified handler returns a redirect status code.
|
|
||||||
//
|
|
||||||
// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
if !assert.HTTPRedirect(t, handler, method, url, values) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPSuccess asserts that a specified handler returns a success status code.
|
|
||||||
//
|
|
||||||
// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
if !assert.HTTPSuccess(t, handler, method, url, values) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements asserts that an object is implemented by the specified interface.
|
|
||||||
//
|
|
||||||
// assert.Implements(t, (*MyInterface)(nil), new(MyObject), "MyObject")
|
|
||||||
func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Implements(t, interfaceObject, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// InDelta asserts that the two numerals are within delta of each other.
|
|
||||||
//
|
|
||||||
// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.InDelta(t, expected, actual, delta, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
|
||||||
func InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
|
|
||||||
func InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.InEpsilonSlice(t, expected, actual, epsilon, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsType asserts that the specified objects are of the same type.
|
|
||||||
func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.IsType(t, expectedType, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONEq asserts that two JSON strings are equivalent.
|
|
||||||
//
|
|
||||||
// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.JSONEq(t, expected, actual, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Len asserts that the specified object has specific length.
|
|
||||||
// Len also fails if the object has a type that len() not accept.
|
|
||||||
//
|
|
||||||
// assert.Len(t, mySlice, 3, "The size of slice is not 3")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Len(t, object, length, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nil asserts that the specified object is nil.
|
|
||||||
//
|
|
||||||
// assert.Nil(t, err, "err should be nothing")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Nil(t, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NoError asserts that a function returned no error (i.e. `nil`).
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// if assert.NoError(t, err) {
|
|
||||||
// assert.Equal(t, actualObj, expectedObj)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NoError(t TestingT, err error, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NoError(t, err, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
|
|
||||||
// specified substring or element.
|
|
||||||
//
|
|
||||||
// assert.NotContains(t, "Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'")
|
|
||||||
// assert.NotContains(t, ["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'")
|
|
||||||
// assert.NotContains(t, {"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotContains(t, s, contains, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
|
||||||
// a slice or a channel with len == 0.
|
|
||||||
//
|
|
||||||
// if assert.NotEmpty(t, obj) {
|
|
||||||
// assert.Equal(t, "two", obj[1])
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotEmpty(t, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotEqual asserts that the specified values are NOT equal.
|
|
||||||
//
|
|
||||||
// assert.NotEqual(t, obj1, obj2, "two objects shouldn't be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotEqual(t, expected, actual, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotNil asserts that the specified object is not nil.
|
|
||||||
//
|
|
||||||
// assert.NotNil(t, err, "err should be something")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotNil(t, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
|
|
||||||
//
|
|
||||||
// assert.NotPanics(t, func(){
|
|
||||||
// RemainCalm()
|
|
||||||
// }, "Calling RemainCalm() should NOT panic")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotPanics(t, f, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotRegexp asserts that a specified regexp does not match a string.
|
|
||||||
//
|
|
||||||
// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
|
|
||||||
// assert.NotRegexp(t, "^start", "it's not starting")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotRegexp(t, rx, str, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotZero asserts that i is not the zero value for its type and returns the truth.
|
|
||||||
func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotZero(t, i, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
|
||||||
//
|
|
||||||
// assert.Panics(t, func(){
|
|
||||||
// GoCrazy()
|
|
||||||
// }, "Calling GoCrazy() should panic")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Panics(t, f, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Regexp asserts that a specified regexp matches a string.
|
|
||||||
//
|
|
||||||
// assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
|
|
||||||
// assert.Regexp(t, "start...$", "it's not starting")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Regexp(t, rx, str, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// True asserts that the specified value is true.
|
|
||||||
//
|
|
||||||
// assert.True(t, myBool, "myBool should be true")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func True(t TestingT, value bool, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.True(t, value, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithinDuration asserts that the two times are within duration delta of each other.
|
|
||||||
//
|
|
||||||
// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zero asserts that i is the zero value for its type and returns the truth.
|
|
||||||
func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Zero(t, i, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
6
vendor/github.com/stretchr/testify/require/require.go.tmpl
generated
vendored
6
vendor/github.com/stretchr/testify/require/require.go.tmpl
generated
vendored
@ -1,6 +0,0 @@
|
|||||||
{{.Comment}}
|
|
||||||
func {{.DocInfo.Name}}(t TestingT, {{.Params}}) {
|
|
||||||
if !assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
347
vendor/github.com/stretchr/testify/require/require_forward.go
generated
vendored
347
vendor/github.com/stretchr/testify/require/require_forward.go
generated
vendored
@ -1,347 +0,0 @@
|
|||||||
/*
|
|
||||||
* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen
|
|
||||||
* THIS FILE MUST NOT BE EDITED BY HAND
|
|
||||||
*/
|
|
||||||
|
|
||||||
package require
|
|
||||||
|
|
||||||
import (
|
|
||||||
assert "github.com/stretchr/testify/assert"
|
|
||||||
http "net/http"
|
|
||||||
url "net/url"
|
|
||||||
time "time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Condition uses a Comparison to assert a complex condition.
|
|
||||||
func (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) {
|
|
||||||
Condition(a.t, comp, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Contains asserts that the specified string, list(array, slice...) or map contains the
|
|
||||||
// specified substring or element.
|
|
||||||
//
|
|
||||||
// a.Contains("Hello World", "World", "But 'Hello World' does contain 'World'")
|
|
||||||
// a.Contains(["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'")
|
|
||||||
// a.Contains({"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Contains(a.t, s, contains, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
|
||||||
// a slice or a channel with len == 0.
|
|
||||||
//
|
|
||||||
// a.Empty(obj)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Empty(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equal asserts that two objects are equal.
|
|
||||||
//
|
|
||||||
// a.Equal(123, 123, "123 and 123 should be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Equal(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// EqualError asserts that a function returned an error (i.e. not `nil`)
|
|
||||||
// and that it is equal to the provided error.
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// a.EqualError(err, expectedErrorString, "An error was expected")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) {
|
|
||||||
EqualError(a.t, theError, errString, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// EqualValues asserts that two objects are equal or convertable to the same types
|
|
||||||
// and equal.
|
|
||||||
//
|
|
||||||
// a.EqualValues(uint32(123), int32(123), "123 and 123 should be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
EqualValues(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error asserts that a function returned an error (i.e. not `nil`).
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// if a.Error(err, "An error was expected") {
|
|
||||||
// assert.Equal(t, err, expectedError)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Error(err error, msgAndArgs ...interface{}) {
|
|
||||||
Error(a.t, err, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exactly asserts that two objects are equal is value and type.
|
|
||||||
//
|
|
||||||
// a.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Exactly(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fail reports a failure through
|
|
||||||
func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) {
|
|
||||||
Fail(a.t, failureMessage, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FailNow fails test
|
|
||||||
func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) {
|
|
||||||
FailNow(a.t, failureMessage, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// False asserts that the specified value is false.
|
|
||||||
//
|
|
||||||
// a.False(myBool, "myBool should be false")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) False(value bool, msgAndArgs ...interface{}) {
|
|
||||||
False(a.t, value, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyContains asserts that a specified handler returns a
|
|
||||||
// body that contains a string.
|
|
||||||
//
|
|
||||||
// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {
|
|
||||||
HTTPBodyContains(a.t, handler, method, url, values, str)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyNotContains asserts that a specified handler returns a
|
|
||||||
// body that does not contain a string.
|
|
||||||
//
|
|
||||||
// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {
|
|
||||||
HTTPBodyNotContains(a.t, handler, method, url, values, str)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPError asserts that a specified handler returns an error status code.
|
|
||||||
//
|
|
||||||
// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
HTTPError(a.t, handler, method, url, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPRedirect asserts that a specified handler returns a redirect status code.
|
|
||||||
//
|
|
||||||
// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
HTTPRedirect(a.t, handler, method, url, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPSuccess asserts that a specified handler returns a success status code.
|
|
||||||
//
|
|
||||||
// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
HTTPSuccess(a.t, handler, method, url, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements asserts that an object is implemented by the specified interface.
|
|
||||||
//
|
|
||||||
// a.Implements((*MyInterface)(nil), new(MyObject), "MyObject")
|
|
||||||
func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Implements(a.t, interfaceObject, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InDelta asserts that the two numerals are within delta of each other.
|
|
||||||
//
|
|
||||||
// a.InDelta(math.Pi, (22 / 7.0), 0.01)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
|
|
||||||
InDelta(a.t, expected, actual, delta, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
|
||||||
func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
|
|
||||||
InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {
|
|
||||||
InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
|
|
||||||
func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {
|
|
||||||
InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsType asserts that the specified objects are of the same type.
|
|
||||||
func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
IsType(a.t, expectedType, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONEq asserts that two JSON strings are equivalent.
|
|
||||||
//
|
|
||||||
// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) {
|
|
||||||
JSONEq(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Len asserts that the specified object has specific length.
|
|
||||||
// Len also fails if the object has a type that len() not accept.
|
|
||||||
//
|
|
||||||
// a.Len(mySlice, 3, "The size of slice is not 3")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) {
|
|
||||||
Len(a.t, object, length, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nil asserts that the specified object is nil.
|
|
||||||
//
|
|
||||||
// a.Nil(err, "err should be nothing")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Nil(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NoError asserts that a function returned no error (i.e. `nil`).
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// if a.NoError(err) {
|
|
||||||
// assert.Equal(t, actualObj, expectedObj)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) {
|
|
||||||
NoError(a.t, err, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
|
|
||||||
// specified substring or element.
|
|
||||||
//
|
|
||||||
// a.NotContains("Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'")
|
|
||||||
// a.NotContains(["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'")
|
|
||||||
// a.NotContains({"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotContains(a.t, s, contains, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
|
||||||
// a slice or a channel with len == 0.
|
|
||||||
//
|
|
||||||
// if a.NotEmpty(obj) {
|
|
||||||
// assert.Equal(t, "two", obj[1])
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotEmpty(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotEqual asserts that the specified values are NOT equal.
|
|
||||||
//
|
|
||||||
// a.NotEqual(obj1, obj2, "two objects shouldn't be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotEqual(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotNil asserts that the specified object is not nil.
|
|
||||||
//
|
|
||||||
// a.NotNil(err, "err should be something")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotNil(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
|
|
||||||
//
|
|
||||||
// a.NotPanics(func(){
|
|
||||||
// RemainCalm()
|
|
||||||
// }, "Calling RemainCalm() should NOT panic")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) {
|
|
||||||
NotPanics(a.t, f, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotRegexp asserts that a specified regexp does not match a string.
|
|
||||||
//
|
|
||||||
// a.NotRegexp(regexp.MustCompile("starts"), "it's starting")
|
|
||||||
// a.NotRegexp("^start", "it's not starting")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotRegexp(a.t, rx, str, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotZero asserts that i is not the zero value for its type and returns the truth.
|
|
||||||
func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotZero(a.t, i, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
|
||||||
//
|
|
||||||
// a.Panics(func(){
|
|
||||||
// GoCrazy()
|
|
||||||
// }, "Calling GoCrazy() should panic")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) {
|
|
||||||
Panics(a.t, f, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Regexp asserts that a specified regexp matches a string.
|
|
||||||
//
|
|
||||||
// a.Regexp(regexp.MustCompile("start"), "it's starting")
|
|
||||||
// a.Regexp("start...$", "it's not starting")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Regexp(a.t, rx, str, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// True asserts that the specified value is true.
|
|
||||||
//
|
|
||||||
// a.True(myBool, "myBool should be true")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) True(value bool, msgAndArgs ...interface{}) {
|
|
||||||
True(a.t, value, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithinDuration asserts that the two times are within duration delta of each other.
|
|
||||||
//
|
|
||||||
// a.WithinDuration(time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {
|
|
||||||
WithinDuration(a.t, expected, actual, delta, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zero asserts that i is the zero value for its type and returns the truth.
|
|
||||||
func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Zero(a.t, i, msgAndArgs...)
|
|
||||||
}
|
|
4
vendor/github.com/stretchr/testify/require/require_forward.go.tmpl
generated
vendored
4
vendor/github.com/stretchr/testify/require/require_forward.go.tmpl
generated
vendored
@ -1,4 +0,0 @@
|
|||||||
{{.CommentWithoutT "a"}}
|
|
||||||
func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) {
|
|
||||||
{{.DocInfo.Name}}(a.t, {{.ForwardedParams}})
|
|
||||||
}
|
|
9
vendor/github.com/stretchr/testify/require/requirements.go
generated
vendored
9
vendor/github.com/stretchr/testify/require/requirements.go
generated
vendored
@ -1,9 +0,0 @@
|
|||||||
package require
|
|
||||||
|
|
||||||
// TestingT is an interface wrapper around *testing.T
|
|
||||||
type TestingT interface {
|
|
||||||
Errorf(format string, args ...interface{})
|
|
||||||
FailNow()
|
|
||||||
}
|
|
||||||
|
|
||||||
//go:generate go run ../_codegen/main.go -output-package=require -template=require.go.tmpl
|
|
13
vendor/golang.org/x/sys/windows/asm_windows_386.s
generated
vendored
Normal file
13
vendor/golang.org/x/sys/windows/asm_windows_386.s
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
//
|
||||||
|
// System calls for 386, Windows are implemented in runtime/syscall_windows.goc
|
||||||
|
//
|
||||||
|
|
||||||
|
TEXT ·getprocaddress(SB), 7, $0-8
|
||||||
|
JMP syscall·getprocaddress(SB)
|
||||||
|
|
||||||
|
TEXT ·loadlibrary(SB), 7, $0-4
|
||||||
|
JMP syscall·loadlibrary(SB)
|
13
vendor/golang.org/x/sys/windows/asm_windows_amd64.s
generated
vendored
Normal file
13
vendor/golang.org/x/sys/windows/asm_windows_amd64.s
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
//
|
||||||
|
// System calls for amd64, Windows are implemented in runtime/syscall_windows.goc
|
||||||
|
//
|
||||||
|
|
||||||
|
TEXT ·getprocaddress(SB), 7, $0-32
|
||||||
|
JMP syscall·getprocaddress(SB)
|
||||||
|
|
||||||
|
TEXT ·loadlibrary(SB), 7, $0-8
|
||||||
|
JMP syscall·loadlibrary(SB)
|
378
vendor/golang.org/x/sys/windows/dll_windows.go
generated
vendored
Normal file
378
vendor/golang.org/x/sys/windows/dll_windows.go
generated
vendored
Normal file
@ -0,0 +1,378 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DLLError describes reasons for DLL load failures.
|
||||||
|
type DLLError struct {
|
||||||
|
Err error
|
||||||
|
ObjName string
|
||||||
|
Msg string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *DLLError) Error() string { return e.Msg }
|
||||||
|
|
||||||
|
// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file.
|
||||||
|
func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno)
|
||||||
|
func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno)
|
||||||
|
|
||||||
|
// A DLL implements access to a single DLL.
|
||||||
|
type DLL struct {
|
||||||
|
Name string
|
||||||
|
Handle Handle
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadDLL loads DLL file into memory.
|
||||||
|
//
|
||||||
|
// Warning: using LoadDLL without an absolute path name is subject to
|
||||||
|
// DLL preloading attacks. To safely load a system DLL, use LazyDLL
|
||||||
|
// with System set to true, or use LoadLibraryEx directly.
|
||||||
|
func LoadDLL(name string) (dll *DLL, err error) {
|
||||||
|
namep, err := UTF16PtrFromString(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
h, e := loadlibrary(namep)
|
||||||
|
if e != 0 {
|
||||||
|
return nil, &DLLError{
|
||||||
|
Err: e,
|
||||||
|
ObjName: name,
|
||||||
|
Msg: "Failed to load " + name + ": " + e.Error(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
d := &DLL{
|
||||||
|
Name: name,
|
||||||
|
Handle: Handle(h),
|
||||||
|
}
|
||||||
|
return d, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustLoadDLL is like LoadDLL but panics if load operation failes.
|
||||||
|
func MustLoadDLL(name string) *DLL {
|
||||||
|
d, e := LoadDLL(name)
|
||||||
|
if e != nil {
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindProc searches DLL d for procedure named name and returns *Proc
|
||||||
|
// if found. It returns an error if search fails.
|
||||||
|
func (d *DLL) FindProc(name string) (proc *Proc, err error) {
|
||||||
|
namep, err := BytePtrFromString(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
a, e := getprocaddress(uintptr(d.Handle), namep)
|
||||||
|
if e != 0 {
|
||||||
|
return nil, &DLLError{
|
||||||
|
Err: e,
|
||||||
|
ObjName: name,
|
||||||
|
Msg: "Failed to find " + name + " procedure in " + d.Name + ": " + e.Error(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p := &Proc{
|
||||||
|
Dll: d,
|
||||||
|
Name: name,
|
||||||
|
addr: a,
|
||||||
|
}
|
||||||
|
return p, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustFindProc is like FindProc but panics if search fails.
|
||||||
|
func (d *DLL) MustFindProc(name string) *Proc {
|
||||||
|
p, e := d.FindProc(name)
|
||||||
|
if e != nil {
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release unloads DLL d from memory.
|
||||||
|
func (d *DLL) Release() (err error) {
|
||||||
|
return FreeLibrary(d.Handle)
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Proc implements access to a procedure inside a DLL.
|
||||||
|
type Proc struct {
|
||||||
|
Dll *DLL
|
||||||
|
Name string
|
||||||
|
addr uintptr
|
||||||
|
}
|
||||||
|
|
||||||
|
// Addr returns the address of the procedure represented by p.
|
||||||
|
// The return value can be passed to Syscall to run the procedure.
|
||||||
|
func (p *Proc) Addr() uintptr {
|
||||||
|
return p.addr
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:uintptrescapes
|
||||||
|
|
||||||
|
// Call executes procedure p with arguments a. It will panic, if more then 15 arguments
|
||||||
|
// are supplied.
|
||||||
|
//
|
||||||
|
// The returned error is always non-nil, constructed from the result of GetLastError.
|
||||||
|
// Callers must inspect the primary return value to decide whether an error occurred
|
||||||
|
// (according to the semantics of the specific function being called) before consulting
|
||||||
|
// the error. The error will be guaranteed to contain windows.Errno.
|
||||||
|
func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {
|
||||||
|
switch len(a) {
|
||||||
|
case 0:
|
||||||
|
return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0)
|
||||||
|
case 1:
|
||||||
|
return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0)
|
||||||
|
case 2:
|
||||||
|
return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0)
|
||||||
|
case 3:
|
||||||
|
return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2])
|
||||||
|
case 4:
|
||||||
|
return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0)
|
||||||
|
case 5:
|
||||||
|
return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0)
|
||||||
|
case 6:
|
||||||
|
return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5])
|
||||||
|
case 7:
|
||||||
|
return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0)
|
||||||
|
case 8:
|
||||||
|
return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0)
|
||||||
|
case 9:
|
||||||
|
return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8])
|
||||||
|
case 10:
|
||||||
|
return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0)
|
||||||
|
case 11:
|
||||||
|
return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0)
|
||||||
|
case 12:
|
||||||
|
return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11])
|
||||||
|
case 13:
|
||||||
|
return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0)
|
||||||
|
case 14:
|
||||||
|
return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0)
|
||||||
|
case 15:
|
||||||
|
return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14])
|
||||||
|
default:
|
||||||
|
panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// A LazyDLL implements access to a single DLL.
|
||||||
|
// It will delay the load of the DLL until the first
|
||||||
|
// call to its Handle method or to one of its
|
||||||
|
// LazyProc's Addr method.
|
||||||
|
type LazyDLL struct {
|
||||||
|
Name string
|
||||||
|
|
||||||
|
// System determines whether the DLL must be loaded from the
|
||||||
|
// Windows System directory, bypassing the normal DLL search
|
||||||
|
// path.
|
||||||
|
System bool
|
||||||
|
|
||||||
|
mu sync.Mutex
|
||||||
|
dll *DLL // non nil once DLL is loaded
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load loads DLL file d.Name into memory. It returns an error if fails.
|
||||||
|
// Load will not try to load DLL, if it is already loaded into memory.
|
||||||
|
func (d *LazyDLL) Load() error {
|
||||||
|
// Non-racy version of:
|
||||||
|
// if d.dll != nil {
|
||||||
|
if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
d.mu.Lock()
|
||||||
|
defer d.mu.Unlock()
|
||||||
|
if d.dll != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// kernel32.dll is special, since it's where LoadLibraryEx comes from.
|
||||||
|
// The kernel already special-cases its name, so it's always
|
||||||
|
// loaded from system32.
|
||||||
|
var dll *DLL
|
||||||
|
var err error
|
||||||
|
if d.Name == "kernel32.dll" {
|
||||||
|
dll, err = LoadDLL(d.Name)
|
||||||
|
} else {
|
||||||
|
dll, err = loadLibraryEx(d.Name, d.System)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Non-racy version of:
|
||||||
|
// d.dll = dll
|
||||||
|
atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// mustLoad is like Load but panics if search fails.
|
||||||
|
func (d *LazyDLL) mustLoad() {
|
||||||
|
e := d.Load()
|
||||||
|
if e != nil {
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle returns d's module handle.
|
||||||
|
func (d *LazyDLL) Handle() uintptr {
|
||||||
|
d.mustLoad()
|
||||||
|
return uintptr(d.dll.Handle)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewProc returns a LazyProc for accessing the named procedure in the DLL d.
|
||||||
|
func (d *LazyDLL) NewProc(name string) *LazyProc {
|
||||||
|
return &LazyProc{l: d, Name: name}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLazyDLL creates new LazyDLL associated with DLL file.
|
||||||
|
func NewLazyDLL(name string) *LazyDLL {
|
||||||
|
return &LazyDLL{Name: name}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLazySystemDLL is like NewLazyDLL, but will only
|
||||||
|
// search Windows System directory for the DLL if name is
|
||||||
|
// a base name (like "advapi32.dll").
|
||||||
|
func NewLazySystemDLL(name string) *LazyDLL {
|
||||||
|
return &LazyDLL{Name: name, System: true}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A LazyProc implements access to a procedure inside a LazyDLL.
|
||||||
|
// It delays the lookup until the Addr method is called.
|
||||||
|
type LazyProc struct {
|
||||||
|
Name string
|
||||||
|
|
||||||
|
mu sync.Mutex
|
||||||
|
l *LazyDLL
|
||||||
|
proc *Proc
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find searches DLL for procedure named p.Name. It returns
|
||||||
|
// an error if search fails. Find will not search procedure,
|
||||||
|
// if it is already found and loaded into memory.
|
||||||
|
func (p *LazyProc) Find() error {
|
||||||
|
// Non-racy version of:
|
||||||
|
// if p.proc == nil {
|
||||||
|
if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil {
|
||||||
|
p.mu.Lock()
|
||||||
|
defer p.mu.Unlock()
|
||||||
|
if p.proc == nil {
|
||||||
|
e := p.l.Load()
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
proc, e := p.l.dll.FindProc(p.Name)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
// Non-racy version of:
|
||||||
|
// p.proc = proc
|
||||||
|
atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// mustFind is like Find but panics if search fails.
|
||||||
|
func (p *LazyProc) mustFind() {
|
||||||
|
e := p.Find()
|
||||||
|
if e != nil {
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Addr returns the address of the procedure represented by p.
|
||||||
|
// The return value can be passed to Syscall to run the procedure.
|
||||||
|
func (p *LazyProc) Addr() uintptr {
|
||||||
|
p.mustFind()
|
||||||
|
return p.proc.Addr()
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:uintptrescapes
|
||||||
|
|
||||||
|
// Call executes procedure p with arguments a. It will panic, if more then 15 arguments
|
||||||
|
// are supplied.
|
||||||
|
//
|
||||||
|
// The returned error is always non-nil, constructed from the result of GetLastError.
|
||||||
|
// Callers must inspect the primary return value to decide whether an error occurred
|
||||||
|
// (according to the semantics of the specific function being called) before consulting
|
||||||
|
// the error. The error will be guaranteed to contain windows.Errno.
|
||||||
|
func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {
|
||||||
|
p.mustFind()
|
||||||
|
return p.proc.Call(a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
var canDoSearchSystem32Once struct {
|
||||||
|
sync.Once
|
||||||
|
v bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func initCanDoSearchSystem32() {
|
||||||
|
// https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says:
|
||||||
|
// "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows
|
||||||
|
// Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on
|
||||||
|
// systems that have KB2533623 installed. To determine whether the
|
||||||
|
// flags are available, use GetProcAddress to get the address of the
|
||||||
|
// AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories
|
||||||
|
// function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_*
|
||||||
|
// flags can be used with LoadLibraryEx."
|
||||||
|
canDoSearchSystem32Once.v = (modkernel32.NewProc("AddDllDirectory").Find() == nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func canDoSearchSystem32() bool {
|
||||||
|
canDoSearchSystem32Once.Do(initCanDoSearchSystem32)
|
||||||
|
return canDoSearchSystem32Once.v
|
||||||
|
}
|
||||||
|
|
||||||
|
func isBaseName(name string) bool {
|
||||||
|
for _, c := range name {
|
||||||
|
if c == ':' || c == '/' || c == '\\' {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// loadLibraryEx wraps the Windows LoadLibraryEx function.
|
||||||
|
//
|
||||||
|
// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
|
||||||
|
//
|
||||||
|
// If name is not an absolute path, LoadLibraryEx searches for the DLL
|
||||||
|
// in a variety of automatic locations unless constrained by flags.
|
||||||
|
// See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx
|
||||||
|
func loadLibraryEx(name string, system bool) (*DLL, error) {
|
||||||
|
loadDLL := name
|
||||||
|
var flags uintptr
|
||||||
|
if system {
|
||||||
|
if canDoSearchSystem32() {
|
||||||
|
const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800
|
||||||
|
flags = LOAD_LIBRARY_SEARCH_SYSTEM32
|
||||||
|
} else if isBaseName(name) {
|
||||||
|
// WindowsXP or unpatched Windows machine
|
||||||
|
// trying to load "foo.dll" out of the system
|
||||||
|
// folder, but LoadLibraryEx doesn't support
|
||||||
|
// that yet on their system, so emulate it.
|
||||||
|
windir, _ := Getenv("WINDIR") // old var; apparently works on XP
|
||||||
|
if windir == "" {
|
||||||
|
return nil, errString("%WINDIR% not defined")
|
||||||
|
}
|
||||||
|
loadDLL = windir + "\\System32\\" + name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
h, err := LoadLibraryEx(loadDLL, 0, flags)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &DLL{Name: name, Handle: h}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type errString string
|
||||||
|
|
||||||
|
func (s errString) Error() string { return string(s) }
|
15
vendor/golang.org/x/sys/windows/env_unset.go
generated
vendored
Normal file
15
vendor/golang.org/x/sys/windows/env_unset.go
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 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 windows
|
||||||
|
// +build go1.4
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
import "syscall"
|
||||||
|
|
||||||
|
func Unsetenv(key string) error {
|
||||||
|
// This was added in Go 1.4.
|
||||||
|
return syscall.Unsetenv(key)
|
||||||
|
}
|
25
vendor/golang.org/x/sys/windows/env_windows.go
generated
vendored
Normal file
25
vendor/golang.org/x/sys/windows/env_windows.go
generated
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Copyright 2010 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.
|
||||||
|
|
||||||
|
// Windows environment variables.
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
import "syscall"
|
||||||
|
|
||||||
|
func Getenv(key string) (value string, found bool) {
|
||||||
|
return syscall.Getenv(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Setenv(key, value string) error {
|
||||||
|
return syscall.Setenv(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Clearenv() {
|
||||||
|
syscall.Clearenv()
|
||||||
|
}
|
||||||
|
|
||||||
|
func Environ() []string {
|
||||||
|
return syscall.Environ()
|
||||||
|
}
|
20
vendor/golang.org/x/sys/windows/eventlog.go
generated
vendored
Normal file
20
vendor/golang.org/x/sys/windows/eventlog.go
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// 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 windows
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
const (
|
||||||
|
EVENTLOG_SUCCESS = 0
|
||||||
|
EVENTLOG_ERROR_TYPE = 1
|
||||||
|
EVENTLOG_WARNING_TYPE = 2
|
||||||
|
EVENTLOG_INFORMATION_TYPE = 4
|
||||||
|
EVENTLOG_AUDIT_SUCCESS = 8
|
||||||
|
EVENTLOG_AUDIT_FAILURE = 16
|
||||||
|
)
|
||||||
|
|
||||||
|
//sys RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW
|
||||||
|
//sys DeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource
|
||||||
|
//sys ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW
|
97
vendor/golang.org/x/sys/windows/exec_windows.go
generated
vendored
Normal file
97
vendor/golang.org/x/sys/windows/exec_windows.go
generated
vendored
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
// Fork, exec, wait, etc.
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
// EscapeArg rewrites command line argument s as prescribed
|
||||||
|
// in http://msdn.microsoft.com/en-us/library/ms880421.
|
||||||
|
// This function returns "" (2 double quotes) if s is empty.
|
||||||
|
// Alternatively, these transformations are done:
|
||||||
|
// - every back slash (\) is doubled, but only if immediately
|
||||||
|
// followed by double quote (");
|
||||||
|
// - every double quote (") is escaped by back slash (\);
|
||||||
|
// - finally, s is wrapped with double quotes (arg -> "arg"),
|
||||||
|
// but only if there is space or tab inside s.
|
||||||
|
func EscapeArg(s string) string {
|
||||||
|
if len(s) == 0 {
|
||||||
|
return "\"\""
|
||||||
|
}
|
||||||
|
n := len(s)
|
||||||
|
hasSpace := false
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
switch s[i] {
|
||||||
|
case '"', '\\':
|
||||||
|
n++
|
||||||
|
case ' ', '\t':
|
||||||
|
hasSpace = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if hasSpace {
|
||||||
|
n += 2
|
||||||
|
}
|
||||||
|
if n == len(s) {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
qs := make([]byte, n)
|
||||||
|
j := 0
|
||||||
|
if hasSpace {
|
||||||
|
qs[j] = '"'
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
slashes := 0
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
switch s[i] {
|
||||||
|
default:
|
||||||
|
slashes = 0
|
||||||
|
qs[j] = s[i]
|
||||||
|
case '\\':
|
||||||
|
slashes++
|
||||||
|
qs[j] = s[i]
|
||||||
|
case '"':
|
||||||
|
for ; slashes > 0; slashes-- {
|
||||||
|
qs[j] = '\\'
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
qs[j] = '\\'
|
||||||
|
j++
|
||||||
|
qs[j] = s[i]
|
||||||
|
}
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
if hasSpace {
|
||||||
|
for ; slashes > 0; slashes-- {
|
||||||
|
qs[j] = '\\'
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
qs[j] = '"'
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
return string(qs[:j])
|
||||||
|
}
|
||||||
|
|
||||||
|
func CloseOnExec(fd Handle) {
|
||||||
|
SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FullPath retrieves the full path of the specified file.
|
||||||
|
func FullPath(name string) (path string, err error) {
|
||||||
|
p, err := UTF16PtrFromString(name)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
n := uint32(100)
|
||||||
|
for {
|
||||||
|
buf := make([]uint16, n)
|
||||||
|
n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if n <= uint32(len(buf)) {
|
||||||
|
return UTF16ToString(buf[:n]), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
7
vendor/golang.org/x/sys/windows/mksyscall.go
generated
vendored
Normal file
7
vendor/golang.org/x/sys/windows/mksyscall.go
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go
|
30
vendor/golang.org/x/sys/windows/race.go
generated
vendored
Normal file
30
vendor/golang.org/x/sys/windows/race.go
generated
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// 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 windows,race
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
import (
|
||||||
|
"runtime"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
const raceenabled = true
|
||||||
|
|
||||||
|
func raceAcquire(addr unsafe.Pointer) {
|
||||||
|
runtime.RaceAcquire(addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func raceReleaseMerge(addr unsafe.Pointer) {
|
||||||
|
runtime.RaceReleaseMerge(addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func raceReadRange(addr unsafe.Pointer, len int) {
|
||||||
|
runtime.RaceReadRange(addr, len)
|
||||||
|
}
|
||||||
|
|
||||||
|
func raceWriteRange(addr unsafe.Pointer, len int) {
|
||||||
|
runtime.RaceWriteRange(addr, len)
|
||||||
|
}
|
25
vendor/golang.org/x/sys/windows/race0.go
generated
vendored
Normal file
25
vendor/golang.org/x/sys/windows/race0.go
generated
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// 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 windows,!race
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
const raceenabled = false
|
||||||
|
|
||||||
|
func raceAcquire(addr unsafe.Pointer) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func raceReleaseMerge(addr unsafe.Pointer) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func raceReadRange(addr unsafe.Pointer, len int) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func raceWriteRange(addr unsafe.Pointer, len int) {
|
||||||
|
}
|
435
vendor/golang.org/x/sys/windows/security_windows.go
generated
vendored
Normal file
435
vendor/golang.org/x/sys/windows/security_windows.go
generated
vendored
Normal file
@ -0,0 +1,435 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
import (
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
STANDARD_RIGHTS_REQUIRED = 0xf0000
|
||||||
|
STANDARD_RIGHTS_READ = 0x20000
|
||||||
|
STANDARD_RIGHTS_WRITE = 0x20000
|
||||||
|
STANDARD_RIGHTS_EXECUTE = 0x20000
|
||||||
|
STANDARD_RIGHTS_ALL = 0x1F0000
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
NameUnknown = 0
|
||||||
|
NameFullyQualifiedDN = 1
|
||||||
|
NameSamCompatible = 2
|
||||||
|
NameDisplay = 3
|
||||||
|
NameUniqueId = 6
|
||||||
|
NameCanonical = 7
|
||||||
|
NameUserPrincipal = 8
|
||||||
|
NameCanonicalEx = 9
|
||||||
|
NameServicePrincipal = 10
|
||||||
|
NameDnsDomain = 12
|
||||||
|
)
|
||||||
|
|
||||||
|
// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.
|
||||||
|
// http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx
|
||||||
|
//sys TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW
|
||||||
|
//sys GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW
|
||||||
|
|
||||||
|
// TranslateAccountName converts a directory service
|
||||||
|
// object name from one format to another.
|
||||||
|
func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) {
|
||||||
|
u, e := UTF16PtrFromString(username)
|
||||||
|
if e != nil {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
n := uint32(50)
|
||||||
|
for {
|
||||||
|
b := make([]uint16, n)
|
||||||
|
e = TranslateName(u, from, to, &b[0], &n)
|
||||||
|
if e == nil {
|
||||||
|
return UTF16ToString(b[:n]), nil
|
||||||
|
}
|
||||||
|
if e != ERROR_INSUFFICIENT_BUFFER {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
if n <= uint32(len(b)) {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
// do not reorder
|
||||||
|
NetSetupUnknownStatus = iota
|
||||||
|
NetSetupUnjoined
|
||||||
|
NetSetupWorkgroupName
|
||||||
|
NetSetupDomainName
|
||||||
|
)
|
||||||
|
|
||||||
|
type UserInfo10 struct {
|
||||||
|
Name *uint16
|
||||||
|
Comment *uint16
|
||||||
|
UsrComment *uint16
|
||||||
|
FullName *uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
//sys NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo
|
||||||
|
//sys NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation
|
||||||
|
//sys NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree
|
||||||
|
|
||||||
|
const (
|
||||||
|
// do not reorder
|
||||||
|
SidTypeUser = 1 + iota
|
||||||
|
SidTypeGroup
|
||||||
|
SidTypeDomain
|
||||||
|
SidTypeAlias
|
||||||
|
SidTypeWellKnownGroup
|
||||||
|
SidTypeDeletedAccount
|
||||||
|
SidTypeInvalid
|
||||||
|
SidTypeUnknown
|
||||||
|
SidTypeComputer
|
||||||
|
SidTypeLabel
|
||||||
|
)
|
||||||
|
|
||||||
|
type SidIdentifierAuthority struct {
|
||||||
|
Value [6]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
SECURITY_NULL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}}
|
||||||
|
SECURITY_WORLD_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}}
|
||||||
|
SECURITY_LOCAL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}}
|
||||||
|
SECURITY_CREATOR_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}}
|
||||||
|
SECURITY_NON_UNIQUE_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}}
|
||||||
|
SECURITY_NT_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}}
|
||||||
|
SECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}}
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
SECURITY_NULL_RID = 0
|
||||||
|
SECURITY_WORLD_RID = 0
|
||||||
|
SECURITY_LOCAL_RID = 0
|
||||||
|
SECURITY_CREATOR_OWNER_RID = 0
|
||||||
|
SECURITY_CREATOR_GROUP_RID = 1
|
||||||
|
SECURITY_DIALUP_RID = 1
|
||||||
|
SECURITY_NETWORK_RID = 2
|
||||||
|
SECURITY_BATCH_RID = 3
|
||||||
|
SECURITY_INTERACTIVE_RID = 4
|
||||||
|
SECURITY_LOGON_IDS_RID = 5
|
||||||
|
SECURITY_SERVICE_RID = 6
|
||||||
|
SECURITY_LOCAL_SYSTEM_RID = 18
|
||||||
|
SECURITY_BUILTIN_DOMAIN_RID = 32
|
||||||
|
SECURITY_PRINCIPAL_SELF_RID = 10
|
||||||
|
SECURITY_CREATOR_OWNER_SERVER_RID = 0x2
|
||||||
|
SECURITY_CREATOR_GROUP_SERVER_RID = 0x3
|
||||||
|
SECURITY_LOGON_IDS_RID_COUNT = 0x3
|
||||||
|
SECURITY_ANONYMOUS_LOGON_RID = 0x7
|
||||||
|
SECURITY_PROXY_RID = 0x8
|
||||||
|
SECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9
|
||||||
|
SECURITY_SERVER_LOGON_RID = SECURITY_ENTERPRISE_CONTROLLERS_RID
|
||||||
|
SECURITY_AUTHENTICATED_USER_RID = 0xb
|
||||||
|
SECURITY_RESTRICTED_CODE_RID = 0xc
|
||||||
|
SECURITY_NT_NON_UNIQUE_RID = 0x15
|
||||||
|
)
|
||||||
|
|
||||||
|
//sys LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW
|
||||||
|
//sys LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW
|
||||||
|
//sys ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW
|
||||||
|
//sys ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW
|
||||||
|
//sys GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid
|
||||||
|
//sys CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid
|
||||||
|
//sys AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid
|
||||||
|
//sys FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid
|
||||||
|
//sys EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid
|
||||||
|
|
||||||
|
// The security identifier (SID) structure is a variable-length
|
||||||
|
// structure used to uniquely identify users or groups.
|
||||||
|
type SID struct{}
|
||||||
|
|
||||||
|
// StringToSid converts a string-format security identifier
|
||||||
|
// sid into a valid, functional sid.
|
||||||
|
func StringToSid(s string) (*SID, error) {
|
||||||
|
var sid *SID
|
||||||
|
p, e := UTF16PtrFromString(s)
|
||||||
|
if e != nil {
|
||||||
|
return nil, e
|
||||||
|
}
|
||||||
|
e = ConvertStringSidToSid(p, &sid)
|
||||||
|
if e != nil {
|
||||||
|
return nil, e
|
||||||
|
}
|
||||||
|
defer LocalFree((Handle)(unsafe.Pointer(sid)))
|
||||||
|
return sid.Copy()
|
||||||
|
}
|
||||||
|
|
||||||
|
// LookupSID retrieves a security identifier sid for the account
|
||||||
|
// and the name of the domain on which the account was found.
|
||||||
|
// System specify target computer to search.
|
||||||
|
func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) {
|
||||||
|
if len(account) == 0 {
|
||||||
|
return nil, "", 0, syscall.EINVAL
|
||||||
|
}
|
||||||
|
acc, e := UTF16PtrFromString(account)
|
||||||
|
if e != nil {
|
||||||
|
return nil, "", 0, e
|
||||||
|
}
|
||||||
|
var sys *uint16
|
||||||
|
if len(system) > 0 {
|
||||||
|
sys, e = UTF16PtrFromString(system)
|
||||||
|
if e != nil {
|
||||||
|
return nil, "", 0, e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
n := uint32(50)
|
||||||
|
dn := uint32(50)
|
||||||
|
for {
|
||||||
|
b := make([]byte, n)
|
||||||
|
db := make([]uint16, dn)
|
||||||
|
sid = (*SID)(unsafe.Pointer(&b[0]))
|
||||||
|
e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType)
|
||||||
|
if e == nil {
|
||||||
|
return sid, UTF16ToString(db), accType, nil
|
||||||
|
}
|
||||||
|
if e != ERROR_INSUFFICIENT_BUFFER {
|
||||||
|
return nil, "", 0, e
|
||||||
|
}
|
||||||
|
if n <= uint32(len(b)) {
|
||||||
|
return nil, "", 0, e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// String converts sid to a string format
|
||||||
|
// suitable for display, storage, or transmission.
|
||||||
|
func (sid *SID) String() (string, error) {
|
||||||
|
var s *uint16
|
||||||
|
e := ConvertSidToStringSid(sid, &s)
|
||||||
|
if e != nil {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
defer LocalFree((Handle)(unsafe.Pointer(s)))
|
||||||
|
return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns the length, in bytes, of a valid security identifier sid.
|
||||||
|
func (sid *SID) Len() int {
|
||||||
|
return int(GetLengthSid(sid))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy creates a duplicate of security identifier sid.
|
||||||
|
func (sid *SID) Copy() (*SID, error) {
|
||||||
|
b := make([]byte, sid.Len())
|
||||||
|
sid2 := (*SID)(unsafe.Pointer(&b[0]))
|
||||||
|
e := CopySid(uint32(len(b)), sid2, sid)
|
||||||
|
if e != nil {
|
||||||
|
return nil, e
|
||||||
|
}
|
||||||
|
return sid2, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LookupAccount retrieves the name of the account for this sid
|
||||||
|
// and the name of the first domain on which this sid is found.
|
||||||
|
// System specify target computer to search for.
|
||||||
|
func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) {
|
||||||
|
var sys *uint16
|
||||||
|
if len(system) > 0 {
|
||||||
|
sys, err = UTF16PtrFromString(system)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
n := uint32(50)
|
||||||
|
dn := uint32(50)
|
||||||
|
for {
|
||||||
|
b := make([]uint16, n)
|
||||||
|
db := make([]uint16, dn)
|
||||||
|
e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType)
|
||||||
|
if e == nil {
|
||||||
|
return UTF16ToString(b), UTF16ToString(db), accType, nil
|
||||||
|
}
|
||||||
|
if e != ERROR_INSUFFICIENT_BUFFER {
|
||||||
|
return "", "", 0, e
|
||||||
|
}
|
||||||
|
if n <= uint32(len(b)) {
|
||||||
|
return "", "", 0, e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
// do not reorder
|
||||||
|
TOKEN_ASSIGN_PRIMARY = 1 << iota
|
||||||
|
TOKEN_DUPLICATE
|
||||||
|
TOKEN_IMPERSONATE
|
||||||
|
TOKEN_QUERY
|
||||||
|
TOKEN_QUERY_SOURCE
|
||||||
|
TOKEN_ADJUST_PRIVILEGES
|
||||||
|
TOKEN_ADJUST_GROUPS
|
||||||
|
TOKEN_ADJUST_DEFAULT
|
||||||
|
|
||||||
|
TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |
|
||||||
|
TOKEN_ASSIGN_PRIMARY |
|
||||||
|
TOKEN_DUPLICATE |
|
||||||
|
TOKEN_IMPERSONATE |
|
||||||
|
TOKEN_QUERY |
|
||||||
|
TOKEN_QUERY_SOURCE |
|
||||||
|
TOKEN_ADJUST_PRIVILEGES |
|
||||||
|
TOKEN_ADJUST_GROUPS |
|
||||||
|
TOKEN_ADJUST_DEFAULT
|
||||||
|
TOKEN_READ = STANDARD_RIGHTS_READ | TOKEN_QUERY
|
||||||
|
TOKEN_WRITE = STANDARD_RIGHTS_WRITE |
|
||||||
|
TOKEN_ADJUST_PRIVILEGES |
|
||||||
|
TOKEN_ADJUST_GROUPS |
|
||||||
|
TOKEN_ADJUST_DEFAULT
|
||||||
|
TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// do not reorder
|
||||||
|
TokenUser = 1 + iota
|
||||||
|
TokenGroups
|
||||||
|
TokenPrivileges
|
||||||
|
TokenOwner
|
||||||
|
TokenPrimaryGroup
|
||||||
|
TokenDefaultDacl
|
||||||
|
TokenSource
|
||||||
|
TokenType
|
||||||
|
TokenImpersonationLevel
|
||||||
|
TokenStatistics
|
||||||
|
TokenRestrictedSids
|
||||||
|
TokenSessionId
|
||||||
|
TokenGroupsAndPrivileges
|
||||||
|
TokenSessionReference
|
||||||
|
TokenSandBoxInert
|
||||||
|
TokenAuditPolicy
|
||||||
|
TokenOrigin
|
||||||
|
TokenElevationType
|
||||||
|
TokenLinkedToken
|
||||||
|
TokenElevation
|
||||||
|
TokenHasRestrictions
|
||||||
|
TokenAccessInformation
|
||||||
|
TokenVirtualizationAllowed
|
||||||
|
TokenVirtualizationEnabled
|
||||||
|
TokenIntegrityLevel
|
||||||
|
TokenUIAccess
|
||||||
|
TokenMandatoryPolicy
|
||||||
|
TokenLogonSid
|
||||||
|
MaxTokenInfoClass
|
||||||
|
)
|
||||||
|
|
||||||
|
type SIDAndAttributes struct {
|
||||||
|
Sid *SID
|
||||||
|
Attributes uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type Tokenuser struct {
|
||||||
|
User SIDAndAttributes
|
||||||
|
}
|
||||||
|
|
||||||
|
type Tokenprimarygroup struct {
|
||||||
|
PrimaryGroup *SID
|
||||||
|
}
|
||||||
|
|
||||||
|
type Tokengroups struct {
|
||||||
|
GroupCount uint32
|
||||||
|
Groups [1]SIDAndAttributes
|
||||||
|
}
|
||||||
|
|
||||||
|
//sys OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken
|
||||||
|
//sys GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation
|
||||||
|
//sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW
|
||||||
|
|
||||||
|
// An access token contains the security information for a logon session.
|
||||||
|
// The system creates an access token when a user logs on, and every
|
||||||
|
// process executed on behalf of the user has a copy of the token.
|
||||||
|
// The token identifies the user, the user's groups, and the user's
|
||||||
|
// privileges. The system uses the token to control access to securable
|
||||||
|
// objects and to control the ability of the user to perform various
|
||||||
|
// system-related operations on the local computer.
|
||||||
|
type Token Handle
|
||||||
|
|
||||||
|
// OpenCurrentProcessToken opens the access token
|
||||||
|
// associated with current process.
|
||||||
|
func OpenCurrentProcessToken() (Token, error) {
|
||||||
|
p, e := GetCurrentProcess()
|
||||||
|
if e != nil {
|
||||||
|
return 0, e
|
||||||
|
}
|
||||||
|
var t Token
|
||||||
|
e = OpenProcessToken(p, TOKEN_QUERY, &t)
|
||||||
|
if e != nil {
|
||||||
|
return 0, e
|
||||||
|
}
|
||||||
|
return t, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close releases access to access token.
|
||||||
|
func (t Token) Close() error {
|
||||||
|
return CloseHandle(Handle(t))
|
||||||
|
}
|
||||||
|
|
||||||
|
// getInfo retrieves a specified type of information about an access token.
|
||||||
|
func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) {
|
||||||
|
n := uint32(initSize)
|
||||||
|
for {
|
||||||
|
b := make([]byte, n)
|
||||||
|
e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n)
|
||||||
|
if e == nil {
|
||||||
|
return unsafe.Pointer(&b[0]), nil
|
||||||
|
}
|
||||||
|
if e != ERROR_INSUFFICIENT_BUFFER {
|
||||||
|
return nil, e
|
||||||
|
}
|
||||||
|
if n <= uint32(len(b)) {
|
||||||
|
return nil, e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTokenUser retrieves access token t user account information.
|
||||||
|
func (t Token) GetTokenUser() (*Tokenuser, error) {
|
||||||
|
i, e := t.getInfo(TokenUser, 50)
|
||||||
|
if e != nil {
|
||||||
|
return nil, e
|
||||||
|
}
|
||||||
|
return (*Tokenuser)(i), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTokenGroups retrieves group accounts associated with access token t.
|
||||||
|
func (t Token) GetTokenGroups() (*Tokengroups, error) {
|
||||||
|
i, e := t.getInfo(TokenGroups, 50)
|
||||||
|
if e != nil {
|
||||||
|
return nil, e
|
||||||
|
}
|
||||||
|
return (*Tokengroups)(i), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTokenPrimaryGroup retrieves access token t primary group information.
|
||||||
|
// A pointer to a SID structure representing a group that will become
|
||||||
|
// the primary group of any objects created by a process using this access token.
|
||||||
|
func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) {
|
||||||
|
i, e := t.getInfo(TokenPrimaryGroup, 50)
|
||||||
|
if e != nil {
|
||||||
|
return nil, e
|
||||||
|
}
|
||||||
|
return (*Tokenprimarygroup)(i), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserProfileDirectory retrieves path to the
|
||||||
|
// root directory of the access token t user's profile.
|
||||||
|
func (t Token) GetUserProfileDirectory() (string, error) {
|
||||||
|
n := uint32(100)
|
||||||
|
for {
|
||||||
|
b := make([]uint16, n)
|
||||||
|
e := GetUserProfileDirectory(t, &b[0], &n)
|
||||||
|
if e == nil {
|
||||||
|
return UTF16ToString(b), nil
|
||||||
|
}
|
||||||
|
if e != ERROR_INSUFFICIENT_BUFFER {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
if n <= uint32(len(b)) {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
143
vendor/golang.org/x/sys/windows/service.go
generated
vendored
Normal file
143
vendor/golang.org/x/sys/windows/service.go
generated
vendored
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
// 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 windows
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
const (
|
||||||
|
SC_MANAGER_CONNECT = 1
|
||||||
|
SC_MANAGER_CREATE_SERVICE = 2
|
||||||
|
SC_MANAGER_ENUMERATE_SERVICE = 4
|
||||||
|
SC_MANAGER_LOCK = 8
|
||||||
|
SC_MANAGER_QUERY_LOCK_STATUS = 16
|
||||||
|
SC_MANAGER_MODIFY_BOOT_CONFIG = 32
|
||||||
|
SC_MANAGER_ALL_ACCESS = 0xf003f
|
||||||
|
)
|
||||||
|
|
||||||
|
//sys OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW
|
||||||
|
|
||||||
|
const (
|
||||||
|
SERVICE_KERNEL_DRIVER = 1
|
||||||
|
SERVICE_FILE_SYSTEM_DRIVER = 2
|
||||||
|
SERVICE_ADAPTER = 4
|
||||||
|
SERVICE_RECOGNIZER_DRIVER = 8
|
||||||
|
SERVICE_WIN32_OWN_PROCESS = 16
|
||||||
|
SERVICE_WIN32_SHARE_PROCESS = 32
|
||||||
|
SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS
|
||||||
|
SERVICE_INTERACTIVE_PROCESS = 256
|
||||||
|
SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER
|
||||||
|
SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS
|
||||||
|
|
||||||
|
SERVICE_BOOT_START = 0
|
||||||
|
SERVICE_SYSTEM_START = 1
|
||||||
|
SERVICE_AUTO_START = 2
|
||||||
|
SERVICE_DEMAND_START = 3
|
||||||
|
SERVICE_DISABLED = 4
|
||||||
|
|
||||||
|
SERVICE_ERROR_IGNORE = 0
|
||||||
|
SERVICE_ERROR_NORMAL = 1
|
||||||
|
SERVICE_ERROR_SEVERE = 2
|
||||||
|
SERVICE_ERROR_CRITICAL = 3
|
||||||
|
|
||||||
|
SC_STATUS_PROCESS_INFO = 0
|
||||||
|
|
||||||
|
SERVICE_STOPPED = 1
|
||||||
|
SERVICE_START_PENDING = 2
|
||||||
|
SERVICE_STOP_PENDING = 3
|
||||||
|
SERVICE_RUNNING = 4
|
||||||
|
SERVICE_CONTINUE_PENDING = 5
|
||||||
|
SERVICE_PAUSE_PENDING = 6
|
||||||
|
SERVICE_PAUSED = 7
|
||||||
|
SERVICE_NO_CHANGE = 0xffffffff
|
||||||
|
|
||||||
|
SERVICE_ACCEPT_STOP = 1
|
||||||
|
SERVICE_ACCEPT_PAUSE_CONTINUE = 2
|
||||||
|
SERVICE_ACCEPT_SHUTDOWN = 4
|
||||||
|
SERVICE_ACCEPT_PARAMCHANGE = 8
|
||||||
|
SERVICE_ACCEPT_NETBINDCHANGE = 16
|
||||||
|
SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32
|
||||||
|
SERVICE_ACCEPT_POWEREVENT = 64
|
||||||
|
SERVICE_ACCEPT_SESSIONCHANGE = 128
|
||||||
|
|
||||||
|
SERVICE_CONTROL_STOP = 1
|
||||||
|
SERVICE_CONTROL_PAUSE = 2
|
||||||
|
SERVICE_CONTROL_CONTINUE = 3
|
||||||
|
SERVICE_CONTROL_INTERROGATE = 4
|
||||||
|
SERVICE_CONTROL_SHUTDOWN = 5
|
||||||
|
SERVICE_CONTROL_PARAMCHANGE = 6
|
||||||
|
SERVICE_CONTROL_NETBINDADD = 7
|
||||||
|
SERVICE_CONTROL_NETBINDREMOVE = 8
|
||||||
|
SERVICE_CONTROL_NETBINDENABLE = 9
|
||||||
|
SERVICE_CONTROL_NETBINDDISABLE = 10
|
||||||
|
SERVICE_CONTROL_DEVICEEVENT = 11
|
||||||
|
SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12
|
||||||
|
SERVICE_CONTROL_POWEREVENT = 13
|
||||||
|
SERVICE_CONTROL_SESSIONCHANGE = 14
|
||||||
|
|
||||||
|
SERVICE_ACTIVE = 1
|
||||||
|
SERVICE_INACTIVE = 2
|
||||||
|
SERVICE_STATE_ALL = 3
|
||||||
|
|
||||||
|
SERVICE_QUERY_CONFIG = 1
|
||||||
|
SERVICE_CHANGE_CONFIG = 2
|
||||||
|
SERVICE_QUERY_STATUS = 4
|
||||||
|
SERVICE_ENUMERATE_DEPENDENTS = 8
|
||||||
|
SERVICE_START = 16
|
||||||
|
SERVICE_STOP = 32
|
||||||
|
SERVICE_PAUSE_CONTINUE = 64
|
||||||
|
SERVICE_INTERROGATE = 128
|
||||||
|
SERVICE_USER_DEFINED_CONTROL = 256
|
||||||
|
SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL
|
||||||
|
SERVICE_RUNS_IN_SYSTEM_PROCESS = 1
|
||||||
|
SERVICE_CONFIG_DESCRIPTION = 1
|
||||||
|
SERVICE_CONFIG_FAILURE_ACTIONS = 2
|
||||||
|
|
||||||
|
NO_ERROR = 0
|
||||||
|
)
|
||||||
|
|
||||||
|
type SERVICE_STATUS struct {
|
||||||
|
ServiceType uint32
|
||||||
|
CurrentState uint32
|
||||||
|
ControlsAccepted uint32
|
||||||
|
Win32ExitCode uint32
|
||||||
|
ServiceSpecificExitCode uint32
|
||||||
|
CheckPoint uint32
|
||||||
|
WaitHint uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type SERVICE_TABLE_ENTRY struct {
|
||||||
|
ServiceName *uint16
|
||||||
|
ServiceProc uintptr
|
||||||
|
}
|
||||||
|
|
||||||
|
type QUERY_SERVICE_CONFIG struct {
|
||||||
|
ServiceType uint32
|
||||||
|
StartType uint32
|
||||||
|
ErrorControl uint32
|
||||||
|
BinaryPathName *uint16
|
||||||
|
LoadOrderGroup *uint16
|
||||||
|
TagId uint32
|
||||||
|
Dependencies *uint16
|
||||||
|
ServiceStartName *uint16
|
||||||
|
DisplayName *uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
type SERVICE_DESCRIPTION struct {
|
||||||
|
Description *uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
//sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle
|
||||||
|
//sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW
|
||||||
|
//sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW
|
||||||
|
//sys DeleteService(service Handle) (err error) = advapi32.DeleteService
|
||||||
|
//sys StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW
|
||||||
|
//sys QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus
|
||||||
|
//sys ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService
|
||||||
|
//sys StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW
|
||||||
|
//sys SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus
|
||||||
|
//sys ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW
|
||||||
|
//sys QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW
|
||||||
|
//sys ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W
|
||||||
|
//sys QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W
|
22
vendor/golang.org/x/sys/windows/str.go
generated
vendored
Normal file
22
vendor/golang.org/x/sys/windows/str.go
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// 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 windows
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
func itoa(val int) string { // do it here rather than with fmt to avoid dependency
|
||||||
|
if val < 0 {
|
||||||
|
return "-" + itoa(-val)
|
||||||
|
}
|
||||||
|
var buf [32]byte // big enough for int64
|
||||||
|
i := len(buf) - 1
|
||||||
|
for val >= 10 {
|
||||||
|
buf[i] = byte(val%10 + '0')
|
||||||
|
i--
|
||||||
|
val /= 10
|
||||||
|
}
|
||||||
|
buf[i] = byte(val + '0')
|
||||||
|
return string(buf[i:])
|
||||||
|
}
|
71
vendor/golang.org/x/sys/windows/syscall.go
generated
vendored
Normal file
71
vendor/golang.org/x/sys/windows/syscall.go
generated
vendored
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
// 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 windows
|
||||||
|
|
||||||
|
// Package windows contains an interface to the low-level operating system
|
||||||
|
// primitives. OS details vary depending on the underlying system, and
|
||||||
|
// by default, godoc will display the OS-specific documentation for the current
|
||||||
|
// system. If you want godoc to display syscall documentation for another
|
||||||
|
// system, set $GOOS and $GOARCH to the desired system. For example, if
|
||||||
|
// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS
|
||||||
|
// to freebsd and $GOARCH to arm.
|
||||||
|
// The primary use of this package is inside other packages that provide a more
|
||||||
|
// portable interface to the system, such as "os", "time" and "net". Use
|
||||||
|
// those packages rather than this one if you can.
|
||||||
|
// For details of the functions and data types in this package consult
|
||||||
|
// the manuals for the appropriate operating system.
|
||||||
|
// These calls return err == nil to indicate success; otherwise
|
||||||
|
// err represents an operating system error describing the failure and
|
||||||
|
// holds a value of type syscall.Errno.
|
||||||
|
package windows
|
||||||
|
|
||||||
|
import (
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ByteSliceFromString returns a NUL-terminated slice of bytes
|
||||||
|
// containing the text of s. If s contains a NUL byte at any
|
||||||
|
// location, it returns (nil, syscall.EINVAL).
|
||||||
|
func ByteSliceFromString(s string) ([]byte, error) {
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
if s[i] == 0 {
|
||||||
|
return nil, syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
a := make([]byte, len(s)+1)
|
||||||
|
copy(a, s)
|
||||||
|
return a, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// BytePtrFromString returns a pointer to a NUL-terminated array of
|
||||||
|
// bytes containing the text of s. If s contains a NUL byte at any
|
||||||
|
// location, it returns (nil, syscall.EINVAL).
|
||||||
|
func BytePtrFromString(s string) (*byte, error) {
|
||||||
|
a, err := ByteSliceFromString(s)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &a[0], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Single-word zero for use when we need a valid pointer to 0 bytes.
|
||||||
|
// See mksyscall.pl.
|
||||||
|
var _zero uintptr
|
||||||
|
|
||||||
|
func (ts *Timespec) Unix() (sec int64, nsec int64) {
|
||||||
|
return int64(ts.Sec), int64(ts.Nsec)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tv *Timeval) Unix() (sec int64, nsec int64) {
|
||||||
|
return int64(tv.Sec), int64(tv.Usec) * 1000
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ts *Timespec) Nano() int64 {
|
||||||
|
return int64(ts.Sec)*1e9 + int64(ts.Nsec)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tv *Timeval) Nano() int64 {
|
||||||
|
return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000
|
||||||
|
}
|
991
vendor/golang.org/x/sys/windows/syscall_windows.go
generated
vendored
Normal file
991
vendor/golang.org/x/sys/windows/syscall_windows.go
generated
vendored
Normal file
@ -0,0 +1,991 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
// Windows system calls.
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
import (
|
||||||
|
errorspkg "errors"
|
||||||
|
"sync"
|
||||||
|
"syscall"
|
||||||
|
"unicode/utf16"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Handle uintptr
|
||||||
|
|
||||||
|
const InvalidHandle = ^Handle(0)
|
||||||
|
|
||||||
|
// StringToUTF16 is deprecated. Use UTF16FromString instead.
|
||||||
|
// If s contains a NUL byte this function panics instead of
|
||||||
|
// returning an error.
|
||||||
|
func StringToUTF16(s string) []uint16 {
|
||||||
|
a, err := UTF16FromString(s)
|
||||||
|
if err != nil {
|
||||||
|
panic("windows: string with NUL passed to StringToUTF16")
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
// UTF16FromString returns the UTF-16 encoding of the UTF-8 string
|
||||||
|
// s, with a terminating NUL added. If s contains a NUL byte at any
|
||||||
|
// location, it returns (nil, syscall.EINVAL).
|
||||||
|
func UTF16FromString(s string) ([]uint16, error) {
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
if s[i] == 0 {
|
||||||
|
return nil, syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return utf16.Encode([]rune(s + "\x00")), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
|
||||||
|
// with a terminating NUL removed.
|
||||||
|
func UTF16ToString(s []uint16) string {
|
||||||
|
for i, v := range s {
|
||||||
|
if v == 0 {
|
||||||
|
s = s[0:i]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return string(utf16.Decode(s))
|
||||||
|
}
|
||||||
|
|
||||||
|
// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead.
|
||||||
|
// If s contains a NUL byte this function panics instead of
|
||||||
|
// returning an error.
|
||||||
|
func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] }
|
||||||
|
|
||||||
|
// UTF16PtrFromString returns pointer to the UTF-16 encoding of
|
||||||
|
// the UTF-8 string s, with a terminating NUL added. If s
|
||||||
|
// contains a NUL byte at any location, it returns (nil, syscall.EINVAL).
|
||||||
|
func UTF16PtrFromString(s string) (*uint16, error) {
|
||||||
|
a, err := UTF16FromString(s)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &a[0], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Getpagesize() int { return 4096 }
|
||||||
|
|
||||||
|
// Converts a Go function to a function pointer conforming
|
||||||
|
// to the stdcall or cdecl calling convention. This is useful when
|
||||||
|
// interoperating with Windows code requiring callbacks.
|
||||||
|
// Implemented in runtime/syscall_windows.goc
|
||||||
|
func NewCallback(fn interface{}) uintptr
|
||||||
|
func NewCallbackCDecl(fn interface{}) uintptr
|
||||||
|
|
||||||
|
// windows api calls
|
||||||
|
|
||||||
|
//sys GetLastError() (lasterr error)
|
||||||
|
//sys LoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW
|
||||||
|
//sys LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW
|
||||||
|
//sys FreeLibrary(handle Handle) (err error)
|
||||||
|
//sys GetProcAddress(module Handle, procname string) (proc uintptr, err error)
|
||||||
|
//sys GetVersion() (ver uint32, err error)
|
||||||
|
//sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW
|
||||||
|
//sys ExitProcess(exitcode uint32)
|
||||||
|
//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW
|
||||||
|
//sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error)
|
||||||
|
//sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error)
|
||||||
|
//sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff]
|
||||||
|
//sys CloseHandle(handle Handle) (err error)
|
||||||
|
//sys GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle]
|
||||||
|
//sys SetStdHandle(stdhandle uint32, handle Handle) (err error)
|
||||||
|
//sys findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW
|
||||||
|
//sys findNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW
|
||||||
|
//sys FindClose(handle Handle) (err error)
|
||||||
|
//sys GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error)
|
||||||
|
//sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW
|
||||||
|
//sys SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW
|
||||||
|
//sys CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW
|
||||||
|
//sys RemoveDirectory(path *uint16) (err error) = RemoveDirectoryW
|
||||||
|
//sys DeleteFile(path *uint16) (err error) = DeleteFileW
|
||||||
|
//sys MoveFile(from *uint16, to *uint16) (err error) = MoveFileW
|
||||||
|
//sys MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW
|
||||||
|
//sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW
|
||||||
|
//sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW
|
||||||
|
//sys SetEndOfFile(handle Handle) (err error)
|
||||||
|
//sys GetSystemTimeAsFileTime(time *Filetime)
|
||||||
|
//sys GetSystemTimePreciseAsFileTime(time *Filetime)
|
||||||
|
//sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff]
|
||||||
|
//sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error)
|
||||||
|
//sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error)
|
||||||
|
//sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error)
|
||||||
|
//sys CancelIo(s Handle) (err error)
|
||||||
|
//sys CancelIoEx(s Handle, o *Overlapped) (err error)
|
||||||
|
//sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW
|
||||||
|
//sys OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error)
|
||||||
|
//sys TerminateProcess(handle Handle, exitcode uint32) (err error)
|
||||||
|
//sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error)
|
||||||
|
//sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW
|
||||||
|
//sys GetCurrentProcess() (pseudoHandle Handle, err error)
|
||||||
|
//sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error)
|
||||||
|
//sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error)
|
||||||
|
//sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff]
|
||||||
|
//sys GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW
|
||||||
|
//sys CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error)
|
||||||
|
//sys GetFileType(filehandle Handle) (n uint32, err error)
|
||||||
|
//sys CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW
|
||||||
|
//sys CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext
|
||||||
|
//sys CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom
|
||||||
|
//sys GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW
|
||||||
|
//sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW
|
||||||
|
//sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW
|
||||||
|
//sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW
|
||||||
|
//sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error)
|
||||||
|
//sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW
|
||||||
|
//sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW
|
||||||
|
//sys GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW
|
||||||
|
//sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW
|
||||||
|
//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW
|
||||||
|
//sys LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0]
|
||||||
|
//sys SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error)
|
||||||
|
//sys FlushFileBuffers(handle Handle) (err error)
|
||||||
|
//sys GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW
|
||||||
|
//sys GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW
|
||||||
|
//sys GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW
|
||||||
|
//sys CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) = kernel32.CreateFileMappingW
|
||||||
|
//sys MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error)
|
||||||
|
//sys UnmapViewOfFile(addr uintptr) (err error)
|
||||||
|
//sys FlushViewOfFile(addr uintptr, length uintptr) (err error)
|
||||||
|
//sys VirtualLock(addr uintptr, length uintptr) (err error)
|
||||||
|
//sys VirtualUnlock(addr uintptr, length uintptr) (err error)
|
||||||
|
//sys TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile
|
||||||
|
//sys ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW
|
||||||
|
//sys CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW
|
||||||
|
//sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) [failretval==InvalidHandle] = crypt32.CertOpenStore
|
||||||
|
//sys CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore
|
||||||
|
//sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore
|
||||||
|
//sys CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore
|
||||||
|
//sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain
|
||||||
|
//sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain
|
||||||
|
//sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext
|
||||||
|
//sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext
|
||||||
|
//sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy
|
||||||
|
//sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW
|
||||||
|
//sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey
|
||||||
|
//sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW
|
||||||
|
//sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW
|
||||||
|
//sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW
|
||||||
|
//sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId
|
||||||
|
//sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode
|
||||||
|
//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
|
||||||
|
//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
|
||||||
|
//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
|
||||||
|
//sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW
|
||||||
|
//sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW
|
||||||
|
//sys DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error)
|
||||||
|
// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.
|
||||||
|
//sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW
|
||||||
|
//sys CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW
|
||||||
|
//sys GetCurrentThreadId() (id uint32)
|
||||||
|
//sys CreateEvent(eventAttrs *syscall.SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) = kernel32.CreateEventW
|
||||||
|
//sys SetEvent(event Handle) (err error) = kernel32.SetEvent
|
||||||
|
|
||||||
|
// syscall interface implementation for other packages
|
||||||
|
|
||||||
|
func Exit(code int) { ExitProcess(uint32(code)) }
|
||||||
|
|
||||||
|
func makeInheritSa() *SecurityAttributes {
|
||||||
|
var sa SecurityAttributes
|
||||||
|
sa.Length = uint32(unsafe.Sizeof(sa))
|
||||||
|
sa.InheritHandle = 1
|
||||||
|
return &sa
|
||||||
|
}
|
||||||
|
|
||||||
|
func Open(path string, mode int, perm uint32) (fd Handle, err error) {
|
||||||
|
if len(path) == 0 {
|
||||||
|
return InvalidHandle, ERROR_FILE_NOT_FOUND
|
||||||
|
}
|
||||||
|
pathp, err := UTF16PtrFromString(path)
|
||||||
|
if err != nil {
|
||||||
|
return InvalidHandle, err
|
||||||
|
}
|
||||||
|
var access uint32
|
||||||
|
switch mode & (O_RDONLY | O_WRONLY | O_RDWR) {
|
||||||
|
case O_RDONLY:
|
||||||
|
access = GENERIC_READ
|
||||||
|
case O_WRONLY:
|
||||||
|
access = GENERIC_WRITE
|
||||||
|
case O_RDWR:
|
||||||
|
access = GENERIC_READ | GENERIC_WRITE
|
||||||
|
}
|
||||||
|
if mode&O_CREAT != 0 {
|
||||||
|
access |= GENERIC_WRITE
|
||||||
|
}
|
||||||
|
if mode&O_APPEND != 0 {
|
||||||
|
access &^= GENERIC_WRITE
|
||||||
|
access |= FILE_APPEND_DATA
|
||||||
|
}
|
||||||
|
sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)
|
||||||
|
var sa *SecurityAttributes
|
||||||
|
if mode&O_CLOEXEC == 0 {
|
||||||
|
sa = makeInheritSa()
|
||||||
|
}
|
||||||
|
var createmode uint32
|
||||||
|
switch {
|
||||||
|
case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL):
|
||||||
|
createmode = CREATE_NEW
|
||||||
|
case mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC):
|
||||||
|
createmode = CREATE_ALWAYS
|
||||||
|
case mode&O_CREAT == O_CREAT:
|
||||||
|
createmode = OPEN_ALWAYS
|
||||||
|
case mode&O_TRUNC == O_TRUNC:
|
||||||
|
createmode = TRUNCATE_EXISTING
|
||||||
|
default:
|
||||||
|
createmode = OPEN_EXISTING
|
||||||
|
}
|
||||||
|
h, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0)
|
||||||
|
return h, e
|
||||||
|
}
|
||||||
|
|
||||||
|
func Read(fd Handle, p []byte) (n int, err error) {
|
||||||
|
var done uint32
|
||||||
|
e := ReadFile(fd, p, &done, nil)
|
||||||
|
if e != nil {
|
||||||
|
if e == ERROR_BROKEN_PIPE {
|
||||||
|
// NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
return 0, e
|
||||||
|
}
|
||||||
|
if raceenabled {
|
||||||
|
if done > 0 {
|
||||||
|
raceWriteRange(unsafe.Pointer(&p[0]), int(done))
|
||||||
|
}
|
||||||
|
raceAcquire(unsafe.Pointer(&ioSync))
|
||||||
|
}
|
||||||
|
return int(done), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Write(fd Handle, p []byte) (n int, err error) {
|
||||||
|
if raceenabled {
|
||||||
|
raceReleaseMerge(unsafe.Pointer(&ioSync))
|
||||||
|
}
|
||||||
|
var done uint32
|
||||||
|
e := WriteFile(fd, p, &done, nil)
|
||||||
|
if e != nil {
|
||||||
|
return 0, e
|
||||||
|
}
|
||||||
|
if raceenabled && done > 0 {
|
||||||
|
raceReadRange(unsafe.Pointer(&p[0]), int(done))
|
||||||
|
}
|
||||||
|
return int(done), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var ioSync int64
|
||||||
|
|
||||||
|
func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) {
|
||||||
|
var w uint32
|
||||||
|
switch whence {
|
||||||
|
case 0:
|
||||||
|
w = FILE_BEGIN
|
||||||
|
case 1:
|
||||||
|
w = FILE_CURRENT
|
||||||
|
case 2:
|
||||||
|
w = FILE_END
|
||||||
|
}
|
||||||
|
hi := int32(offset >> 32)
|
||||||
|
lo := int32(offset)
|
||||||
|
// use GetFileType to check pipe, pipe can't do seek
|
||||||
|
ft, _ := GetFileType(fd)
|
||||||
|
if ft == FILE_TYPE_PIPE {
|
||||||
|
return 0, syscall.EPIPE
|
||||||
|
}
|
||||||
|
rlo, e := SetFilePointer(fd, lo, &hi, w)
|
||||||
|
if e != nil {
|
||||||
|
return 0, e
|
||||||
|
}
|
||||||
|
return int64(hi)<<32 + int64(rlo), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Close(fd Handle) (err error) {
|
||||||
|
return CloseHandle(fd)
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
Stdin = getStdHandle(STD_INPUT_HANDLE)
|
||||||
|
Stdout = getStdHandle(STD_OUTPUT_HANDLE)
|
||||||
|
Stderr = getStdHandle(STD_ERROR_HANDLE)
|
||||||
|
)
|
||||||
|
|
||||||
|
func getStdHandle(stdhandle uint32) (fd Handle) {
|
||||||
|
r, _ := GetStdHandle(stdhandle)
|
||||||
|
CloseOnExec(r)
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
const ImplementsGetwd = true
|
||||||
|
|
||||||
|
func Getwd() (wd string, err error) {
|
||||||
|
b := make([]uint16, 300)
|
||||||
|
n, e := GetCurrentDirectory(uint32(len(b)), &b[0])
|
||||||
|
if e != nil {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
return string(utf16.Decode(b[0:n])), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Chdir(path string) (err error) {
|
||||||
|
pathp, err := UTF16PtrFromString(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return SetCurrentDirectory(pathp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Mkdir(path string, mode uint32) (err error) {
|
||||||
|
pathp, err := UTF16PtrFromString(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return CreateDirectory(pathp, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Rmdir(path string) (err error) {
|
||||||
|
pathp, err := UTF16PtrFromString(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return RemoveDirectory(pathp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Unlink(path string) (err error) {
|
||||||
|
pathp, err := UTF16PtrFromString(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return DeleteFile(pathp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Rename(oldpath, newpath string) (err error) {
|
||||||
|
from, err := UTF16PtrFromString(oldpath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
to, err := UTF16PtrFromString(newpath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ComputerName() (name string, err error) {
|
||||||
|
var n uint32 = MAX_COMPUTERNAME_LENGTH + 1
|
||||||
|
b := make([]uint16, n)
|
||||||
|
e := GetComputerName(&b[0], &n)
|
||||||
|
if e != nil {
|
||||||
|
return "", e
|
||||||
|
}
|
||||||
|
return string(utf16.Decode(b[0:n])), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Ftruncate(fd Handle, length int64) (err error) {
|
||||||
|
curoffset, e := Seek(fd, 0, 1)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
defer Seek(fd, curoffset, 0)
|
||||||
|
_, e = Seek(fd, length, 0)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
e = SetEndOfFile(fd)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Gettimeofday(tv *Timeval) (err error) {
|
||||||
|
var ft Filetime
|
||||||
|
GetSystemTimeAsFileTime(&ft)
|
||||||
|
*tv = NsecToTimeval(ft.Nanoseconds())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Pipe(p []Handle) (err error) {
|
||||||
|
if len(p) != 2 {
|
||||||
|
return syscall.EINVAL
|
||||||
|
}
|
||||||
|
var r, w Handle
|
||||||
|
e := CreatePipe(&r, &w, makeInheritSa(), 0)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
p[0] = r
|
||||||
|
p[1] = w
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Utimes(path string, tv []Timeval) (err error) {
|
||||||
|
if len(tv) != 2 {
|
||||||
|
return syscall.EINVAL
|
||||||
|
}
|
||||||
|
pathp, e := UTF16PtrFromString(path)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
h, e := CreateFile(pathp,
|
||||||
|
FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
|
||||||
|
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
defer Close(h)
|
||||||
|
a := NsecToFiletime(tv[0].Nanoseconds())
|
||||||
|
w := NsecToFiletime(tv[1].Nanoseconds())
|
||||||
|
return SetFileTime(h, nil, &a, &w)
|
||||||
|
}
|
||||||
|
|
||||||
|
func UtimesNano(path string, ts []Timespec) (err error) {
|
||||||
|
if len(ts) != 2 {
|
||||||
|
return syscall.EINVAL
|
||||||
|
}
|
||||||
|
pathp, e := UTF16PtrFromString(path)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
h, e := CreateFile(pathp,
|
||||||
|
FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
|
||||||
|
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
defer Close(h)
|
||||||
|
a := NsecToFiletime(TimespecToNsec(ts[0]))
|
||||||
|
w := NsecToFiletime(TimespecToNsec(ts[1]))
|
||||||
|
return SetFileTime(h, nil, &a, &w)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fsync(fd Handle) (err error) {
|
||||||
|
return FlushFileBuffers(fd)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Chmod(path string, mode uint32) (err error) {
|
||||||
|
if mode == 0 {
|
||||||
|
return syscall.EINVAL
|
||||||
|
}
|
||||||
|
p, e := UTF16PtrFromString(path)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
attrs, e := GetFileAttributes(p)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
if mode&S_IWRITE != 0 {
|
||||||
|
attrs &^= FILE_ATTRIBUTE_READONLY
|
||||||
|
} else {
|
||||||
|
attrs |= FILE_ATTRIBUTE_READONLY
|
||||||
|
}
|
||||||
|
return SetFileAttributes(p, attrs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadCancelIoEx() error {
|
||||||
|
return procCancelIoEx.Find()
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadSetFileCompletionNotificationModes() error {
|
||||||
|
return procSetFileCompletionNotificationModes.Find()
|
||||||
|
}
|
||||||
|
|
||||||
|
// net api calls
|
||||||
|
|
||||||
|
const socket_error = uintptr(^uint32(0))
|
||||||
|
|
||||||
|
//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
|
||||||
|
//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
|
||||||
|
//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
|
||||||
|
//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
|
||||||
|
//sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt
|
||||||
|
//sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt
|
||||||
|
//sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind
|
||||||
|
//sys connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect
|
||||||
|
//sys getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname
|
||||||
|
//sys getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername
|
||||||
|
//sys listen(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen
|
||||||
|
//sys shutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown
|
||||||
|
//sys Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket
|
||||||
|
//sys AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx
|
||||||
|
//sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs
|
||||||
|
//sys WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv
|
||||||
|
//sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend
|
||||||
|
//sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom
|
||||||
|
//sys WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo
|
||||||
|
//sys GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname
|
||||||
|
//sys GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname
|
||||||
|
//sys Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs
|
||||||
|
//sys GetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname
|
||||||
|
//sys DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W
|
||||||
|
//sys DnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree
|
||||||
|
//sys DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W
|
||||||
|
//sys GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW
|
||||||
|
//sys FreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW
|
||||||
|
//sys GetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry
|
||||||
|
//sys GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo
|
||||||
|
//sys SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes
|
||||||
|
//sys WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW
|
||||||
|
//sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses
|
||||||
|
//sys GetACP() (acp uint32) = kernel32.GetACP
|
||||||
|
//sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar
|
||||||
|
|
||||||
|
// For testing: clients can set this flag to force
|
||||||
|
// creation of IPv6 sockets to return EAFNOSUPPORT.
|
||||||
|
var SocketDisableIPv6 bool
|
||||||
|
|
||||||
|
type RawSockaddrInet4 struct {
|
||||||
|
Family uint16
|
||||||
|
Port uint16
|
||||||
|
Addr [4]byte /* in_addr */
|
||||||
|
Zero [8]uint8
|
||||||
|
}
|
||||||
|
|
||||||
|
type RawSockaddrInet6 struct {
|
||||||
|
Family uint16
|
||||||
|
Port uint16
|
||||||
|
Flowinfo uint32
|
||||||
|
Addr [16]byte /* in6_addr */
|
||||||
|
Scope_id uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type RawSockaddr struct {
|
||||||
|
Family uint16
|
||||||
|
Data [14]int8
|
||||||
|
}
|
||||||
|
|
||||||
|
type RawSockaddrAny struct {
|
||||||
|
Addr RawSockaddr
|
||||||
|
Pad [96]int8
|
||||||
|
}
|
||||||
|
|
||||||
|
type Sockaddr interface {
|
||||||
|
sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs
|
||||||
|
}
|
||||||
|
|
||||||
|
type SockaddrInet4 struct {
|
||||||
|
Port int
|
||||||
|
Addr [4]byte
|
||||||
|
raw RawSockaddrInet4
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) {
|
||||||
|
if sa.Port < 0 || sa.Port > 0xFFFF {
|
||||||
|
return nil, 0, syscall.EINVAL
|
||||||
|
}
|
||||||
|
sa.raw.Family = AF_INET
|
||||||
|
p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
|
||||||
|
p[0] = byte(sa.Port >> 8)
|
||||||
|
p[1] = byte(sa.Port)
|
||||||
|
for i := 0; i < len(sa.Addr); i++ {
|
||||||
|
sa.raw.Addr[i] = sa.Addr[i]
|
||||||
|
}
|
||||||
|
return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type SockaddrInet6 struct {
|
||||||
|
Port int
|
||||||
|
ZoneId uint32
|
||||||
|
Addr [16]byte
|
||||||
|
raw RawSockaddrInet6
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) {
|
||||||
|
if sa.Port < 0 || sa.Port > 0xFFFF {
|
||||||
|
return nil, 0, syscall.EINVAL
|
||||||
|
}
|
||||||
|
sa.raw.Family = AF_INET6
|
||||||
|
p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
|
||||||
|
p[0] = byte(sa.Port >> 8)
|
||||||
|
p[1] = byte(sa.Port)
|
||||||
|
sa.raw.Scope_id = sa.ZoneId
|
||||||
|
for i := 0; i < len(sa.Addr); i++ {
|
||||||
|
sa.raw.Addr[i] = sa.Addr[i]
|
||||||
|
}
|
||||||
|
return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type SockaddrUnix struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) {
|
||||||
|
// TODO(brainman): implement SockaddrUnix.sockaddr()
|
||||||
|
return nil, 0, syscall.EWINDOWS
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) {
|
||||||
|
switch rsa.Addr.Family {
|
||||||
|
case AF_UNIX:
|
||||||
|
return nil, syscall.EWINDOWS
|
||||||
|
|
||||||
|
case AF_INET:
|
||||||
|
pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
|
||||||
|
sa := new(SockaddrInet4)
|
||||||
|
p := (*[2]byte)(unsafe.Pointer(&pp.Port))
|
||||||
|
sa.Port = int(p[0])<<8 + int(p[1])
|
||||||
|
for i := 0; i < len(sa.Addr); i++ {
|
||||||
|
sa.Addr[i] = pp.Addr[i]
|
||||||
|
}
|
||||||
|
return sa, nil
|
||||||
|
|
||||||
|
case AF_INET6:
|
||||||
|
pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
|
||||||
|
sa := new(SockaddrInet6)
|
||||||
|
p := (*[2]byte)(unsafe.Pointer(&pp.Port))
|
||||||
|
sa.Port = int(p[0])<<8 + int(p[1])
|
||||||
|
sa.ZoneId = pp.Scope_id
|
||||||
|
for i := 0; i < len(sa.Addr); i++ {
|
||||||
|
sa.Addr[i] = pp.Addr[i]
|
||||||
|
}
|
||||||
|
return sa, nil
|
||||||
|
}
|
||||||
|
return nil, syscall.EAFNOSUPPORT
|
||||||
|
}
|
||||||
|
|
||||||
|
func Socket(domain, typ, proto int) (fd Handle, err error) {
|
||||||
|
if domain == AF_INET6 && SocketDisableIPv6 {
|
||||||
|
return InvalidHandle, syscall.EAFNOSUPPORT
|
||||||
|
}
|
||||||
|
return socket(int32(domain), int32(typ), int32(proto))
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetsockoptInt(fd Handle, level, opt int, value int) (err error) {
|
||||||
|
v := int32(value)
|
||||||
|
return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func Bind(fd Handle, sa Sockaddr) (err error) {
|
||||||
|
ptr, n, err := sa.sockaddr()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return bind(fd, ptr, n)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Connect(fd Handle, sa Sockaddr) (err error) {
|
||||||
|
ptr, n, err := sa.sockaddr()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return connect(fd, ptr, n)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Getsockname(fd Handle) (sa Sockaddr, err error) {
|
||||||
|
var rsa RawSockaddrAny
|
||||||
|
l := int32(unsafe.Sizeof(rsa))
|
||||||
|
if err = getsockname(fd, &rsa, &l); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return rsa.Sockaddr()
|
||||||
|
}
|
||||||
|
|
||||||
|
func Getpeername(fd Handle) (sa Sockaddr, err error) {
|
||||||
|
var rsa RawSockaddrAny
|
||||||
|
l := int32(unsafe.Sizeof(rsa))
|
||||||
|
if err = getpeername(fd, &rsa, &l); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return rsa.Sockaddr()
|
||||||
|
}
|
||||||
|
|
||||||
|
func Listen(s Handle, n int) (err error) {
|
||||||
|
return listen(s, int32(n))
|
||||||
|
}
|
||||||
|
|
||||||
|
func Shutdown(fd Handle, how int) (err error) {
|
||||||
|
return shutdown(fd, int32(how))
|
||||||
|
}
|
||||||
|
|
||||||
|
func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) {
|
||||||
|
rsa, l, err := to.sockaddr()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine)
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadGetAddrInfo() error {
|
||||||
|
return procGetAddrInfoW.Find()
|
||||||
|
}
|
||||||
|
|
||||||
|
var connectExFunc struct {
|
||||||
|
once sync.Once
|
||||||
|
addr uintptr
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadConnectEx() error {
|
||||||
|
connectExFunc.once.Do(func() {
|
||||||
|
var s Handle
|
||||||
|
s, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
|
||||||
|
if connectExFunc.err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer CloseHandle(s)
|
||||||
|
var n uint32
|
||||||
|
connectExFunc.err = WSAIoctl(s,
|
||||||
|
SIO_GET_EXTENSION_FUNCTION_POINTER,
|
||||||
|
(*byte)(unsafe.Pointer(&WSAID_CONNECTEX)),
|
||||||
|
uint32(unsafe.Sizeof(WSAID_CONNECTEX)),
|
||||||
|
(*byte)(unsafe.Pointer(&connectExFunc.addr)),
|
||||||
|
uint32(unsafe.Sizeof(connectExFunc.addr)),
|
||||||
|
&n, nil, 0)
|
||||||
|
})
|
||||||
|
return connectExFunc.err
|
||||||
|
}
|
||||||
|
|
||||||
|
func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
if e1 != 0 {
|
||||||
|
err = error(e1)
|
||||||
|
} else {
|
||||||
|
err = syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error {
|
||||||
|
err := LoadConnectEx()
|
||||||
|
if err != nil {
|
||||||
|
return errorspkg.New("failed to find ConnectEx: " + err.Error())
|
||||||
|
}
|
||||||
|
ptr, n, err := sa.sockaddr()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invented structures to support what package os expects.
|
||||||
|
type Rusage struct {
|
||||||
|
CreationTime Filetime
|
||||||
|
ExitTime Filetime
|
||||||
|
KernelTime Filetime
|
||||||
|
UserTime Filetime
|
||||||
|
}
|
||||||
|
|
||||||
|
type WaitStatus struct {
|
||||||
|
ExitCode uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w WaitStatus) Exited() bool { return true }
|
||||||
|
|
||||||
|
func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) }
|
||||||
|
|
||||||
|
func (w WaitStatus) Signal() Signal { return -1 }
|
||||||
|
|
||||||
|
func (w WaitStatus) CoreDump() bool { return false }
|
||||||
|
|
||||||
|
func (w WaitStatus) Stopped() bool { return false }
|
||||||
|
|
||||||
|
func (w WaitStatus) Continued() bool { return false }
|
||||||
|
|
||||||
|
func (w WaitStatus) StopSignal() Signal { return -1 }
|
||||||
|
|
||||||
|
func (w WaitStatus) Signaled() bool { return false }
|
||||||
|
|
||||||
|
func (w WaitStatus) TrapCause() int { return -1 }
|
||||||
|
|
||||||
|
// Timespec is an invented structure on Windows, but here for
|
||||||
|
// consistency with the corresponding package for other operating systems.
|
||||||
|
type Timespec struct {
|
||||||
|
Sec int64
|
||||||
|
Nsec int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
|
||||||
|
|
||||||
|
func NsecToTimespec(nsec int64) (ts Timespec) {
|
||||||
|
ts.Sec = nsec / 1e9
|
||||||
|
ts.Nsec = nsec % 1e9
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(brainman): fix all needed for net
|
||||||
|
|
||||||
|
func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS }
|
||||||
|
func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) {
|
||||||
|
return 0, nil, syscall.EWINDOWS
|
||||||
|
}
|
||||||
|
func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { return syscall.EWINDOWS }
|
||||||
|
func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS }
|
||||||
|
|
||||||
|
// The Linger struct is wrong but we only noticed after Go 1.
|
||||||
|
// sysLinger is the real system call structure.
|
||||||
|
|
||||||
|
// BUG(brainman): The definition of Linger is not appropriate for direct use
|
||||||
|
// with Setsockopt and Getsockopt.
|
||||||
|
// Use SetsockoptLinger instead.
|
||||||
|
|
||||||
|
type Linger struct {
|
||||||
|
Onoff int32
|
||||||
|
Linger int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type sysLinger struct {
|
||||||
|
Onoff uint16
|
||||||
|
Linger uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
type IPMreq struct {
|
||||||
|
Multiaddr [4]byte /* in_addr */
|
||||||
|
Interface [4]byte /* in_addr */
|
||||||
|
}
|
||||||
|
|
||||||
|
type IPv6Mreq struct {
|
||||||
|
Multiaddr [16]byte /* in6_addr */
|
||||||
|
Interface uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetsockoptInt(fd Handle, level, opt int) (int, error) { return -1, syscall.EWINDOWS }
|
||||||
|
|
||||||
|
func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) {
|
||||||
|
sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)}
|
||||||
|
return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) {
|
||||||
|
return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4)
|
||||||
|
}
|
||||||
|
func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) {
|
||||||
|
return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
|
||||||
|
}
|
||||||
|
func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) {
|
||||||
|
return syscall.EWINDOWS
|
||||||
|
}
|
||||||
|
|
||||||
|
func Getpid() (pid int) { return int(getCurrentProcessId()) }
|
||||||
|
|
||||||
|
func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) {
|
||||||
|
// NOTE(rsc): The Win32finddata struct is wrong for the system call:
|
||||||
|
// the two paths are each one uint16 short. Use the correct struct,
|
||||||
|
// a win32finddata1, and then copy the results out.
|
||||||
|
// There is no loss of expressivity here, because the final
|
||||||
|
// uint16, if it is used, is supposed to be a NUL, and Go doesn't need that.
|
||||||
|
// For Go 1.1, we might avoid the allocation of win32finddata1 here
|
||||||
|
// by adding a final Bug [2]uint16 field to the struct and then
|
||||||
|
// adjusting the fields in the result directly.
|
||||||
|
var data1 win32finddata1
|
||||||
|
handle, err = findFirstFile1(name, &data1)
|
||||||
|
if err == nil {
|
||||||
|
copyFindData(data, &data1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindNextFile(handle Handle, data *Win32finddata) (err error) {
|
||||||
|
var data1 win32finddata1
|
||||||
|
err = findNextFile1(handle, &data1)
|
||||||
|
if err == nil {
|
||||||
|
copyFindData(data, &data1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func getProcessEntry(pid int) (*ProcessEntry32, error) {
|
||||||
|
snapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer CloseHandle(snapshot)
|
||||||
|
var procEntry ProcessEntry32
|
||||||
|
procEntry.Size = uint32(unsafe.Sizeof(procEntry))
|
||||||
|
if err = Process32First(snapshot, &procEntry); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
if procEntry.ProcessID == uint32(pid) {
|
||||||
|
return &procEntry, nil
|
||||||
|
}
|
||||||
|
err = Process32Next(snapshot, &procEntry)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Getppid() (ppid int) {
|
||||||
|
pe, err := getProcessEntry(Getpid())
|
||||||
|
if err != nil {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
return int(pe.ParentProcessID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(brainman): fix all needed for os
|
||||||
|
func Fchdir(fd Handle) (err error) { return syscall.EWINDOWS }
|
||||||
|
func Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS }
|
||||||
|
func Symlink(path, link string) (err error) { return syscall.EWINDOWS }
|
||||||
|
|
||||||
|
func Fchmod(fd Handle, mode uint32) (err error) { return syscall.EWINDOWS }
|
||||||
|
func Chown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS }
|
||||||
|
func Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS }
|
||||||
|
func Fchown(fd Handle, uid int, gid int) (err error) { return syscall.EWINDOWS }
|
||||||
|
|
||||||
|
func Getuid() (uid int) { return -1 }
|
||||||
|
func Geteuid() (euid int) { return -1 }
|
||||||
|
func Getgid() (gid int) { return -1 }
|
||||||
|
func Getegid() (egid int) { return -1 }
|
||||||
|
func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS }
|
||||||
|
|
||||||
|
type Signal int
|
||||||
|
|
||||||
|
func (s Signal) Signal() {}
|
||||||
|
|
||||||
|
func (s Signal) String() string {
|
||||||
|
if 0 <= s && int(s) < len(signals) {
|
||||||
|
str := signals[s]
|
||||||
|
if str != "" {
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "signal " + itoa(int(s))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadCreateSymbolicLink() error {
|
||||||
|
return procCreateSymbolicLinkW.Find()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Readlink returns the destination of the named symbolic link.
|
||||||
|
func Readlink(path string, buf []byte) (n int, err error) {
|
||||||
|
fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING,
|
||||||
|
FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0)
|
||||||
|
if err != nil {
|
||||||
|
return -1, err
|
||||||
|
}
|
||||||
|
defer CloseHandle(fd)
|
||||||
|
|
||||||
|
rdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE)
|
||||||
|
var bytesReturned uint32
|
||||||
|
err = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil)
|
||||||
|
if err != nil {
|
||||||
|
return -1, err
|
||||||
|
}
|
||||||
|
|
||||||
|
rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0]))
|
||||||
|
var s string
|
||||||
|
switch rdb.ReparseTag {
|
||||||
|
case IO_REPARSE_TAG_SYMLINK:
|
||||||
|
data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
|
||||||
|
p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
|
||||||
|
s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])
|
||||||
|
case IO_REPARSE_TAG_MOUNT_POINT:
|
||||||
|
data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
|
||||||
|
p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
|
||||||
|
s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])
|
||||||
|
default:
|
||||||
|
// the path is not a symlink or junction but another type of reparse
|
||||||
|
// point
|
||||||
|
return -1, syscall.ENOENT
|
||||||
|
}
|
||||||
|
n = copy(buf, []byte(s))
|
||||||
|
|
||||||
|
return n, nil
|
||||||
|
}
|
2289
vendor/golang.org/x/sys/windows/zsyscall_windows.go
generated
vendored
Normal file
2289
vendor/golang.org/x/sys/windows/zsyscall_windows.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1242
vendor/golang.org/x/sys/windows/ztypes_windows.go
generated
vendored
Normal file
1242
vendor/golang.org/x/sys/windows/ztypes_windows.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
22
vendor/golang.org/x/sys/windows/ztypes_windows_386.go
generated
vendored
Normal file
22
vendor/golang.org/x/sys/windows/ztypes_windows_386.go
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
type WSAData struct {
|
||||||
|
Version uint16
|
||||||
|
HighVersion uint16
|
||||||
|
Description [WSADESCRIPTION_LEN + 1]byte
|
||||||
|
SystemStatus [WSASYS_STATUS_LEN + 1]byte
|
||||||
|
MaxSockets uint16
|
||||||
|
MaxUdpDg uint16
|
||||||
|
VendorInfo *byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type Servent struct {
|
||||||
|
Name *byte
|
||||||
|
Aliases **byte
|
||||||
|
Port uint16
|
||||||
|
Proto *byte
|
||||||
|
}
|
22
vendor/golang.org/x/sys/windows/ztypes_windows_amd64.go
generated
vendored
Normal file
22
vendor/golang.org/x/sys/windows/ztypes_windows_amd64.go
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
package windows
|
||||||
|
|
||||||
|
type WSAData struct {
|
||||||
|
Version uint16
|
||||||
|
HighVersion uint16
|
||||||
|
MaxSockets uint16
|
||||||
|
MaxUdpDg uint16
|
||||||
|
VendorInfo *byte
|
||||||
|
Description [WSADESCRIPTION_LEN + 1]byte
|
||||||
|
SystemStatus [WSASYS_STATUS_LEN + 1]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type Servent struct {
|
||||||
|
Name *byte
|
||||||
|
Aliases **byte
|
||||||
|
Proto *byte
|
||||||
|
Port uint16
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user