From b4592091881e91d9f1fc62564b7842c89044f1df Mon Sep 17 00:00:00 2001 From: Samuel Karp Date: Sun, 1 Nov 2020 19:12:33 -0800 Subject: [PATCH] Compile for FreeBSD Signed-off-by: Samuel Karp --- archive/tar_freebsd.go | 36 +++++++++++++++++++++++++++++ archive/tar_mostunix.go | 36 +++++++++++++++++++++++++++++ archive/tar_unix.go | 7 ++---- cmd/containerd-shim/shim_freebsd.go | 5 ++-- 4 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 archive/tar_freebsd.go create mode 100644 archive/tar_mostunix.go diff --git a/archive/tar_freebsd.go b/archive/tar_freebsd.go new file mode 100644 index 000000000..d26bb2734 --- /dev/null +++ b/archive/tar_freebsd.go @@ -0,0 +1,36 @@ +// +build freebsd + +/* + Copyright The containerd Authors. + + 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 + + http://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. +*/ + +package archive + +import "golang.org/x/sys/unix" + +// mknod wraps unix.Mknod. FreeBSD's unix.Mknod signature is different from +// other Unix and Unix-like operating systems. +func mknod(path string, mode uint32, dev uint64) error { + return unix.Mknod(path, mode, dev) +} + +// lsetxattrCreate wraps unix.Lsetxattr with FreeBSD-specific flags and errors +func lsetxattrCreate(link string, attr string, data []byte) error { + err := unix.Lsetxattr(link, attr, data, 0) + if err == unix.ENOTSUP|| err == unix.EEXIST { + return nil + } + return err +} diff --git a/archive/tar_mostunix.go b/archive/tar_mostunix.go new file mode 100644 index 000000000..bd3f98a4a --- /dev/null +++ b/archive/tar_mostunix.go @@ -0,0 +1,36 @@ +// +build !windows,!freebsd + +/* + Copyright The containerd Authors. + + 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 + + http://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. +*/ + +package archive + +import "golang.org/x/sys/unix" + +// mknod wraps Unix.Mknod and casts dev to int +func mknod(path string, mode uint32, dev uint64) error { + return unix.Mknod(path, mode, int(dev)) +} + +// lsetxattrCreate wraps unix.Lsetxattr, passes the unix.XATTR_CREATE flag on +// supported operating systems,and ignores appropriate errors +func lsetxattrCreate(link string, attr string, data []byte) error { + err := unix.Lsetxattr(link, attr, data, unix.XATTR_CREATE) + if err == unix.ENOTSUP || err == unix.ENODATA || err == unix.EEXIST { + return nil + } + return err +} diff --git a/archive/tar_unix.go b/archive/tar_unix.go index 6e89d2fdb..a187db800 100644 --- a/archive/tar_unix.go +++ b/archive/tar_unix.go @@ -108,7 +108,7 @@ func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error { mode |= unix.S_IFIFO } - return unix.Mknod(path, mode, int(unix.Mkdev(uint32(hdr.Devmajor), uint32(hdr.Devminor)))) + return mknod(path, mode, unix.Mkdev(uint32(hdr.Devmajor), uint32(hdr.Devminor))) } func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo) error { @@ -196,10 +196,7 @@ func copyUpXAttrs(dst, src string) error { } return errors.Wrapf(err, "failed to get xattr %q on %s", xattr, src) } - if err := unix.Lsetxattr(dst, xattr, data, unix.XATTR_CREATE); err != nil { - if err == unix.ENOTSUP || err == unix.ENODATA || err == unix.EEXIST { - continue - } + if err := lsetxattrCreate(dst, xattr, data); err != nil { return errors.Wrapf(err, "failed to set xattr %q on %s", xattr, dst) } } diff --git a/cmd/containerd-shim/shim_freebsd.go b/cmd/containerd-shim/shim_freebsd.go index 92988aa26..1fd88546a 100644 --- a/cmd/containerd-shim/shim_freebsd.go +++ b/cmd/containerd-shim/shim_freebsd.go @@ -22,7 +22,8 @@ import ( "os" "os/signal" - "github.com/containerd/containerd/runtime/v1/shim" + "github.com/containerd/containerd/sys/reaper" + runc "github.com/containerd/go-runc" "github.com/containerd/ttrpc" ) @@ -34,7 +35,7 @@ func setupSignals() (chan os.Signal, error) { signal.Notify(signals) // make sure runc is setup to use the monitor // for waiting on processes - runc.Monitor = shim.Default + runc.Monitor = reaper.Default return signals, nil }