1271294Sngie#!/bin/sh
2271294Sngie# $FreeBSD: head/tools/regression/pjdfstest/tests/link/00.t 211352 2010-08-15 21:24:17Z pjd $
3271294Sngie
4271294Sngiedesc="link creates hardlinks"
5271294Sngie
6271294Sngiedir=`dirname $0`
7271294Sngie. ${dir}/../misc.sh
8271294Sngie
9271294Sngieecho "1..202"
10271294Sngie
11271294Sngien0=`namegen`
12271294Sngien1=`namegen`
13271294Sngien2=`namegen`
14271294Sngien3=`namegen`
15271294Sngie
16271294Sngieexpect 0 mkdir ${n3} 0755
17271294Sngiecdir=`pwd`
18271294Sngiecd ${n3}
19271294Sngie
20271294Sngiefor type in regular fifo block char socket; do
21271294Sngie	create_file ${type} ${n0}
22271294Sngie	expect ${type},1 lstat ${n0} type,nlink
23271294Sngie
24271294Sngie	expect 0 link ${n0} ${n1}
25271294Sngie	expect ${type},2 lstat ${n0} type,nlink
26271294Sngie	expect ${type},2 lstat ${n1} type,nlink
27271294Sngie
28271294Sngie	expect 0 link ${n1} ${n2}
29271294Sngie	expect ${type},3 lstat ${n0} type,nlink
30271294Sngie	expect ${type},3 lstat ${n1} type,nlink
31271294Sngie	expect ${type},3 lstat ${n2} type,nlink
32271294Sngie
33271294Sngie	expect 0 chmod ${n1} 0201
34271294Sngie	expect 0 chown ${n1} 65534 65533
35271294Sngie
36271294Sngie	expect ${type},0201,3,65534,65533 lstat ${n0} type,mode,nlink,uid,gid
37271294Sngie	expect ${type},0201,3,65534,65533 lstat ${n1} type,mode,nlink,uid,gid
38271294Sngie	expect ${type},0201,3,65534,65533 lstat ${n2} type,mode,nlink,uid,gid
39271294Sngie
40271294Sngie	expect 0 unlink ${n0}
41271294Sngie	expect ENOENT lstat ${n0} type,mode,nlink,uid,gid
42271294Sngie	expect ${type},0201,2,65534,65533 lstat ${n1} type,mode,nlink,uid,gid
43271294Sngie	expect ${type},0201,2,65534,65533 lstat ${n2} type,mode,nlink,uid,gid
44271294Sngie
45271294Sngie	expect 0 unlink ${n2}
46271294Sngie	expect ENOENT lstat ${n0} type,mode,nlink,uid,gid
47271294Sngie	expect ${type},0201,1,65534,65533 lstat ${n1} type,mode,nlink,uid,gid
48271294Sngie	expect ENOENT lstat ${n2} type,mode,nlink,uid,gid
49271294Sngie
50271294Sngie	expect 0 unlink ${n1}
51271294Sngie	expect ENOENT lstat ${n0} type,mode,nlink,uid,gid
52271294Sngie	expect ENOENT lstat ${n1} type,mode,nlink,uid,gid
53271294Sngie	expect ENOENT lstat ${n2} type,mode,nlink,uid,gid
54271294Sngiedone
55271294Sngie
56271294Sngie# successful link(2) updates ctime.
57271294Sngiefor type in regular fifo block char socket; do
58271294Sngie	create_file ${type} ${n0}
59271294Sngie	ctime1=`${fstest} stat ${n0} ctime`
60271294Sngie	dctime1=`${fstest} stat . ctime`
61271294Sngie	dmtime1=`${fstest} stat . mtime`
62271294Sngie	sleep 1
63271294Sngie	expect 0 link ${n0} ${n1}
64271294Sngie	ctime2=`${fstest} stat ${n0} ctime`
65271294Sngie	test_check $ctime1 -lt $ctime2
66271294Sngie	dctime2=`${fstest} stat . ctime`
67271294Sngie	test_check $dctime1 -lt $dctime2
68271294Sngie	dmtime2=`${fstest} stat . mtime`
69271294Sngie	test_check $dctime1 -lt $dmtime2
70271294Sngie	expect 0 unlink ${n0}
71271294Sngie	expect 0 unlink ${n1}
72271294Sngiedone
73271294Sngie
74271294Sngie# unsuccessful link(2) does not update ctime.
75271294Sngiefor type in regular fifo block char socket; do
76271294Sngie	create_file ${type} ${n0}
77271294Sngie	expect 0 -- chown ${n0} 65534 -1
78271294Sngie	ctime1=`${fstest} stat ${n0} ctime`
79271294Sngie	dctime1=`${fstest} stat . ctime`
80271294Sngie	dmtime1=`${fstest} stat . mtime`
81271294Sngie	sleep 1
82271294Sngie	expect EACCES -u 65534 link ${n0} ${n1}
83271294Sngie	ctime2=`${fstest} stat ${n0} ctime`
84271294Sngie	test_check $ctime1 -eq $ctime2
85271294Sngie	dctime2=`${fstest} stat . ctime`
86271294Sngie	test_check $dctime1 -eq $dctime2
87271294Sngie	dmtime2=`${fstest} stat . mtime`
88271294Sngie	test_check $dctime1 -eq $dmtime2
89271294Sngie	expect 0 unlink ${n0}
90271294Sngiedone
91271294Sngie
92271294Sngiecd ${cdir}
93271294Sngieexpect 0 rmdir ${n3}
94