1166065Spjd#!/bin/sh
2166065Spjd# $FreeBSD$
3166065Spjd
4166065Spjddesc="chmod returns EFTYPE if the effective user ID is not the super-user, the mode includes the sticky bit (S_ISVTX), and path does not refer to a directory"
5166065Spjd
6166065Spjddir=`dirname $0`
7166065Spjd. ${dir}/../misc.sh
8166065Spjd
9211336Spjdif supported lchmod; then
10211336Spjd	echo "1..173"
11211336Spjdelse
12211336Spjd	echo "1..109"
13211336Spjdfi
14166065Spjd
15166065Spjdn0=`namegen`
16166065Spjdn1=`namegen`
17211336Spjdn2=`namegen`
18166065Spjd
19166065Spjdexpect 0 mkdir ${n0} 0755
20166065Spjdcdir=`pwd`
21166065Spjdcd ${n0}
22166065Spjd
23211336Spjdfor type in regular dir fifo block char socket symlink; do
24211336Spjd	if [ "${type}" != "symlink" ]; then
25211336Spjd		create_file ${type} ${n1}
26211336Spjd		expect 0 chmod ${n1} 01621
27211336Spjd		expect 01621 stat ${n1} mode
28211336Spjd		expect 0 symlink ${n1} ${n2}
29211336Spjd		expect 0 chmod ${n2} 01700
30211336Spjd		expect 01700 stat ${n1} mode
31211336Spjd		expect 0 unlink ${n2}
32211336Spjd		if [ "${type}" = "dir" ]; then
33211336Spjd			expect 0 rmdir ${n1}
34211336Spjd		else
35211336Spjd			expect 0 unlink ${n1}
36211336Spjd		fi
37211336Spjd	fi
38166065Spjd
39211336Spjd	if supported lchmod; then
40211336Spjd		create_file ${type} ${n1}
41211336Spjd		expect 0 lchmod ${n1} 01621
42211336Spjd		expect 01621 lstat ${n1} mode
43211336Spjd		if [ "${type}" = "dir" ]; then
44211336Spjd			expect 0 rmdir ${n1}
45211336Spjd		else
46211336Spjd			expect 0 unlink ${n1}
47211336Spjd		fi
48211336Spjd	fi
49211336Spjddone
50166065Spjd
51166065Spjdexpect 0 mkdir ${n1} 0755
52166065Spjdexpect 0 chown ${n1} 65534 65534
53166065Spjdexpect 0 -u 65534 -g 65534 chmod ${n1} 01755
54166065Spjdexpect 01755 stat ${n1} mode
55211336Spjdexpect 0 symlink ${n1} ${n2}
56211336Spjdexpect 0 chmod ${n2} 01700
57211336Spjdexpect 01700 stat ${n1} mode
58211336Spjdexpect 0 unlink ${n2}
59166065Spjdexpect 0 rmdir ${n1}
60166065Spjd
61211336Spjdfor type in regular fifo block char socket symlink; do
62211336Spjd	if [ "${type}" != "symlink" ]; then
63211336Spjd		create_file ${type} ${n1} 0640 65534 65534
64211336Spjd		expect 0 symlink ${n1} ${n2}
65211336Spjd		case "${os}" in
66211336Spjd		FreeBSD)
67211336Spjd			expect EFTYPE -u 65534 -g 65534 chmod ${n1} 01644
68211336Spjd			expect 0640 stat ${n1} mode
69211336Spjd			expect EFTYPE -u 65534 -g 65534 chmod ${n2} 01644
70211336Spjd			expect 0640 stat ${n1} mode
71211336Spjd			;;
72211336Spjd		SunOS)
73211336Spjd			expect 0 -u 65534 -g 65534 chmod ${n1} 01644
74211336Spjd			expect 0644 stat ${n1} mode
75211336Spjd			expect 0 -u 65534 -g 65534 chmod ${n2} 01640
76211336Spjd			expect 0640 stat ${n1} mode
77211336Spjd			;;
78211336Spjd		Linux)
79211336Spjd			expect 0 -u 65534 -g 65534 chmod ${n1} 01644
80211336Spjd			expect 01644 stat ${n1} mode
81211336Spjd			expect 0 -u 65534 -g 65534 chmod ${n2} 01640
82211336Spjd			expect 01640 stat ${n1} mode
83211336Spjd			;;
84211336Spjd		esac
85211336Spjd		expect 0 unlink ${n2}
86211336Spjd		if [ "${type}" = "dir" ]; then
87211336Spjd			expect 0 rmdir ${n1}
88211336Spjd		else
89211336Spjd			expect 0 unlink ${n1}
90211336Spjd		fi
91211336Spjd	fi
92166065Spjd
93211336Spjd	if supported lchmod; then
94211336Spjd		create_file ${type} ${n1} 0640 65534 65534
95211336Spjd		case "${os}" in
96211336Spjd		FreeBSD)
97211336Spjd			expect EFTYPE -u 65534 -g 65534 lchmod ${n1} 01644
98211336Spjd			expect 0640 lstat ${n1} mode
99211336Spjd			;;
100211336Spjd		SunOS)
101211336Spjd			expect 0 -u 65534 -g 65534 lchmod ${n1} 01644
102211336Spjd			expect 0644 lstat ${n1} mode
103211336Spjd			;;
104211336Spjd		Linux)
105211336Spjd			expect 0 -u 65534 -g 65534 lchmod ${n1} 01644
106211336Spjd			expect 01644 lstat ${n1} mode
107211336Spjd			;;
108211336Spjd		esac
109211336Spjd		if [ "${type}" = "dir" ]; then
110211336Spjd			expect 0 rmdir ${n1}
111211336Spjd		else
112211336Spjd			expect 0 unlink ${n1}
113211336Spjd		fi
114211336Spjd	fi
115211336Spjddone
116211336Spjd
117166065Spjdcd ${cdir}
118166065Spjdexpect 0 rmdir ${n0}
119