From 2a96605138bc72d1e1bf824ae71c44f24717841d Mon Sep 17 00:00:00 2001 From: Araragi Hokuto Date: Sun, 22 Mar 2020 06:50:52 +0800 Subject: [PATCH] Fix build failure on illumos Previously v2ray can not be built on illumos due to following reasons: 1. missing build tags in transport/internet/sockopt_other.go 2. many definitions in syscall does not exist on illumos This commit addresses these problems by adding missing build tags, and updates those missing syscall deps on illumos to use x/sys/unix. --- common/buf/readv_posix.go | 1 + common/buf/readv_unix.go | 36 +++++++++++++++++++++ transport/internet/domainsocket/listener.go | 7 ++-- transport/internet/sockopt_other.go | 2 +- 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 common/buf/readv_unix.go diff --git a/common/buf/readv_posix.go b/common/buf/readv_posix.go index 3cf9ad144..9fbee7945 100644 --- a/common/buf/readv_posix.go +++ b/common/buf/readv_posix.go @@ -1,5 +1,6 @@ // +build !windows // +build !wasm +// +build !illumos package buf diff --git a/common/buf/readv_unix.go b/common/buf/readv_unix.go new file mode 100644 index 000000000..8c8bb9700 --- /dev/null +++ b/common/buf/readv_unix.go @@ -0,0 +1,36 @@ +// +build illumos + +package buf + +import "golang.org/x/sys/unix" + +type unixReader struct { + iovs [][]byte +} + +func (r *unixReader) Init(bs []*Buffer) { + iovs := r.iovs + if iovs == nil { + iovs = make([][]byte, 0, len(bs)) + } + for _, b := range bs { + iovs = append(iovs, b.v) + } + r.iovs = iovs +} + +func (r *unixReader) Read(fd uintptr) int32 { + n, e := unix.Readv(int(fd), r.iovs) + if e != nil { + return -1 + } + return int32(n) +} + +func (r *unixReader) Clear() { + r.iovs = r.iovs[:0] +} + +func newMultiReader() multiReader { + return &unixReader{} +} diff --git a/transport/internet/domainsocket/listener.go b/transport/internet/domainsocket/listener.go index 99457e1fe..587fecd9e 100644 --- a/transport/internet/domainsocket/listener.go +++ b/transport/internet/domainsocket/listener.go @@ -9,8 +9,9 @@ import ( gotls "crypto/tls" "os" "strings" - "syscall" + "golang.org/x/sys/unix" + "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" @@ -104,7 +105,7 @@ func (fl *fileLocker) Acquire() error { if err != nil { return err } - if err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX); err != nil { + if err := unix.Flock(int(f.Fd()), unix.LOCK_EX); err != nil { f.Close() return newError("failed to lock file: ", fl.path).Base(err) } @@ -113,7 +114,7 @@ func (fl *fileLocker) Acquire() error { } func (fl *fileLocker) Release() { - if err := syscall.Flock(int(fl.file.Fd()), syscall.LOCK_UN); err != nil { + if err := unix.Flock(int(fl.file.Fd()), unix.LOCK_UN); err != nil { newError("failed to unlock file: ", fl.path).Base(err).WriteToLog() } if err := fl.file.Close(); err != nil { diff --git a/transport/internet/sockopt_other.go b/transport/internet/sockopt_other.go index 31d39deb5..962c981d8 100644 --- a/transport/internet/sockopt_other.go +++ b/transport/internet/sockopt_other.go @@ -1,4 +1,4 @@ -// +build js dragonfly netbsd openbsd +// +build js dragonfly netbsd openbsd solaris package internet