summaryrefslogtreecommitdiff
path: root/software/vendor/github.com
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2024-05-30 16:00:32 +0200
committerxengineering <me@xengineering.eu>2024-05-30 16:00:32 +0200
commitb8ef4d11fe0d00ce0884ccf982675845b20c3ce9 (patch)
tree3beb57ff849ed74569ce325225bc819791c25a6a /software/vendor/github.com
parenteab833271eeaa8d54991c11eccec9445f662a191 (diff)
downloadiot-core-b8ef4d11fe0d00ce0884ccf982675845b20c3ce9.tar
iot-core-b8ef4d11fe0d00ce0884ccf982675845b20c3ce9.tar.zst
iot-core-b8ef4d11fe0d00ce0884ccf982675845b20c3ce9.zip
software: Implement serial port detection
Diffstat (limited to 'software/vendor/github.com')
-rw-r--r--software/vendor/github.com/creack/goselect/.gitignore29
-rw-r--r--software/vendor/github.com/creack/goselect/Dockerfile5
-rw-r--r--software/vendor/github.com/creack/goselect/LICENSE22
-rw-r--r--software/vendor/github.com/creack/goselect/README.md137
-rw-r--r--software/vendor/github.com/creack/goselect/fdset.go33
-rw-r--r--software/vendor/github.com/creack/goselect/fdset_32.go10
-rw-r--r--software/vendor/github.com/creack/goselect/fdset_64.go11
-rw-r--r--software/vendor/github.com/creack/goselect/fdset_doc.go93
-rw-r--r--software/vendor/github.com/creack/goselect/fdset_freebsd.go33
-rw-r--r--software/vendor/github.com/creack/goselect/fdset_unsupported.go20
-rw-r--r--software/vendor/github.com/creack/goselect/fdset_windows.go57
-rw-r--r--software/vendor/github.com/creack/goselect/select.go28
-rw-r--r--software/vendor/github.com/creack/goselect/select_linux.go10
-rw-r--r--software/vendor/github.com/creack/goselect/select_other.go9
-rw-r--r--software/vendor/github.com/creack/goselect/select_unsupported.go16
-rw-r--r--software/vendor/github.com/creack/goselect/select_windows.go13
-rw-r--r--software/vendor/github.com/creack/goselect/test_crosscompile.sh112
-rw-r--r--software/vendor/github.com/creack/goselect/zselect_windows.go39
18 files changed, 677 insertions, 0 deletions
diff --git a/software/vendor/github.com/creack/goselect/.gitignore b/software/vendor/github.com/creack/goselect/.gitignore
new file mode 100644
index 0000000..6f4dace
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/.gitignore
@@ -0,0 +1,29 @@
+# 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
+
+go-select*
+goselect*
+example-*
+example/example
diff --git a/software/vendor/github.com/creack/goselect/Dockerfile b/software/vendor/github.com/creack/goselect/Dockerfile
new file mode 100644
index 0000000..d03b5a9
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/Dockerfile
@@ -0,0 +1,5 @@
+FROM google/golang:stable
+MAINTAINER Guillaume J. Charmes <guillaume@charmes.net>
+CMD /tmp/a.out
+ADD . /src
+RUN cd /src && go build -o /tmp/a.out
diff --git a/software/vendor/github.com/creack/goselect/LICENSE b/software/vendor/github.com/creack/goselect/LICENSE
new file mode 100644
index 0000000..95c600a
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Guillaume J. Charmes
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/software/vendor/github.com/creack/goselect/README.md b/software/vendor/github.com/creack/goselect/README.md
new file mode 100644
index 0000000..0c79d64
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/README.md
@@ -0,0 +1,137 @@
+# go-select
+
+select(2) implementation in Go
+
+## Supported platforms
+
+| | 386 | amd64 | arm | arm64 | mips | mipsle | mips64 | mips64le | ppc64le | s390x |
+|---------------|-----|-------|-----|-------|------|--------|--------|----------|---------|-------|
+| **linux** | yes | yes | yes | yes | yes | yes | yes | yes | yes | yes |
+| **darwin** | yes | yes | ?? | ?? | n/a | n/a | n/a | n/a | n/a | n/a |
+| **freebsd** | yes | yes | yes | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
+| **openbsd** | yes | yes | yes | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
+| **netbsd** | yes | yes | yes | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
+| **dragonfly** | n/a | yes | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
+| **solaris** | n/a | no | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
+| **plan9** | no | no | no | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
+| **windows** | yes | yes | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
+| **android** | ?? | ?? | ?? | ?? | n/a | n/a | n/a | n/a | n/a | n/a |
+
+*n/a: platform not supported by Go
+*??: not tested
+
+Go on `plan9` and `solaris` do not implement `syscall.Select` nor `syscall.SYS_SELECT`.
+
+## Cross compile test
+
+Note that this only tests the compilation, not the functionality.
+
+```sh
+$> ./test_crosscompile.sh > /dev/null | sort
+[OK] android/386
+[OK] android/amd64
+[OK] android/arm
+[OK] android/arm64
+[OK] darwin/386
+[OK] darwin/amd64
+[OK] darwin/arm
+[OK] darwin/arm64
+[OK] dragonfly/amd64
+[OK] freebsd/386
+[OK] freebsd/amd64
+[OK] freebsd/arm
+[OK] linux/386
+[OK] linux/amd64
+[OK] linux/arm
+[OK] linux/arm64
+[OK] linux/mips
+[OK] linux/mips64
+[OK] linux/mips64le
+[OK] linux/mipsle
+[OK] linux/ppc64le
+[OK] linux/s390x
+[OK] netbsd/386
+[OK] netbsd/amd64
+[OK] netbsd/arm
+[OK] openbsd/386
+[OK] openbsd/amd64
+[OK] openbsd/arm
+[OK] plan9/386
+[OK] plan9/amd64
+[OK] plan9/arm
+[OK] solaris/amd64
+[OK] windows/386
+[OK] windows/amd64
+[OK] windows/arm
+
+# Expected failures.
+[KO] android/mips
+[KO] android/mips64
+[KO] android/mips64le
+[KO] android/mipsle
+[KO] android/ppc64le
+[KO] android/s390x
+[KO] darwin/mips
+[KO] darwin/mips64
+[KO] darwin/mips64le
+[KO] darwin/mipsle
+[KO] darwin/ppc64le
+[KO] darwin/s390x
+[KO] dragonfly/386
+[KO] dragonfly/arm
+[KO] dragonfly/arm64
+[KO] dragonfly/mips
+[KO] dragonfly/mips64
+[KO] dragonfly/mips64le
+[KO] dragonfly/mipsle
+[KO] dragonfly/ppc64le
+[KO] dragonfly/s390x
+[KO] freebsd/arm64
+[KO] freebsd/mips
+[KO] freebsd/mips64
+[KO] freebsd/mips64le
+[KO] freebsd/mipsle
+[KO] freebsd/ppc64le
+[KO] freebsd/s390x
+[KO] netbsd/arm64
+[KO] netbsd/mips
+[KO] netbsd/mips64
+[KO] netbsd/mips64le
+[KO] netbsd/mipsle
+[KO] netbsd/ppc64le
+[KO] netbsd/s390x
+[KO] openbsd/arm64
+[KO] openbsd/mips
+[KO] openbsd/mips64
+[KO] openbsd/mips64le
+[KO] openbsd/mipsle
+[KO] openbsd/ppc64le
+[KO] openbsd/s390x
+[KO] plan9/arm64
+[KO] plan9/mips
+[KO] plan9/mips64
+[KO] plan9/mips64le
+[KO] plan9/mipsle
+[KO] plan9/ppc64le
+[KO] plan9/s390x
+[KO] solaris/386
+[KO] solaris/arm
+[KO] solaris/arm64
+[KO] solaris/mips
+[KO] solaris/mips64
+[KO] solaris/mips64le
+[KO] solaris/mipsle
+[KO] solaris/ppc64le
+[KO] solaris/s390x
+[KO] windows/arm64
+[KO] windows/mips
+[KO] windows/mips64
+[KO] windows/mips64le
+[KO] windows/mipsle
+[KO] windows/ppc64le
+[KO] windows/s390x
+```
+
+## License
+
+Released under the [MIT license](LICENSE).
diff --git a/software/vendor/github.com/creack/goselect/fdset.go b/software/vendor/github.com/creack/goselect/fdset.go
new file mode 100644
index 0000000..2ff3f6c
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/fdset.go
@@ -0,0 +1,33 @@
+// +build !freebsd,!windows,!plan9
+
+package goselect
+
+import "syscall"
+
+const FD_SETSIZE = syscall.FD_SETSIZE
+
+// FDSet wraps syscall.FdSet with convenience methods
+type FDSet syscall.FdSet
+
+// Set adds the fd to the set
+func (fds *FDSet) Set(fd uintptr) {
+ fds.Bits[fd/NFDBITS] |= (1 << (fd % NFDBITS))
+}
+
+// Clear remove the fd from the set
+func (fds *FDSet) Clear(fd uintptr) {
+ fds.Bits[fd/NFDBITS] &^= (1 << (fd % NFDBITS))
+}
+
+// IsSet check if the given fd is set
+func (fds *FDSet) IsSet(fd uintptr) bool {
+ return fds.Bits[fd/NFDBITS]&(1<<(fd%NFDBITS)) != 0
+}
+
+// Keep a null set to avoid reinstatiation
+var nullFdSet = &FDSet{}
+
+// Zero empties the Set
+func (fds *FDSet) Zero() {
+ copy(fds.Bits[:], (nullFdSet).Bits[:])
+}
diff --git a/software/vendor/github.com/creack/goselect/fdset_32.go b/software/vendor/github.com/creack/goselect/fdset_32.go
new file mode 100644
index 0000000..7aac3bc
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/fdset_32.go
@@ -0,0 +1,10 @@
+// +build darwin openbsd netbsd 386 arm mips mipsle riscv32
+
+package goselect
+
+// darwin, netbsd and openbsd uses uint32 on both amd64 and 386
+
+const (
+ // NFDBITS is the amount of bits per mask
+ NFDBITS = 4 * 8
+)
diff --git a/software/vendor/github.com/creack/goselect/fdset_64.go b/software/vendor/github.com/creack/goselect/fdset_64.go
new file mode 100644
index 0000000..142023b
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/fdset_64.go
@@ -0,0 +1,11 @@
+// +build !darwin,!netbsd,!openbsd
+// +build amd64 arm64 ppc64le mips64 mips64le s390x riscv64
+
+package goselect
+
+// darwin, netbsd and openbsd uses uint32 on both amd64 and 386
+
+const (
+ // NFDBITS is the amount of bits per mask
+ NFDBITS = 8 * 8
+)
diff --git a/software/vendor/github.com/creack/goselect/fdset_doc.go b/software/vendor/github.com/creack/goselect/fdset_doc.go
new file mode 100644
index 0000000..d9f15a1
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/fdset_doc.go
@@ -0,0 +1,93 @@
+package goselect
+
+/**
+From: XCode's MacOSX10.10.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/sys/select.h
+--
+// darwin/amd64 / 386
+sizeof(__int32_t) == 4
+--
+
+typedef __int32_t __fd_mask;
+
+#define FD_SETSIZE 1024
+#define __NFDBITS (sizeof(__fd_mask) * 8)
+#define __howmany(x, y) ((((x) % (y)) == 0) ? ((x) / (y)) : (((x) / (y)) + 1))
+
+typedef struct fd_set {
+ __fd_mask fds_bits[__howmany(__FD_SETSIZE, __NFDBITS)];
+} fd_set;
+
+#define __FD_MASK(n) ((__fd_mask)1 << ((n) % __NFDBITS))
+#define FD_SET(n, p) ((p)->fds_bits[(n)/__NFDBITS] |= __FD_MASK(n))
+#define FD_CLR(n, p) ((p)->fds_bits[(n)/__NFDBITS] &= ~__FD_MASK(n))
+#define FD_ISSET(n, p) (((p)->fds_bits[(n)/__NFDBITS] & __FD_MASK(n)) != 0)
+*/
+
+/**
+From: /usr/include/i386-linux-gnu/sys/select.h
+--
+// linux/i686
+sizeof(long int) == 4
+--
+
+typedef long int __fd_mask;
+
+#define FD_SETSIZE 1024
+#define __NFDBITS (sizeof(__fd_mask) * 8)
+
+
+typedef struct fd_set {
+ __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
+} fd_set;
+
+#define __FD_MASK(n) ((__fd_mask)1 << ((n) % __NFDBITS))
+#define FD_SET(n, p) ((p)->fds_bits[(n)/__NFDBITS] |= __FD_MASK(n))
+#define FD_CLR(n, p) ((p)->fds_bits[(n)/__NFDBITS] &= ~__FD_MASK(n))
+#define FD_ISSET(n, p) (((p)->fds_bits[(n)/__NFDBITS] & __FD_MASK(n)) != 0)
+*/
+
+/**
+From: /usr/include/x86_64-linux-gnu/sys/select.h
+--
+// linux/amd64
+sizeof(long int) == 8
+--
+
+typedef long int __fd_mask;
+
+#define FD_SETSIZE 1024
+#define __NFDBITS (sizeof(__fd_mask) * 8)
+
+
+typedef struct fd_set {
+ __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
+} fd_set;
+
+#define __FD_MASK(n) ((__fd_mask)1 << ((n) % __NFDBITS))
+#define FD_SET(n, p) ((p)->fds_bits[(n)/__NFDBITS] |= __FD_MASK(n))
+#define FD_CLR(n, p) ((p)->fds_bits[(n)/__NFDBITS] &= ~__FD_MASK(n))
+#define FD_ISSET(n, p) (((p)->fds_bits[(n)/__NFDBITS] & __FD_MASK(n)) != 0)
+*/
+
+/**
+From: /usr/include/sys/select.h
+--
+// freebsd/amd64
+sizeof(unsigned long) == 8
+--
+
+typedef unsigned long __fd_mask;
+
+#define FD_SETSIZE 1024U
+#define __NFDBITS (sizeof(__fd_mask) * 8)
+#define _howmany(x, y) (((x) + ((y) - 1)) / (y))
+
+typedef struct fd_set {
+ __fd_mask fds_bits[_howmany(FD_SETSIZE, __NFDBITS)];
+} fd_set;
+
+#define __FD_MASK(n) ((__fd_mask)1 << ((n) % __NFDBITS))
+#define FD_SET(n, p) ((p)->fds_bits[(n)/__NFDBITS] |= __FD_MASK(n))
+#define FD_CLR(n, p) ((p)->fds_bits[(n)/__NFDBITS] &= ~__FD_MASK(n))
+#define FD_ISSET(n, p) (((p)->fds_bits[(n)/__NFDBITS] & __FD_MASK(n)) != 0)
+*/
diff --git a/software/vendor/github.com/creack/goselect/fdset_freebsd.go b/software/vendor/github.com/creack/goselect/fdset_freebsd.go
new file mode 100644
index 0000000..03f7b91
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/fdset_freebsd.go
@@ -0,0 +1,33 @@
+// +build freebsd
+
+package goselect
+
+import "syscall"
+
+const FD_SETSIZE = syscall.FD_SETSIZE
+
+// FDSet wraps syscall.FdSet with convenience methods
+type FDSet syscall.FdSet
+
+// Set adds the fd to the set
+func (fds *FDSet) Set(fd uintptr) {
+ fds.X__fds_bits[fd/NFDBITS] |= (1 << (fd % NFDBITS))
+}
+
+// Clear remove the fd from the set
+func (fds *FDSet) Clear(fd uintptr) {
+ fds.X__fds_bits[fd/NFDBITS] &^= (1 << (fd % NFDBITS))
+}
+
+// IsSet check if the given fd is set
+func (fds *FDSet) IsSet(fd uintptr) bool {
+ return fds.X__fds_bits[fd/NFDBITS]&(1<<(fd%NFDBITS)) != 0
+}
+
+// Keep a null set to avoid reinstatiation
+var nullFdSet = &FDSet{}
+
+// Zero empties the Set
+func (fds *FDSet) Zero() {
+ copy(fds.X__fds_bits[:], (nullFdSet).X__fds_bits[:])
+}
diff --git a/software/vendor/github.com/creack/goselect/fdset_unsupported.go b/software/vendor/github.com/creack/goselect/fdset_unsupported.go
new file mode 100644
index 0000000..cbd8d58
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/fdset_unsupported.go
@@ -0,0 +1,20 @@
+// +build plan9
+
+package goselect
+
+const FD_SETSIZE = 0
+
+// FDSet wraps syscall.FdSet with convenience methods
+type FDSet struct{}
+
+// Set adds the fd to the set
+func (fds *FDSet) Set(fd uintptr) {}
+
+// Clear remove the fd from the set
+func (fds *FDSet) Clear(fd uintptr) {}
+
+// IsSet check if the given fd is set
+func (fds *FDSet) IsSet(fd uintptr) bool { return false }
+
+// Zero empties the Set
+func (fds *FDSet) Zero() {}
diff --git a/software/vendor/github.com/creack/goselect/fdset_windows.go b/software/vendor/github.com/creack/goselect/fdset_windows.go
new file mode 100644
index 0000000..ee34919
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/fdset_windows.go
@@ -0,0 +1,57 @@
+// +build windows
+
+package goselect
+
+import "syscall"
+
+const FD_SETSIZE = 64
+
+// FDSet extracted from mingw libs source code
+type FDSet struct {
+ fd_count uint
+ fd_array [FD_SETSIZE]uintptr
+}
+
+// Set adds the fd to the set
+func (fds *FDSet) Set(fd uintptr) {
+ var i uint
+ for i = 0; i < fds.fd_count; i++ {
+ if fds.fd_array[i] == fd {
+ break
+ }
+ }
+ if i == fds.fd_count {
+ if fds.fd_count < FD_SETSIZE {
+ fds.fd_array[i] = fd
+ fds.fd_count++
+ }
+ }
+}
+
+// Clear remove the fd from the set
+func (fds *FDSet) Clear(fd uintptr) {
+ var i uint
+ for i = 0; i < fds.fd_count; i++ {
+ if fds.fd_array[i] == fd {
+ for i < fds.fd_count-1 {
+ fds.fd_array[i] = fds.fd_array[i+1]
+ i++
+ }
+ fds.fd_count--
+ break
+ }
+ }
+}
+
+// IsSet check if the given fd is set
+func (fds *FDSet) IsSet(fd uintptr) bool {
+ if isset, err := __WSAFDIsSet(syscall.Handle(fd), fds); err == nil && isset != 0 {
+ return true
+ }
+ return false
+}
+
+// Zero empties the Set
+func (fds *FDSet) Zero() {
+ fds.fd_count = 0
+}
diff --git a/software/vendor/github.com/creack/goselect/select.go b/software/vendor/github.com/creack/goselect/select.go
new file mode 100644
index 0000000..7f2875e
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/select.go
@@ -0,0 +1,28 @@
+package goselect
+
+import (
+ "syscall"
+ "time"
+)
+
+// Select wraps syscall.Select with Go types
+func Select(n int, r, w, e *FDSet, timeout time.Duration) error {
+ var timeval *syscall.Timeval
+ if timeout >= 0 {
+ t := syscall.NsecToTimeval(timeout.Nanoseconds())
+ timeval = &t
+ }
+
+ return sysSelect(n, r, w, e, timeval)
+}
+
+// RetrySelect wraps syscall.Select with Go types, and retries a number of times, with a given retryDelay.
+func RetrySelect(n int, r, w, e *FDSet, timeout time.Duration, retries int, retryDelay time.Duration) (err error) {
+ for i := 0; i < retries; i++ {
+ if err = Select(n, r, w, e, timeout); err != syscall.EINTR {
+ return err
+ }
+ time.Sleep(retryDelay)
+ }
+ return err
+}
diff --git a/software/vendor/github.com/creack/goselect/select_linux.go b/software/vendor/github.com/creack/goselect/select_linux.go
new file mode 100644
index 0000000..acd569e
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/select_linux.go
@@ -0,0 +1,10 @@
+// +build linux
+
+package goselect
+
+import "syscall"
+
+func sysSelect(n int, r, w, e *FDSet, timeout *syscall.Timeval) error {
+ _, err := syscall.Select(n, (*syscall.FdSet)(r), (*syscall.FdSet)(w), (*syscall.FdSet)(e), timeout)
+ return err
+}
diff --git a/software/vendor/github.com/creack/goselect/select_other.go b/software/vendor/github.com/creack/goselect/select_other.go
new file mode 100644
index 0000000..6c82081
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/select_other.go
@@ -0,0 +1,9 @@
+// +build !linux,!windows,!plan9,!solaris
+
+package goselect
+
+import "syscall"
+
+func sysSelect(n int, r, w, e *FDSet, timeout *syscall.Timeval) error {
+ return syscall.Select(n, (*syscall.FdSet)(r), (*syscall.FdSet)(w), (*syscall.FdSet)(e), timeout)
+}
diff --git a/software/vendor/github.com/creack/goselect/select_unsupported.go b/software/vendor/github.com/creack/goselect/select_unsupported.go
new file mode 100644
index 0000000..bea0ad9
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/select_unsupported.go
@@ -0,0 +1,16 @@
+// +build plan9 solaris
+
+package goselect
+
+import (
+ "fmt"
+ "runtime"
+ "syscall"
+)
+
+// ErrUnsupported .
+var ErrUnsupported = fmt.Errorf("Platofrm %s/%s unsupported", runtime.GOOS, runtime.GOARCH)
+
+func sysSelect(n int, r, w, e *FDSet, timeout *syscall.Timeval) error {
+ return ErrUnsupported
+}
diff --git a/software/vendor/github.com/creack/goselect/select_windows.go b/software/vendor/github.com/creack/goselect/select_windows.go
new file mode 100644
index 0000000..0fb70d5
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/select_windows.go
@@ -0,0 +1,13 @@
+// +build windows
+
+package goselect
+
+import "syscall"
+
+//sys _select(nfds int, readfds *FDSet, writefds *FDSet, exceptfds *FDSet, timeout *syscall.Timeval) (total int, err error) = ws2_32.select
+//sys __WSAFDIsSet(handle syscall.Handle, fdset *FDSet) (isset int, err error) = ws2_32.__WSAFDIsSet
+
+func sysSelect(n int, r, w, e *FDSet, timeout *syscall.Timeval) error {
+ _, err := _select(n, r, w, e, timeout)
+ return err
+}
diff --git a/software/vendor/github.com/creack/goselect/test_crosscompile.sh b/software/vendor/github.com/creack/goselect/test_crosscompile.sh
new file mode 100644
index 0000000..f8e1d29
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/test_crosscompile.sh
@@ -0,0 +1,112 @@
+rm -rf crosstest
+mkdir -p crosstest
+
+export GOOS=linux; export GOARCH=arm; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=linux; export GOARCH=arm64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=linux; export GOARCH=amd64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=linux; export GOARCH=386; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=linux; export GOARCH=mips; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=linux; export GOARCH=mipsle; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=linux; export GOARCH=mips64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=linux; export GOARCH=mips64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=linux; export GOARCH=ppc64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=linux; export GOARCH=s390x; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+
+export GOOS=darwin; export GOARCH=arm; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=darwin; export GOARCH=arm64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=darwin; export GOARCH=amd64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=darwin; export GOARCH=386; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=darwin; export GOARCH=mips; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=darwin; export GOARCH=mipsle; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=darwin; export GOARCH=mips64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=darwin; export GOARCH=mips64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=darwin; export GOARCH=ppc64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=darwin; export GOARCH=s390x; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+
+export GOOS=freebsd; export GOARCH=arm; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=freebsd; export GOARCH=arm64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=freebsd; export GOARCH=amd64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=freebsd; export GOARCH=386; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=freebsd; export GOARCH=mips; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=freebsd; export GOARCH=mipsle; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=freebsd; export GOARCH=mips64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=freebsd; export GOARCH=mips64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=freebsd; export GOARCH=ppc64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=freebsd; export GOARCH=s390x; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+
+export GOOS=openbsd; export GOARCH=arm; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=openbsd; export GOARCH=arm64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=openbsd; export GOARCH=amd64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=openbsd; export GOARCH=386; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=openbsd; export GOARCH=mips; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=openbsd; export GOARCH=mipsle; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=openbsd; export GOARCH=mips64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=openbsd; export GOARCH=mips64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=openbsd; export GOARCH=ppc64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=openbsd; export GOARCH=s390x; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+
+export GOOS=netbsd; export GOARCH=arm; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=netbsd; export GOARCH=arm64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=netbsd; export GOARCH=amd64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=netbsd; export GOARCH=386; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=netbsd; export GOARCH=mips; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=netbsd; export GOARCH=mipsle; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=netbsd; export GOARCH=mips64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=netbsd; export GOARCH=mips64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=netbsd; export GOARCH=ppc64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=netbsd; export GOARCH=s390x; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+
+export GOOS=dragonfly; export GOARCH=arm; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=dragonfly; export GOARCH=arm64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=dragonfly; export GOARCH=amd64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=dragonfly; export GOARCH=386; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=dragonfly; export GOARCH=mips; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=dragonfly; export GOARCH=mipsle; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=dragonfly; export GOARCH=mips64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=dragonfly; export GOARCH=mips64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=dragonfly; export GOARCH=ppc64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=dragonfly; export GOARCH=s390x; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+
+export GOOS=solaris; export GOARCH=arm; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=solaris; export GOARCH=arm64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=solaris; export GOARCH=amd64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=solaris; export GOARCH=386; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=solaris; export GOARCH=mips; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=solaris; export GOARCH=mipsle; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=solaris; export GOARCH=mips64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=solaris; export GOARCH=mips64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=solaris; export GOARCH=ppc64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=solaris; export GOARCH=s390x; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+
+export GOOS=plan9; export GOARCH=arm; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=plan9; export GOARCH=arm64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=plan9; export GOARCH=amd64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=plan9; export GOARCH=386; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=plan9; export GOARCH=mips; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=plan9; export GOARCH=mipsle; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=plan9; export GOARCH=mips64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=plan9; export GOARCH=mips64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=plan9; export GOARCH=ppc64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=plan9; export GOARCH=s390x; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+
+export GOOS=windows; export GOARCH=arm; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=windows; export GOARCH=arm64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=windows; export GOARCH=amd64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=windows; export GOARCH=386; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=windows; export GOARCH=mips; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=windows; export GOARCH=mipsle; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=windows; export GOARCH=mips64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=windows; export GOARCH=mips64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=windows; export GOARCH=ppc64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=windows; export GOARCH=s390x; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+
+export GOOS=android; export GOARCH=arm; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=android; export GOARCH=arm64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=android; export GOARCH=amd64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=android; export GOARCH=386; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=android; export GOARCH=mips; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=android; export GOARCH=mipsle; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=android; export GOARCH=mips64; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=android; export GOARCH=mips64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=android; export GOARCH=ppc64le; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
+export GOOS=android; export GOARCH=s390x; echo "$(go build -o crosstest/${GOOS}_${GOARCH} && echo '[OK]' || echo '[KO]') $GOOS/$GOARCH";
diff --git a/software/vendor/github.com/creack/goselect/zselect_windows.go b/software/vendor/github.com/creack/goselect/zselect_windows.go
new file mode 100644
index 0000000..e01502c
--- /dev/null
+++ b/software/vendor/github.com/creack/goselect/zselect_windows.go
@@ -0,0 +1,39 @@
+// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
+
+package goselect
+
+import "unsafe"
+import "syscall"
+
+var _ unsafe.Pointer
+
+var (
+ modws2_32 = syscall.NewLazyDLL("ws2_32.dll")
+
+ procselect = modws2_32.NewProc("select")
+ proc__WSAFDIsSet = modws2_32.NewProc("__WSAFDIsSet")
+)
+
+func _select(nfds int, readfds *FDSet, writefds *FDSet, exceptfds *FDSet, timeout *syscall.Timeval) (total int, err error) {
+ r0, _, e1 := syscall.Syscall6(procselect.Addr(), 5, uintptr(nfds), uintptr(unsafe.Pointer(readfds)), uintptr(unsafe.Pointer(writefds)), uintptr(unsafe.Pointer(exceptfds)), uintptr(unsafe.Pointer(timeout)), 0)
+ total = int(r0)
+ if total == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ }
+ }
+ return
+}
+
+func __WSAFDIsSet(handle syscall.Handle, fdset *FDSet) (isset int, err error) {
+ r0, _, e1 := syscall.Syscall(proc__WSAFDIsSet.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(fdset)), 0)
+ isset = int(r0)
+ if isset == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}