1#! /bin/sh 2 3# Copyright (C) 2002 by Martin Pool <mbp@samba.org> 4 5# This program is distributable under the terms of the GNU GPL (see 6# COPYING). 7 8# Test that when rsync is running as root and has -a it correctly sets 9# the ownership of the destination. 10 11# We don't know what users will be present on this system, so we just 12# use random numeric uids and gids. 13 14. "$suitedir/rsync.fns" 15 16case $0 in 17*fake*) 18 $RSYNC --version | grep "[, ] xattrs" >/dev/null || test_skipped "Rsync needs xattrs for fake device tests" 19 RSYNC="$RSYNC --fake-super" 20 TLS_ARGS="$TLS_ARGS --fake-super" 21 case "$HOST_OS" in 22 darwin*) 23 chown() { 24 own=$1 25 shift 26 xattr -s 'rsync.%stat' "100644 0,0 $own" "${@}" 27 } 28 ;; 29 solaris*) 30 chown() { 31 own=$1 32 shift 33 for fn in "${@}"; do 34 runat "$fn" "$SHELL_PATH" <<EOF 35echo "100644 0,0 $own" > rsync.%stat 36EOF 37 done 38 } 39 ;; 40 freebsd*) 41 chown() { 42 own=$1 43 shift 44 setextattr -h user "rsync.%stat" "100644 0,0 $own" "${@}" 45 } 46 ;; 47 *) 48 chown() { 49 own=$1 50 shift 51 setfattr -n 'user.rsync.%stat' -v "100644 0,0 $own" "${@}" 52 } 53 ;; 54 esac 55 ;; 56*) 57 RSYNC="$RSYNC --super" 58 my_uid=`get_testuid` 59 root_uid=`get_rootuid` 60 if test x"$my_uid" = x; then 61 : # If "id" failed, try to continue... 62 elif test x"$my_uid" != x"$root_uid"; then 63 if [ -e "$FAKEROOT_PATH" ]; then 64 echo "Let's try re-running the script under fakeroot..." 65 exec "$FAKEROOT_PATH" "$SHELL_PATH" "$0" 66 fi 67 fi 68 ;; 69esac 70 71# Build some hardlinks 72 73mkdir "$fromdir" 74name1="$fromdir/name1" 75name2="$fromdir/name2" 76echo "This is the file" > "$name1" 77echo "This is the other file" > "$name2" 78 79chown 5000:5002 "$name1" || test_skipped "Can't chown (probably need root)" 80chown 5001:5003 "$name2" || test_skipped "Can't chown (probably need root)" 81 82cd "$fromdir/.." 83checkit "$RSYNC -aHvv from/ to/" "$fromdir" "$todir" 84 85# The script would have aborted on error, so getting here means we've won. 86exit 0 87