From 699f84681309c9e757f89ed8c573de6c66bc3936 Mon Sep 17 00:00:00 2001 From: Justin Cormack Date: Tue, 9 May 2017 15:24:22 +0100 Subject: [PATCH] Further fixes for FreeBSD This fixes a lot more issues for FreeBSD, including update for continuity vendor. Signed-off-by: Justin Cormack --- archive/tar_unix.go | 2 +- fs/diff_unix.go | 4 +- fs/du_unix.go | 2 +- vendor.conf | 2 +- .../containerd/continuity/devices_freebsd.go | 15 ++++++ .../containerd/continuity/devices_unix.go | 2 +- .../containerd/continuity/driver_unix.go | 2 +- .../containerd/continuity/hardlinks_unix.go | 4 +- .../containerd/continuity/manifest.go | 2 +- .../containerd/continuity/resource.go | 2 +- .../containerd/continuity/resource_unix.go | 2 +- .../continuity/sysx/chmod_freebsd.go | 17 ++++++ .../continuity/sysx/chmod_freebsd_amd64.go | 25 +++++++++ .../continuity/sysx/nodata_linux.go | 7 +++ .../containerd/continuity/sysx/nodata_unix.go | 9 ++++ .../continuity/sysx/xattr_freebsd.go | 53 +++++++++++++++++++ 16 files changed, 138 insertions(+), 12 deletions(-) create mode 100644 vendor/github.com/containerd/continuity/devices_freebsd.go create mode 100644 vendor/github.com/containerd/continuity/sysx/chmod_freebsd.go create mode 100644 vendor/github.com/containerd/continuity/sysx/chmod_freebsd_amd64.go create mode 100644 vendor/github.com/containerd/continuity/sysx/nodata_linux.go create mode 100644 vendor/github.com/containerd/continuity/sysx/nodata_unix.go create mode 100644 vendor/github.com/containerd/continuity/sysx/xattr_freebsd.go diff --git a/archive/tar_unix.go b/archive/tar_unix.go index 107d1a572..619510549 100644 --- a/archive/tar_unix.go +++ b/archive/tar_unix.go @@ -122,7 +122,7 @@ func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo) error { func getxattr(path, attr string) ([]byte, error) { b, err := sysx.LGetxattr(path, attr) - if err == syscall.ENOTSUP || err == syscall.ENODATA { + if err == syscall.ENOTSUP || err == sysx.ENODATA { return nil, nil } return b, err diff --git a/fs/diff_unix.go b/fs/diff_unix.go index 14add16cd..36a0f3fde 100644 --- a/fs/diff_unix.go +++ b/fs/diff_unix.go @@ -83,11 +83,11 @@ func compareSysStat(s1, s2 interface{}) (bool, error) { func compareCapabilities(p1, p2 string) (bool, error) { c1, err := sysx.LGetxattr(p1, "security.capability") - if err != nil && err != syscall.ENODATA { + if err != nil && err != sysx.ENODATA { return false, errors.Wrapf(err, "failed to get xattr for %s", p1) } c2, err := sysx.LGetxattr(p2, "security.capability") - if err != nil && err != syscall.ENODATA { + if err != nil && err != sysx.ENODATA { return false, errors.Wrapf(err, "failed to get xattr for %s", p2) } return bytes.Equal(c1, c2), nil diff --git a/fs/du_unix.go b/fs/du_unix.go index 3178df5ca..3d0af20e6 100644 --- a/fs/du_unix.go +++ b/fs/du_unix.go @@ -27,7 +27,7 @@ func diskUsage(roots ...string) (Usage, error) { } stat := fi.Sys().(*syscall.Stat_t) - inodes[inode{dev: uint64(stat.Dev), ino: stat.Ino}] = struct{}{} + inodes[inode{dev: uint64(stat.Dev), ino: uint64(stat.Ino)}] = struct{}{} size += fi.Size() return nil }); err != nil { diff --git a/vendor.conf b/vendor.conf index 1ac5628f9..f3417bc4f 100644 --- a/vendor.conf +++ b/vendor.conf @@ -29,7 +29,7 @@ github.com/nightlyone/lockfile 1d49c987357a327b5b03aa84cbddd582c328615d github.com/opencontainers/go-digest 21dfd564fd89c944783d00d069f33e3e7123c448 golang.org/x/sys f3918c30c5c2cb527c0b071a27c35120a6c0719a github.com/opencontainers/image-spec a431dbcf6a74fca2e0e040b819a836dbe3fb23ca -github.com/containerd/continuity 6414d06cab9e2fe082ea29ff42aab627e740d00c +github.com/containerd/continuity f4ad4294c92f596c9241947c416d1297f9faf3ea golang.org/x/sync 450f422ab23cf9881c94e2db30cac0eb1b7cf80c github.com/BurntSushi/toml v0.2.0-21-g9906417 github.com/grpc-ecosystem/go-grpc-prometheus 6b7015e65d366bf3f19b2b2a000a831940f0f7e0 diff --git a/vendor/github.com/containerd/continuity/devices_freebsd.go b/vendor/github.com/containerd/continuity/devices_freebsd.go new file mode 100644 index 000000000..2b32fc5da --- /dev/null +++ b/vendor/github.com/containerd/continuity/devices_freebsd.go @@ -0,0 +1,15 @@ +package continuity + +// from /usr/include/sys/types.h + +func getmajor(dev uint32) uint64 { + return (uint64(dev) >> 24) & 0xff +} + +func getminor(dev uint32) uint64 { + return uint64(dev) & 0xffffff +} + +func makedev(major int, minor int) int { + return ((major << 24) | minor) +} diff --git a/vendor/github.com/containerd/continuity/devices_unix.go b/vendor/github.com/containerd/continuity/devices_unix.go index 2b07d554a..bb77962ef 100644 --- a/vendor/github.com/containerd/continuity/devices_unix.go +++ b/vendor/github.com/containerd/continuity/devices_unix.go @@ -1,4 +1,4 @@ -// +build linux darwin +// +build linux darwin freebsd package continuity diff --git a/vendor/github.com/containerd/continuity/driver_unix.go b/vendor/github.com/containerd/continuity/driver_unix.go index 7336a872f..85d54eba1 100644 --- a/vendor/github.com/containerd/continuity/driver_unix.go +++ b/vendor/github.com/containerd/continuity/driver_unix.go @@ -1,4 +1,4 @@ -// +build linux darwin +// +build linux darwin freebsd package continuity diff --git a/vendor/github.com/containerd/continuity/hardlinks_unix.go b/vendor/github.com/containerd/continuity/hardlinks_unix.go index 3a3c36eb5..0759b525e 100644 --- a/vendor/github.com/containerd/continuity/hardlinks_unix.go +++ b/vendor/github.com/containerd/continuity/hardlinks_unix.go @@ -1,4 +1,4 @@ -// +build linux darwin +// +build linux darwin freebsd package continuity @@ -32,5 +32,5 @@ func newHardlinkKey(fi os.FileInfo) (hardlinkKey, error) { return hardlinkKey{}, errNotAHardLink } - return hardlinkKey{dev: uint64(sys.Dev), inode: sys.Ino}, nil + return hardlinkKey{dev: uint64(sys.Dev), inode: uint64(sys.Ino)}, nil } diff --git a/vendor/github.com/containerd/continuity/manifest.go b/vendor/github.com/containerd/continuity/manifest.go index 36e9210d3..20706f359 100644 --- a/vendor/github.com/containerd/continuity/manifest.go +++ b/vendor/github.com/containerd/continuity/manifest.go @@ -7,8 +7,8 @@ import ( "os" "sort" - "github.com/golang/protobuf/proto" pb "github.com/containerd/continuity/proto" + "github.com/golang/protobuf/proto" ) // Manifest provides the contents of a manifest. Users of this struct should diff --git a/vendor/github.com/containerd/continuity/resource.go b/vendor/github.com/containerd/continuity/resource.go index 60abe1986..840316136 100644 --- a/vendor/github.com/containerd/continuity/resource.go +++ b/vendor/github.com/containerd/continuity/resource.go @@ -7,8 +7,8 @@ import ( "reflect" "sort" - "github.com/opencontainers/go-digest" pb "github.com/containerd/continuity/proto" + "github.com/opencontainers/go-digest" ) // TODO(stevvooe): A record based model, somewhat sketched out at the bottom diff --git a/vendor/github.com/containerd/continuity/resource_unix.go b/vendor/github.com/containerd/continuity/resource_unix.go index f159a2793..2d6a58b82 100644 --- a/vendor/github.com/containerd/continuity/resource_unix.go +++ b/vendor/github.com/containerd/continuity/resource_unix.go @@ -1,4 +1,4 @@ -// +build linux darwin +// +build linux darwin freebsd package continuity diff --git a/vendor/github.com/containerd/continuity/sysx/chmod_freebsd.go b/vendor/github.com/containerd/continuity/sysx/chmod_freebsd.go new file mode 100644 index 000000000..b64a708be --- /dev/null +++ b/vendor/github.com/containerd/continuity/sysx/chmod_freebsd.go @@ -0,0 +1,17 @@ +package sysx + +const ( + // AtSymlinkNoFollow defined from AT_SYMLINK_NOFOLLOW in + AtSymlinkNofollow = 0x200 +) + +const ( + + // SYS_FCHMODAT defined from golang.org/sys/unix + SYS_FCHMODAT = 490 +) + +// These functions will be generated by generate.sh +// $ GOOS=freebsd GOARCH=amd64 ./generate.sh chmod + +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) diff --git a/vendor/github.com/containerd/continuity/sysx/chmod_freebsd_amd64.go b/vendor/github.com/containerd/continuity/sysx/chmod_freebsd_amd64.go new file mode 100644 index 000000000..5a271abb1 --- /dev/null +++ b/vendor/github.com/containerd/continuity/sysx/chmod_freebsd_amd64.go @@ -0,0 +1,25 @@ +// mksyscall.pl chmod_freebsd.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +package sysx + +import ( + "syscall" + "unsafe" +) + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall.Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/containerd/continuity/sysx/nodata_linux.go b/vendor/github.com/containerd/continuity/sysx/nodata_linux.go new file mode 100644 index 000000000..fc47ddb8d --- /dev/null +++ b/vendor/github.com/containerd/continuity/sysx/nodata_linux.go @@ -0,0 +1,7 @@ +package sysx + +import ( + "syscall" +) + +const ENODATA = syscall.ENODATA diff --git a/vendor/github.com/containerd/continuity/sysx/nodata_unix.go b/vendor/github.com/containerd/continuity/sysx/nodata_unix.go new file mode 100644 index 000000000..7e6851209 --- /dev/null +++ b/vendor/github.com/containerd/continuity/sysx/nodata_unix.go @@ -0,0 +1,9 @@ +// +build darwin freebsd + +package sysx + +import ( + "syscall" +) + +const ENODATA = syscall.ENOATTR diff --git a/vendor/github.com/containerd/continuity/sysx/xattr_freebsd.go b/vendor/github.com/containerd/continuity/sysx/xattr_freebsd.go new file mode 100644 index 000000000..80dba49aa --- /dev/null +++ b/vendor/github.com/containerd/continuity/sysx/xattr_freebsd.go @@ -0,0 +1,53 @@ +package sysx + +import ( + "errors" +) + +// Initial stub version for FreeBSD. FreeBSD has a different +// syscall API from Darwin and Linux for extended attributes; +// it is also not widely used. It is not exposed at all by the +// Go syscall package, so we need to implement directly eventually. + +var unsupported error = errors.New("extended attributes unsupported on FreeBSD") + +// Listxattr calls syscall listxattr and reads all content +// and returns a string array +func Listxattr(path string) ([]string, error) { + return []string{}, nil +} + +// Removexattr calls syscall removexattr +func Removexattr(path string, attr string) (err error) { + return unsupported +} + +// Setxattr calls syscall setxattr +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + return unsupported +} + +// Getxattr calls syscall getxattr +func Getxattr(path, attr string) ([]byte, error) { + return []byte{}, nil +} + +// LListxattr lists xattrs, not following symlinks +func LListxattr(path string) ([]string, error) { + return []string{}, nil +} + +// LRemovexattr removes an xattr, not following symlinks +func LRemovexattr(path string, attr string) (err error) { + return unsupported +} + +// LSetxattr sets an xattr, not following symlinks +func LSetxattr(path string, attr string, data []byte, flags int) (err error) { + return unsupported +} + +// LGetxattr gets an xattr, not following symlinks +func LGetxattr(path, attr string) ([]byte, error) { + return []byte{}, nil +}