summaryrefslogtreecommitdiff
path: root/testsuite/dir-sgid.test
blob: d6b9a3c5912ebf15464d2e26fa27c4d2f6b1ba66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh

# This program is distributable under the terms of the GNU GPL (see
# COPYING).

# Test that rsync obeys directory setgid. -- Matt McCutchen

. $suitedir/rsync.fns

umask 077

# Call as: testit <dirname> <dirperms> <file-expected> <program-expected> <dir-expected>
testit() {
    todir="$scratchdir/$1"
    mkdir "$todir"
    chmod $2 "$todir"
    # Make sure we obey directory setgid when creating a directory to hold multiple transferred files,
    # even though the directory itself is outside the transfer
    $RSYNC -rvv "$scratchdir/dir" "$scratchdir/file" "$scratchdir/program" "$todir/to/"
    check_perms "$todir/to" $5 "Target $1"
    check_perms "$todir/to/dir" $5 "Target $1"
    check_perms "$todir/to/file" $3 "Target $1"
    check_perms "$todir/to/program" $4 "Target $1"
}

mkdir "$scratchdir/dir"
# Cygwin has a persistent default dir ACL that ruins this test.
case `getfacl "$scratchdir/dir" 2>/dev/null || true` in
*default:user::*) test_skipped "The default ACL mode interferes with this test" ;;
esac

echo "File!" >"$scratchdir/file"
echo "#!/bin/sh" >"$scratchdir/program"

chmod u=rwx,g=rw,g+s,o=r "$scratchdir/dir" || test_skipped "Can't chmod"
chmod 664 "$scratchdir/file"
chmod 775 "$scratchdir/program"

[ -g "$scratchdir/dir" ] || test_skipped "The directory setgid bit vanished!"
mkdir "$scratchdir/dir/blah"
[ -g "$scratchdir/dir/blah" ] || test_skipped "Your filesystem doesn't use directory setgid; maybe it's BSD."

# Test some target directories
testit setgid-off 700 rw------- rwx------ rwx------
testit setgid-on u=rwx,g=rw,g+s,o-rwx rw------- rwx------ rwx--S---

# Hooray
exit 0