diff options
| author | Jakob Unterwurzacher | 2017-06-18 15:40:38 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2017-06-18 15:43:22 +0200 | 
| commit | a4563e21ecaf7d2acce64212c96de69707d6f0bb (patch) | |
| tree | 433f9917fdd734f7a06ae854f0713847aaa79f0c | |
| parent | afc3a8252bacbe15a0815e348aea7071447d7d87 (diff) | |
main, syscallcompat: use Dup3 instead of Dup2
Dup2 is not implemented on linux/arm64.
Fixes https://github.com/rfjakob/gocryptfs/issues/121 .
Also adds cross-compilation to CI.
| -rw-r--r-- | .travis.yml | 1 | ||||
| -rwxr-xr-x | crossbuild.bash | 12 | ||||
| -rw-r--r-- | internal/syscallcompat/sys_darwin.go | 9 | ||||
| -rw-r--r-- | internal/syscallcompat/sys_linux.go | 6 | ||||
| -rw-r--r-- | mount.go | 7 | 
5 files changed, 32 insertions, 3 deletions
| diff --git a/.travis.yml b/.travis.yml index 6fcf3cb..7e36a41 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,7 @@ script:    - ./build.bash    - ./gocryptfs -speed    - ./test.bash +  - ./crossbuild.bash  # fuse on travis  sudo: required diff --git a/crossbuild.bash b/crossbuild.bash new file mode 100755 index 0000000..a33cb05 --- /dev/null +++ b/crossbuild.bash @@ -0,0 +1,12 @@ +#!/bin/bash -eux + +cd "$(dirname "$0")" + +B="go build -tags without_openssl" + +GOOS=linux  GOARCH=arm   $B +GOOS=linux  GOARCH=arm64 $B +GOOS=darwin GOARCH=amd64 $B + +# The cross-built binary is not useful on the compile host. +rm gocryptfs diff --git a/internal/syscallcompat/sys_darwin.go b/internal/syscallcompat/sys_darwin.go index e635034..e77cd98 100644 --- a/internal/syscallcompat/sys_darwin.go +++ b/internal/syscallcompat/sys_darwin.go @@ -1,6 +1,7 @@  package syscallcompat  import ( +	"log"  	"os"  	"path/filepath"  	"sync" @@ -122,3 +123,11 @@ func dirfdAbs(dirfd int, path string) (string, error) {  	}  	return filepath.Join(wd, path), nil  } + +// Dup3 is not available on Darwin, so we use Dup2 instead. +func Dup3(oldfd int, newfd int, flags int) (err error) { +	if flags != 0 { +		log.Panic("darwin does not support dup3 flags") +	} +	return syscall.Dup2(oldfd, newfd) +} diff --git a/internal/syscallcompat/sys_linux.go b/internal/syscallcompat/sys_linux.go index 93516f3..441f904 100644 --- a/internal/syscallcompat/sys_linux.go +++ b/internal/syscallcompat/sys_linux.go @@ -62,3 +62,9 @@ func Unlinkat(dirfd int, path string) error {  func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {  	return syscall.Mknodat(dirfd, path, mode, dev)  } + +// Dup3 wraps the Dup3 syscall. We want to use Dup3 rather than Dup2 because Dup2 +// is not implemented on arm64. +func Dup3(oldfd int, newfd int, flags int) (err error) { +	return syscall.Dup3(oldfd, newfd, flags) +} @@ -25,6 +25,7 @@ import (  	"github.com/rfjakob/gocryptfs/internal/fusefrontend"  	"github.com/rfjakob/gocryptfs/internal/fusefrontend_reverse"  	"github.com/rfjakob/gocryptfs/internal/readpassword" +	"github.com/rfjakob/gocryptfs/internal/syscallcompat"  	"github.com/rfjakob/gocryptfs/internal/tlog"  ) @@ -162,11 +163,11 @@ func redirectStdFds() {  		tlog.Warn.Printf("redirectStdFds: could not start logger: %v\n", err)  	}  	pr.Close() -	err = syscall.Dup2(int(pw.Fd()), 1) +	err = syscallcompat.Dup3(int(pw.Fd()), 1, 0)  	if err != nil {  		tlog.Warn.Printf("redirectStdFds: stdout dup error: %v\n", err)  	} -	syscall.Dup2(int(pw.Fd()), 2) +	syscallcompat.Dup3(int(pw.Fd()), 2, 0)  	if err != nil {  		tlog.Warn.Printf("redirectStdFds: stderr dup error: %v\n", err)  	} @@ -178,7 +179,7 @@ func redirectStdFds() {  		tlog.Warn.Printf("redirectStdFds: could not open /dev/null: %v\n", err)  		return  	} -	err = syscall.Dup2(int(nullFd.Fd()), 0) +	err = syscallcompat.Dup3(int(nullFd.Fd()), 0, 0)  	if err != nil {  		tlog.Warn.Printf("redirectStdFds: stdin dup error: %v\n", err)  	} | 
