hard-3.sh 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/bin/sh
  2. # Ensure that using 'cp --preserve=link' to copy hard-linked arguments
  3. # onto existing destinations works, even when one of the link operations fails.
  4. # Copyright (C) 2003-2018 Free Software Foundation, Inc.
  5. # This program is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation, either version 3 of the License, or
  8. # (at your option) any later version.
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU General Public License for more details.
  13. # You should have received a copy of the GNU General Public License
  14. # along with this program. If not, see <https://www.gnu.org/licenses/>.
  15. # This bug was fixed in coreutils-4.5.9.
  16. # To exercise this bug is non-trivial:
  17. # Set-up requires at least three hard-linked files. In copying them,
  18. # while preserving links, the initial copy must succeed, the attempt
  19. # to create the second file via 'link' must fail, and the final 'link'
  20. # (to create the third) must succeed. Before the corresponding fix,
  21. # the first and third destination files would not be linked.
  22. #
  23. # Note that this is nominally a test of 'cp', yet it is in the tests/mv
  24. # directory, because it requires use of the --preserve=link option that
  25. # mv enables by default.
  26. . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
  27. print_ver_ cp
  28. skip_if_root_
  29. mkdir -p x dst/x || framework_failure_
  30. touch dst/x/b || framework_failure_
  31. chmod a-w dst/x
  32. touch a || framework_failure_
  33. ln a x/b || framework_failure_
  34. ln a c || framework_failure_
  35. # ======================================
  36. # This must fail -- because x/b cannot be unlinked.
  37. cp --preserve=link --parents a x/b c dst 2> /dev/null && fail=1
  38. # Source files must remain.
  39. test -f a || fail=1
  40. test -f x/b || fail=1
  41. test -f c || fail=1
  42. cd dst
  43. # Three destination files must exist.
  44. test -f a || fail=1
  45. test -f x/b || fail=1
  46. test -f c || fail=1
  47. # The i-node numbers of a and c must be the same.
  48. ia=$(ls -i a) || fail=1; set x $ia; ia=$2
  49. ic=$(ls -i c) || fail=1; set x $ic; ic=$2
  50. test "$ia" = "$ic" || fail=1
  51. # The i-node number of x/b must be different.
  52. ib=$(ls -i x/b) || fail=1; set x $ib; ib=$2
  53. test "$ia" = "$ib" && fail=1
  54. Exit $fail