1#!/bin/sh
2# Make sure touch can set the mtime on an empty file.
3
4# Copyright (C) 1998-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
20# Volker Borchert reported that touch 3.16r (and presumably all before that)
21# fails to work on SunOS 4.1.3 with 'most of the recommended patches' when
22# the empty file is on an NFS-mounted 4.2 volume.
23
24. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
25print_ver_ touch
26
27DEFAULT_SLEEP_SECONDS=2
28SLEEP_SECONDS=${SLEEP_SECONDS=$DEFAULT_SLEEP_SECONDS}
29
30
31# FIXME: find writable directories on other partitions
32# and run the test in those directories, too.
33
34: ${TOUCH_DIR_LIST=.}
35
36
37for d in $TOUCH_DIR_LIST; do
38  rm -rf $d/a $d/b $d/c
39  > $d/a || framework_failure_
40  test -f $d/a || framework_failure_
41  > $d/b || framework_failure_
42  test -f $d/b || framework_failure_
43  > $d/c || framework_failure_
44  test -f $d/c || framework_failure_
45done
46
47echo sleeping for $SLEEP_SECONDS seconds...
48sleep $SLEEP_SECONDS
49for d in $TOUCH_DIR_LIST; do
50  touch $d/a || fail=1
51  set x $(ls -t $d/a $d/b)
52  test "$*" = "x $d/a $d/b" || fail=1
53done
54
55echo sleeping for $SLEEP_SECONDS seconds...
56sleep $SLEEP_SECONDS
57for d in $TOUCH_DIR_LIST; do
58  touch $d/b
59  set x $(ls -t $d/a $d/b)
60  test "$*" = "x $d/b $d/a" || fail=1
61
62  if touch - 1< $d/c 2> /dev/null; then
63    set x $(ls -t $d/a $d/c)
64    test "$*" = "x $d/c $d/a" || fail=1
65  fi
66
67  rm -rf $d/a $d/b $d/c
68done
69
70if test $fail != 0; then
71  cat 1>&2 <<EOF
72*** This test has just failed.  That can happen when the test is run in an
73*** NFS-mounted directory on a system whose clock is not well synchronized
74*** with that of the NFS server.  If you think that is the reason, set the
75*** environment variable SLEEP_SECONDS to some number of seconds larger than
76*** the default of $DEFAULT_SLEEP_SECONDS and rerun the test.
77EOF
78fi
79
80Exit $fail
81