1#!/bin/sh 2# Verify that cp -Pp preserves times even on symlinks. 3 4# Copyright (C) 2009-2023 Free Software Foundation, Inc. 5 6# This program is free software: you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation, either version 3 of the License, or 9# (at your option) any later version. 10 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15 16# You should have received a copy of the GNU General Public License 17# along with this program. If not, see <https://www.gnu.org/licenses/>. 18 19. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src 20print_ver_ cp 21 22grep '^#define HAVE_UTIMENSAT 1' "$CONFIG_HEADER" > /dev/null || 23grep '^#define HAVE_LUTIMES 1' "$CONFIG_HEADER" > /dev/null || 24 skip_ 'this system lacks the utimensat function' 25 26ln -s no-such dangle || framework_failure_ 27 28# If the current file system lacks sub-second resolution, sleep for 2s to 29# ensure that the times on the copy are different from those of the original. 30case $(stat --format=%y dangle) in 31 ??:??:??.000000000) sleep 2;; 32esac 33 34copy_timestamp_() { 35 sleep $1 36 rm -f d2 37 cp -Pp dangle d2 || framework_failure_ 38 # Can't use --format=%x, as lstat() modifies atime on some platforms. 39 stat --format=%y dangle > t1 || framework_failure_ 40 stat --format=%y d2 > t2 || framework_failure_ 41 compare t1 t2 42} 43 44# We retry with a delay at least 1.5s because on GPFS 45# it was seen that the timestamp wasn't updated unless there 46# was sufficient delay between the ln and cp. 47# I.e., if there wasn't sufficient difference in 48# the timestamp being updated, the update was discarded. 49retry_delay_ copy_timestamp_ .1 4 || fail=1 50 51Exit $fail 52