diff_containerd_linux.go 963 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package fsutil
  2. import (
  3. "bytes"
  4. "syscall"
  5. "github.com/containerd/continuity/sysx"
  6. "github.com/pkg/errors"
  7. )
  8. // compareSysStat returns whether the stats are equivalent,
  9. // whether the files are considered the same file, and
  10. // an error
  11. func compareSysStat(s1, s2 interface{}) (bool, error) {
  12. ls1, ok := s1.(*syscall.Stat_t)
  13. if !ok {
  14. return false, nil
  15. }
  16. ls2, ok := s2.(*syscall.Stat_t)
  17. if !ok {
  18. return false, nil
  19. }
  20. return ls1.Mode == ls2.Mode && ls1.Uid == ls2.Uid && ls1.Gid == ls2.Gid && ls1.Rdev == ls2.Rdev, nil
  21. }
  22. func compareCapabilities(p1, p2 string) (bool, error) {
  23. c1, err := sysx.LGetxattr(p1, "security.capability")
  24. if err != nil && err != syscall.ENODATA {
  25. return false, errors.Wrapf(err, "failed to get xattr for %s", p1)
  26. }
  27. c2, err := sysx.LGetxattr(p2, "security.capability")
  28. if err != nil && err != syscall.ENODATA {
  29. return false, errors.Wrapf(err, "failed to get xattr for %s", p2)
  30. }
  31. return bytes.Equal(c1, c2), nil
  32. }