copyFileInfo: do not err on chown if uid/gid match
Chown would normally be a no-op if uid/gid match, however some filesystems (e.g. NFS) will return EPERM. Signed-off-by: Brian Goff <cpuguy83@gmail.com>
This commit is contained in:
parent
90553efdef
commit
e0f8fb47bb
@ -14,8 +14,21 @@ import (
|
|||||||
func copyFileInfo(fi os.FileInfo, name string) error {
|
func copyFileInfo(fi os.FileInfo, name string) error {
|
||||||
st := fi.Sys().(*syscall.Stat_t)
|
st := fi.Sys().(*syscall.Stat_t)
|
||||||
if err := os.Lchown(name, int(st.Uid), int(st.Gid)); err != nil {
|
if err := os.Lchown(name, int(st.Uid), int(st.Gid)); err != nil {
|
||||||
|
if os.IsPermission(err) {
|
||||||
|
// Normally if uid/gid are the same this would be a no-op, but some
|
||||||
|
// filesystems may still return EPERM... for instance NFS does this.
|
||||||
|
// In such a case, this is not an error.
|
||||||
|
if dstStat, err2 := os.Lstat(name); err2 == nil {
|
||||||
|
st2 := dstStat.Sys().(*syscall.Stat_t)
|
||||||
|
if st.Uid == st2.Uid && st.Gid == st2.Gid {
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to chown %s", name)
|
return errors.Wrapf(err, "failed to chown %s", name)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (fi.Mode() & os.ModeSymlink) != os.ModeSymlink {
|
if (fi.Mode() & os.ModeSymlink) != os.ModeSymlink {
|
||||||
if err := os.Chmod(name, fi.Mode()); err != nil {
|
if err := os.Chmod(name, fi.Mode()); err != nil {
|
||||||
|
@ -16,8 +16,21 @@ import (
|
|||||||
func copyFileInfo(fi os.FileInfo, name string) error {
|
func copyFileInfo(fi os.FileInfo, name string) error {
|
||||||
st := fi.Sys().(*syscall.Stat_t)
|
st := fi.Sys().(*syscall.Stat_t)
|
||||||
if err := os.Lchown(name, int(st.Uid), int(st.Gid)); err != nil {
|
if err := os.Lchown(name, int(st.Uid), int(st.Gid)); err != nil {
|
||||||
|
if os.IsPermission(err) {
|
||||||
|
// Normally if uid/gid are the same this would be a no-op, but some
|
||||||
|
// filesystems may still return EPERM... for instance NFS does this.
|
||||||
|
// In such a case, this is not an error.
|
||||||
|
if dstStat, err2 := os.Lstat(name); err2 == nil {
|
||||||
|
st2 := dstStat.Sys().(*syscall.Stat_t)
|
||||||
|
if st.Uid == st2.Uid && st.Gid == st2.Gid {
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to chown %s", name)
|
return errors.Wrapf(err, "failed to chown %s", name)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (fi.Mode() & os.ModeSymlink) != os.ModeSymlink {
|
if (fi.Mode() & os.ModeSymlink) != os.ModeSymlink {
|
||||||
if err := os.Chmod(name, fi.Mode()); err != nil {
|
if err := os.Chmod(name, fi.Mode()); err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user