xref: /aosp_15_r20/external/ltp/testcases/kernel/syscalls/fcntl/fcntl14.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker /*
2*49cdfc7eSAndroid Build Coastguard Worker  *
3*49cdfc7eSAndroid Build Coastguard Worker  *   Copyright (c) International Business Machines  Corp., 2001
4*49cdfc7eSAndroid Build Coastguard Worker  *
5*49cdfc7eSAndroid Build Coastguard Worker  *   This program is free software;  you can redistribute it and/or modify
6*49cdfc7eSAndroid Build Coastguard Worker  *   it under the terms of the GNU General Public License as published by
7*49cdfc7eSAndroid Build Coastguard Worker  *   the Free Software Foundation; either version 2 of the License, or
8*49cdfc7eSAndroid Build Coastguard Worker  *   (at your option) any later version.
9*49cdfc7eSAndroid Build Coastguard Worker  *
10*49cdfc7eSAndroid Build Coastguard Worker  *   This program is distributed in the hope that it will be useful,
11*49cdfc7eSAndroid Build Coastguard Worker  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12*49cdfc7eSAndroid Build Coastguard Worker  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13*49cdfc7eSAndroid Build Coastguard Worker  *   the GNU General Public License for more details.
14*49cdfc7eSAndroid Build Coastguard Worker  *
15*49cdfc7eSAndroid Build Coastguard Worker  *   You should have received a copy of the GNU General Public License
16*49cdfc7eSAndroid Build Coastguard Worker  *   along with this program;  if not, write to the Free Software
17*49cdfc7eSAndroid Build Coastguard Worker  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18*49cdfc7eSAndroid Build Coastguard Worker  */
19*49cdfc7eSAndroid Build Coastguard Worker 
20*49cdfc7eSAndroid Build Coastguard Worker /*
21*49cdfc7eSAndroid Build Coastguard Worker  * NAME
22*49cdfc7eSAndroid Build Coastguard Worker  *	fcntl14.c
23*49cdfc7eSAndroid Build Coastguard Worker  *
24*49cdfc7eSAndroid Build Coastguard Worker  * DESCRIPTION
25*49cdfc7eSAndroid Build Coastguard Worker  *	File locking test cases for fcntl. In Linux, S_ENFMT is not implemented
26*49cdfc7eSAndroid Build Coastguard Worker  *	in the kernel. However all standard Unix kernels define S_ENFMT as
27*49cdfc7eSAndroid Build Coastguard Worker  *	S_ISGID. So this test defines S_ENFMT as S_ISGID.
28*49cdfc7eSAndroid Build Coastguard Worker  *
29*49cdfc7eSAndroid Build Coastguard Worker  * ALGORITHM
30*49cdfc7eSAndroid Build Coastguard Worker  *	Various test cases are used to lock a file opened without mandatory
31*49cdfc7eSAndroid Build Coastguard Worker  *	locking, with mandatory locking and mandatory locking with NOBLOCK
32*49cdfc7eSAndroid Build Coastguard Worker  *
33*49cdfc7eSAndroid Build Coastguard Worker  * USAGE
34*49cdfc7eSAndroid Build Coastguard Worker  *	fcntl14
35*49cdfc7eSAndroid Build Coastguard Worker  *
36*49cdfc7eSAndroid Build Coastguard Worker  * HISTORY
37*49cdfc7eSAndroid Build Coastguard Worker  *	07/2001 Ported by Wayne Boyer
38*49cdfc7eSAndroid Build Coastguard Worker  *
39*49cdfc7eSAndroid Build Coastguard Worker  * RESTRICTIONS
40*49cdfc7eSAndroid Build Coastguard Worker  *	None
41*49cdfc7eSAndroid Build Coastguard Worker  */
42*49cdfc7eSAndroid Build Coastguard Worker #define _GNU_SOURCE 1
43*49cdfc7eSAndroid Build Coastguard Worker #include <fcntl.h>
44*49cdfc7eSAndroid Build Coastguard Worker #include <sys/types.h>
45*49cdfc7eSAndroid Build Coastguard Worker #include <sys/stat.h>
46*49cdfc7eSAndroid Build Coastguard Worker #include <signal.h>
47*49cdfc7eSAndroid Build Coastguard Worker #include <errno.h>
48*49cdfc7eSAndroid Build Coastguard Worker #include <sys/wait.h>
49*49cdfc7eSAndroid Build Coastguard Worker #include <inttypes.h>
50*49cdfc7eSAndroid Build Coastguard Worker #include "test.h"
51*49cdfc7eSAndroid Build Coastguard Worker #include "safe_macros.h"
52*49cdfc7eSAndroid Build Coastguard Worker 
53*49cdfc7eSAndroid Build Coastguard Worker #define SKIP 0x0c00
54*49cdfc7eSAndroid Build Coastguard Worker #if SKIP == F_RDLCK || SKIP== F_WRLCK
55*49cdfc7eSAndroid Build Coastguard Worker #error invalid value for SKIP, must be distinct from F_RDLCK and F_WRLCK
56*49cdfc7eSAndroid Build Coastguard Worker #endif
57*49cdfc7eSAndroid Build Coastguard Worker #ifndef S_ENFMT
58*49cdfc7eSAndroid Build Coastguard Worker #define S_ENFMT S_ISGID
59*49cdfc7eSAndroid Build Coastguard Worker #endif
60*49cdfc7eSAndroid Build Coastguard Worker 
61*49cdfc7eSAndroid Build Coastguard Worker /* NOBLOCK - immediate success */
62*49cdfc7eSAndroid Build Coastguard Worker #define NOBLOCK 2
63*49cdfc7eSAndroid Build Coastguard Worker 
64*49cdfc7eSAndroid Build Coastguard Worker /* WILLBLOCK - blocks, then succeeds (parent must unlock records) */
65*49cdfc7eSAndroid Build Coastguard Worker #define WILLBLOCK 3
66*49cdfc7eSAndroid Build Coastguard Worker 
67*49cdfc7eSAndroid Build Coastguard Worker #define TIME_OUT 60
68*49cdfc7eSAndroid Build Coastguard Worker 
69*49cdfc7eSAndroid Build Coastguard Worker typedef struct {
70*49cdfc7eSAndroid Build Coastguard Worker 	short a_type;
71*49cdfc7eSAndroid Build Coastguard Worker 	short a_whence;
72*49cdfc7eSAndroid Build Coastguard Worker 	long a_start;
73*49cdfc7eSAndroid Build Coastguard Worker 	long a_len;
74*49cdfc7eSAndroid Build Coastguard Worker 	short b_type;		/* SKIP means suppress fcntl call */
75*49cdfc7eSAndroid Build Coastguard Worker 	short b_whence;
76*49cdfc7eSAndroid Build Coastguard Worker 	long b_start;
77*49cdfc7eSAndroid Build Coastguard Worker 	long b_len;
78*49cdfc7eSAndroid Build Coastguard Worker 	short c_type;
79*49cdfc7eSAndroid Build Coastguard Worker 	int c_whence;
80*49cdfc7eSAndroid Build Coastguard Worker 	long c_start;
81*49cdfc7eSAndroid Build Coastguard Worker 	long c_len;
82*49cdfc7eSAndroid Build Coastguard Worker 	short c_flag;
83*49cdfc7eSAndroid Build Coastguard Worker } testcase;
84*49cdfc7eSAndroid Build Coastguard Worker 
85*49cdfc7eSAndroid Build Coastguard Worker static testcase testcases[] = {
86*49cdfc7eSAndroid Build Coastguard Worker 	/* Test cases: entire boundary */
87*49cdfc7eSAndroid Build Coastguard Worker 	/* #1 Parent making a write lock on entire file */
88*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
89*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock on entire file */
90*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 0L, 0L, WILLBLOCK},
91*49cdfc7eSAndroid Build Coastguard Worker 
92*49cdfc7eSAndroid Build Coastguard Worker 	/* #2 Parent making a write lock on entire file */
93*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
94*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock on entire file */
95*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 0L, 0L, WILLBLOCK},
96*49cdfc7eSAndroid Build Coastguard Worker 
97*49cdfc7eSAndroid Build Coastguard Worker 	/* #3 Parent making a read lock on entire file */
98*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
99*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock on entire file */
100*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 0L, 0L, NOBLOCK},
101*49cdfc7eSAndroid Build Coastguard Worker 
102*49cdfc7eSAndroid Build Coastguard Worker 	/* #4 Parent making a read lock on entire file */
103*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
104*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock on entire file */
105*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 0L, 0L, WILLBLOCK},
106*49cdfc7eSAndroid Build Coastguard Worker 
107*49cdfc7eSAndroid Build Coastguard Worker 	/* Test case: start boundary */
108*49cdfc7eSAndroid Build Coastguard Worker 	/* #5 Parent making a write lock on entire file */
109*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
110*49cdfc7eSAndroid Build Coastguard Worker 	 /*
111*49cdfc7eSAndroid Build Coastguard Worker 	  * Child attempting a read lock from beginning of
112*49cdfc7eSAndroid Build Coastguard Worker 	  * file for 5 bytes
113*49cdfc7eSAndroid Build Coastguard Worker 	  */
114*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 0L, 5L, WILLBLOCK},
115*49cdfc7eSAndroid Build Coastguard Worker 
116*49cdfc7eSAndroid Build Coastguard Worker 	/* #6 Parent making a write lock on entire file */
117*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
118*49cdfc7eSAndroid Build Coastguard Worker 	 /*
119*49cdfc7eSAndroid Build Coastguard Worker 	  * Child attempting a write lock from beginning of
120*49cdfc7eSAndroid Build Coastguard Worker 	  * file for 5 bytes
121*49cdfc7eSAndroid Build Coastguard Worker 	  */
122*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 0L, 5L, WILLBLOCK},
123*49cdfc7eSAndroid Build Coastguard Worker 
124*49cdfc7eSAndroid Build Coastguard Worker 	/* #7 Parent making a read lock on entire file */
125*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
126*49cdfc7eSAndroid Build Coastguard Worker 	 /*
127*49cdfc7eSAndroid Build Coastguard Worker 	  * Child attempting a read lock from beginning of
128*49cdfc7eSAndroid Build Coastguard Worker 	  * file for 5 bytes
129*49cdfc7eSAndroid Build Coastguard Worker 	  */
130*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 0L, 5L, NOBLOCK},
131*49cdfc7eSAndroid Build Coastguard Worker 
132*49cdfc7eSAndroid Build Coastguard Worker 	/* #8 Parent making a read lock on entire file */
133*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
134*49cdfc7eSAndroid Build Coastguard Worker 	 /*
135*49cdfc7eSAndroid Build Coastguard Worker 	  * Child attempting a write lock from beginning of
136*49cdfc7eSAndroid Build Coastguard Worker 	  * file for 5 bytes
137*49cdfc7eSAndroid Build Coastguard Worker 	  */
138*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 0L, 5L, WILLBLOCK},
139*49cdfc7eSAndroid Build Coastguard Worker 
140*49cdfc7eSAndroid Build Coastguard Worker 	/* Test cases: end boundary */
141*49cdfc7eSAndroid Build Coastguard Worker 	/* #9 Parent making a write lock on entire file */
142*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
143*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from byte 7 to end of file */
144*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 7L, 0L, WILLBLOCK},
145*49cdfc7eSAndroid Build Coastguard Worker 
146*49cdfc7eSAndroid Build Coastguard Worker 	/* #10 Parent making a write lock on entire file */
147*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
148*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from byte 7 to end of file */
149*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 7L, 0L, WILLBLOCK},
150*49cdfc7eSAndroid Build Coastguard Worker 
151*49cdfc7eSAndroid Build Coastguard Worker 	/* #11 Parent making a read lock on entire file */
152*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
153*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from byte 7 to end of file */
154*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 7L, 0L, NOBLOCK},
155*49cdfc7eSAndroid Build Coastguard Worker 
156*49cdfc7eSAndroid Build Coastguard Worker 	/* #12 Parent making a read lock on entire file */
157*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
158*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from byte 7 to end of file */
159*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 7L, 0L, WILLBLOCK},
160*49cdfc7eSAndroid Build Coastguard Worker 
161*49cdfc7eSAndroid Build Coastguard Worker 	/* Test cases: entire boundary ( less than entire file) */
162*49cdfc7eSAndroid Build Coastguard Worker 	/*
163*49cdfc7eSAndroid Build Coastguard Worker 	 * #13 Parent making a write lock from beginning of
164*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
165*49cdfc7eSAndroid Build Coastguard Worker 	 */
166*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
167*49cdfc7eSAndroid Build Coastguard Worker 	 /*
168*49cdfc7eSAndroid Build Coastguard Worker 	  * Child attempting a read lock from beginning of
169*49cdfc7eSAndroid Build Coastguard Worker 	  * file for 5 bytes
170*49cdfc7eSAndroid Build Coastguard Worker 	  */
171*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 0L, 5L, WILLBLOCK},
172*49cdfc7eSAndroid Build Coastguard Worker 
173*49cdfc7eSAndroid Build Coastguard Worker 	/*
174*49cdfc7eSAndroid Build Coastguard Worker 	 * #14 Parent making a write lock from beginning of file
175*49cdfc7eSAndroid Build Coastguard Worker 	 * for 5 bytes
176*49cdfc7eSAndroid Build Coastguard Worker 	 */
177*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
178*49cdfc7eSAndroid Build Coastguard Worker 	 /*
179*49cdfc7eSAndroid Build Coastguard Worker 	  * Child attempting a write lock from beginning of
180*49cdfc7eSAndroid Build Coastguard Worker 	  * file for 5 bytes
181*49cdfc7eSAndroid Build Coastguard Worker 	  */
182*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 0L, 5L, WILLBLOCK},
183*49cdfc7eSAndroid Build Coastguard Worker 
184*49cdfc7eSAndroid Build Coastguard Worker 	/*
185*49cdfc7eSAndroid Build Coastguard Worker 	 * #15 Parent making a read lock from beginning of
186*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
187*49cdfc7eSAndroid Build Coastguard Worker 	 */
188*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
189*49cdfc7eSAndroid Build Coastguard Worker 	 /*
190*49cdfc7eSAndroid Build Coastguard Worker 	  * Child attempting a read lock from beginning of
191*49cdfc7eSAndroid Build Coastguard Worker 	  * file for 5 bytes
192*49cdfc7eSAndroid Build Coastguard Worker 	  */
193*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 0L, 5L, NOBLOCK},
194*49cdfc7eSAndroid Build Coastguard Worker 
195*49cdfc7eSAndroid Build Coastguard Worker 	/*
196*49cdfc7eSAndroid Build Coastguard Worker 	 * #16 Parent making a read lock from beginning of
197*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
198*49cdfc7eSAndroid Build Coastguard Worker 	 */
199*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
200*49cdfc7eSAndroid Build Coastguard Worker 	 /*
201*49cdfc7eSAndroid Build Coastguard Worker 	  * Child attempting a write lock from beginning
202*49cdfc7eSAndroid Build Coastguard Worker 	  * of file for 5 bytes
203*49cdfc7eSAndroid Build Coastguard Worker 	  */
204*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 0L, 5L, WILLBLOCK},
205*49cdfc7eSAndroid Build Coastguard Worker 
206*49cdfc7eSAndroid Build Coastguard Worker 	/* Test cases: inside boundary */
207*49cdfc7eSAndroid Build Coastguard Worker 	/*
208*49cdfc7eSAndroid Build Coastguard Worker 	 * #17 Parent making a write lock from beginning
209*49cdfc7eSAndroid Build Coastguard Worker 	 * of file for 5 bytes
210*49cdfc7eSAndroid Build Coastguard Worker 	 */
211*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
212*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from byte 2 to byte 4 */
213*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 1L, 3L, WILLBLOCK},
214*49cdfc7eSAndroid Build Coastguard Worker 
215*49cdfc7eSAndroid Build Coastguard Worker 	/*
216*49cdfc7eSAndroid Build Coastguard Worker 	 * #18 Parent making a write lock from beginning of
217*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
218*49cdfc7eSAndroid Build Coastguard Worker 	 */
219*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
220*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from byte 2 to byte 4 */
221*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 1L, 3L, WILLBLOCK},
222*49cdfc7eSAndroid Build Coastguard Worker 
223*49cdfc7eSAndroid Build Coastguard Worker 	/*
224*49cdfc7eSAndroid Build Coastguard Worker 	 * #19 Parent making a read lock from beginning of
225*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
226*49cdfc7eSAndroid Build Coastguard Worker 	 */
227*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
228*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from byte 2 to byte 4 */
229*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 1L, 3L, NOBLOCK},
230*49cdfc7eSAndroid Build Coastguard Worker 
231*49cdfc7eSAndroid Build Coastguard Worker 	/*
232*49cdfc7eSAndroid Build Coastguard Worker 	 * #20 Parent making a read lock from beginning of
233*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
234*49cdfc7eSAndroid Build Coastguard Worker 	 */
235*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
236*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from byte 2 to byte 4 */
237*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 1L, 3L, WILLBLOCK},
238*49cdfc7eSAndroid Build Coastguard Worker 
239*49cdfc7eSAndroid Build Coastguard Worker 	/* Test cases: cross boundary (inside to after) */
240*49cdfc7eSAndroid Build Coastguard Worker 	/*
241*49cdfc7eSAndroid Build Coastguard Worker 	 * #21 Parent making a write lock from beginning of
242*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
243*49cdfc7eSAndroid Build Coastguard Worker 	 */
244*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
245*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from byte 3 to byte 7 */
246*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 2L, 5L, WILLBLOCK},
247*49cdfc7eSAndroid Build Coastguard Worker 
248*49cdfc7eSAndroid Build Coastguard Worker 	/*
249*49cdfc7eSAndroid Build Coastguard Worker 	 * #22 Parent making a write lock from beginning
250*49cdfc7eSAndroid Build Coastguard Worker 	 * of file for 5 bytes
251*49cdfc7eSAndroid Build Coastguard Worker 	 */
252*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
253*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from byte 3 to byte 7 */
254*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 2L, 5L, WILLBLOCK},
255*49cdfc7eSAndroid Build Coastguard Worker 
256*49cdfc7eSAndroid Build Coastguard Worker 	/*
257*49cdfc7eSAndroid Build Coastguard Worker 	 * #23 Parent making a read lock from beginning of
258*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
259*49cdfc7eSAndroid Build Coastguard Worker 	 */
260*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
261*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from byte 3 to byte 7 */
262*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 2L, 5L, NOBLOCK},
263*49cdfc7eSAndroid Build Coastguard Worker 
264*49cdfc7eSAndroid Build Coastguard Worker 	/*
265*49cdfc7eSAndroid Build Coastguard Worker 	 * #24 Parent making a read lock from beginning of
266*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
267*49cdfc7eSAndroid Build Coastguard Worker 	 */
268*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
269*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from byte 3 to byte 7 */
270*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 2L, 5L, WILLBLOCK},
271*49cdfc7eSAndroid Build Coastguard Worker 
272*49cdfc7eSAndroid Build Coastguard Worker 	/* Test cases: outside boundary (after) */
273*49cdfc7eSAndroid Build Coastguard Worker 
274*49cdfc7eSAndroid Build Coastguard Worker 	/*
275*49cdfc7eSAndroid Build Coastguard Worker 	 * #25 Parent making a write lock from beginning of
276*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
277*49cdfc7eSAndroid Build Coastguard Worker 	 */
278*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
279*49cdfc7eSAndroid Build Coastguard Worker 	 /*  Child attempting a read lock from byte 7 to end of file */
280*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 6L, 0L, NOBLOCK},
281*49cdfc7eSAndroid Build Coastguard Worker 
282*49cdfc7eSAndroid Build Coastguard Worker 	/*
283*49cdfc7eSAndroid Build Coastguard Worker 	 * #26 Parent making a write lock from beginning of
284*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
285*49cdfc7eSAndroid Build Coastguard Worker 	 */
286*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
287*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from byte 7 to end of file */
288*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 6L, 0L, NOBLOCK},
289*49cdfc7eSAndroid Build Coastguard Worker 
290*49cdfc7eSAndroid Build Coastguard Worker 	/*
291*49cdfc7eSAndroid Build Coastguard Worker 	 * #27 Parent making a read lock from beginning of
292*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
293*49cdfc7eSAndroid Build Coastguard Worker 	 */
294*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
295*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from byte 7 to end of file */
296*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 6L, 0L, NOBLOCK},
297*49cdfc7eSAndroid Build Coastguard Worker 
298*49cdfc7eSAndroid Build Coastguard Worker 	/*
299*49cdfc7eSAndroid Build Coastguard Worker 	 * #28 Parent making a read lock from beginning of
300*49cdfc7eSAndroid Build Coastguard Worker 	 * file for 5 bytes
301*49cdfc7eSAndroid Build Coastguard Worker 	 */
302*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 0L, 5L, SKIP, 0, 0L, 0L,
303*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from byte 7 to end of file */
304*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 6L, 0L, NOBLOCK},
305*49cdfc7eSAndroid Build Coastguard Worker 
306*49cdfc7eSAndroid Build Coastguard Worker 	/* Test cases: outside boundary (before) */
307*49cdfc7eSAndroid Build Coastguard Worker 
308*49cdfc7eSAndroid Build Coastguard Worker 	/* #29 Parent making a write lock from byte 3 to byte 7 */
309*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 2L, 5L, SKIP, 0, 0L, 0L,
310*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from beginning of file to byte 2 */
311*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 0L, 2L, NOBLOCK},
312*49cdfc7eSAndroid Build Coastguard Worker 
313*49cdfc7eSAndroid Build Coastguard Worker 	/* #30 Parent making a write lock from byte 3 to byte 7 */
314*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 2L, 5L, SKIP, 0, 0L, 0L,
315*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from beginning of file to byte 2 */
316*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 0L, 2L, NOBLOCK},
317*49cdfc7eSAndroid Build Coastguard Worker 
318*49cdfc7eSAndroid Build Coastguard Worker 	/* #31 Parent making a write lock from byte 3 to byte 7 */
319*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 2L, 5L, SKIP, 0, 0L, 0L,
320*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from beginning of file to byte 2 */
321*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 0L, 2L, NOBLOCK},
322*49cdfc7eSAndroid Build Coastguard Worker 
323*49cdfc7eSAndroid Build Coastguard Worker 	/* #32 Parent making a write lock from byte 3 to byte 7 */
324*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 2L, 5L, SKIP, 0, 0L, 0L,
325*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from beginning of file to byte 2 */
326*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 0L, 2L, NOBLOCK},
327*49cdfc7eSAndroid Build Coastguard Worker 
328*49cdfc7eSAndroid Build Coastguard Worker 	/* Test cases: cross boundary (before to inside) */
329*49cdfc7eSAndroid Build Coastguard Worker 	/* #33 Parent making a write lock from byte 5 to end of file */
330*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 4L, 0L, SKIP, 0, 0L, 0L,
331*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from byte 3 to byte 7 */
332*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 2L, 5L, WILLBLOCK},
333*49cdfc7eSAndroid Build Coastguard Worker 
334*49cdfc7eSAndroid Build Coastguard Worker 	/* #34 Parent making a write lock from byte 5 to end of file */
335*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 4L, 0L, SKIP, 0, 0L, 0L,
336*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from byte 3 to byte 7 */
337*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 2L, 5L, WILLBLOCK},
338*49cdfc7eSAndroid Build Coastguard Worker 
339*49cdfc7eSAndroid Build Coastguard Worker 	/* #35 Parent making a read lock from byte 5 to end of file */
340*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 4L, 0L, SKIP, 0, 0L, 0L,
341*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a read lock from byte 3 to byte 7 */
342*49cdfc7eSAndroid Build Coastguard Worker 	 F_RDLCK, 0, 2L, 5L, NOBLOCK},
343*49cdfc7eSAndroid Build Coastguard Worker 
344*49cdfc7eSAndroid Build Coastguard Worker 	/* #36 Parent making a read lock from byte 5 to end of file */
345*49cdfc7eSAndroid Build Coastguard Worker 	{F_RDLCK, 0, 4L, 0L, SKIP, 0, 0L, 0L,
346*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting a write lock from byte 3 to byte 7 */
347*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 2L, 5L, WILLBLOCK},
348*49cdfc7eSAndroid Build Coastguard Worker 
349*49cdfc7eSAndroid Build Coastguard Worker 	/* Start of negative L_start and L_len test cases */
350*49cdfc7eSAndroid Build Coastguard Worker 	/*
351*49cdfc7eSAndroid Build Coastguard Worker 	 * #37 Parent making write lock from byte 2 to byte 3
352*49cdfc7eSAndroid Build Coastguard Worker 	 * with L_start = -3
353*49cdfc7eSAndroid Build Coastguard Worker 	 */
354*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -3L, 2L, SKIP, 0, 0L, 0L,
355*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 1 */
356*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 1L, 1L, NOBLOCK},
357*49cdfc7eSAndroid Build Coastguard Worker 
358*49cdfc7eSAndroid Build Coastguard Worker 	/*
359*49cdfc7eSAndroid Build Coastguard Worker 	 * #38 Parent making write lock from byte 2 to byte 3
360*49cdfc7eSAndroid Build Coastguard Worker 	 * with L_start = -3
361*49cdfc7eSAndroid Build Coastguard Worker 	 */
362*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -3L, 2L, SKIP, 0, 0L, 0L,
363*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 4 */
364*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 4L, 1L, NOBLOCK},
365*49cdfc7eSAndroid Build Coastguard Worker 
366*49cdfc7eSAndroid Build Coastguard Worker 	/*
367*49cdfc7eSAndroid Build Coastguard Worker 	 * #39 Parent making write lock from byte 2 to byte 3
368*49cdfc7eSAndroid Build Coastguard Worker 	 * with L_start = -3
369*49cdfc7eSAndroid Build Coastguard Worker 	 */
370*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -3L, 2L, SKIP, 0, 0L, 0L,
371*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 2 */
372*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 2L, 1L, WILLBLOCK},
373*49cdfc7eSAndroid Build Coastguard Worker 
374*49cdfc7eSAndroid Build Coastguard Worker 	/*
375*49cdfc7eSAndroid Build Coastguard Worker 	 * #40 Parent making write lock from byte 2 to byte 3
376*49cdfc7eSAndroid Build Coastguard Worker 	 * with L_start = -3
377*49cdfc7eSAndroid Build Coastguard Worker 	 */
378*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -3L, 2L, SKIP, 0, 0L, 0L,
379*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 3 */
380*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 3L, 1L, WILLBLOCK},
381*49cdfc7eSAndroid Build Coastguard Worker 
382*49cdfc7eSAndroid Build Coastguard Worker 	/*
383*49cdfc7eSAndroid Build Coastguard Worker 	 * #41 Parent making write lock from byte 2 to byte 6
384*49cdfc7eSAndroid Build Coastguard Worker 	 * with L_start = -3
385*49cdfc7eSAndroid Build Coastguard Worker 	 */
386*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -3L, 5L, SKIP, 0, 0L, 0L,
387*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 1 */
388*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 1L, 1L, NOBLOCK},
389*49cdfc7eSAndroid Build Coastguard Worker 
390*49cdfc7eSAndroid Build Coastguard Worker 	/*
391*49cdfc7eSAndroid Build Coastguard Worker 	 * #42 Parent making write lock from byte 2 to byte 6
392*49cdfc7eSAndroid Build Coastguard Worker 	 * with L_start = -3
393*49cdfc7eSAndroid Build Coastguard Worker 	 */
394*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -3L, 5L, SKIP, 0, 0L, 0L,
395*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 7 */
396*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 1L, 1L, NOBLOCK},
397*49cdfc7eSAndroid Build Coastguard Worker 
398*49cdfc7eSAndroid Build Coastguard Worker 	/*
399*49cdfc7eSAndroid Build Coastguard Worker 	 * #43 Parent making write lock from byte 2 to byte 6
400*49cdfc7eSAndroid Build Coastguard Worker 	 * with L_start = -3
401*49cdfc7eSAndroid Build Coastguard Worker 	 */
402*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -3L, 5L, SKIP, 0, 0L, 0L,
403*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 2 */
404*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 2L, 1L, WILLBLOCK},
405*49cdfc7eSAndroid Build Coastguard Worker 
406*49cdfc7eSAndroid Build Coastguard Worker 	/*
407*49cdfc7eSAndroid Build Coastguard Worker 	 * #44 Parent making write lock from byte 2 to byte 6
408*49cdfc7eSAndroid Build Coastguard Worker 	 * with L_start = -3
409*49cdfc7eSAndroid Build Coastguard Worker 	 */
410*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -3L, 5L, SKIP, 0, 0L, 0L,
411*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 5 */
412*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 5L, 1L, WILLBLOCK},
413*49cdfc7eSAndroid Build Coastguard Worker 
414*49cdfc7eSAndroid Build Coastguard Worker 	/*
415*49cdfc7eSAndroid Build Coastguard Worker 	 * #45 Parent making write lock from byte 2 to byte 6
416*49cdfc7eSAndroid Build Coastguard Worker 	 * with L_start = -3
417*49cdfc7eSAndroid Build Coastguard Worker 	 */
418*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -3L, 5L, SKIP, 0, 0L, 0L,
419*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 6 */
420*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 6L, 1L, WILLBLOCK},
421*49cdfc7eSAndroid Build Coastguard Worker 
422*49cdfc7eSAndroid Build Coastguard Worker 	/*
423*49cdfc7eSAndroid Build Coastguard Worker 	 * #46 Parent making write lock from byte 2 to byte 3 with
424*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = -2 and L_len = -2
425*49cdfc7eSAndroid Build Coastguard Worker 	 */
426*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, 2L, -2L, SKIP, 0, 0L, 0L,
427*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 1 */
428*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 1L, 1L, NOBLOCK},
429*49cdfc7eSAndroid Build Coastguard Worker 
430*49cdfc7eSAndroid Build Coastguard Worker 	/*
431*49cdfc7eSAndroid Build Coastguard Worker 	 * #47 Parent making write lock from byte 2 to byte 3 with
432*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = -2 and L_len = -2
433*49cdfc7eSAndroid Build Coastguard Worker 	 */
434*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -2L, -2L, SKIP, 0, 0L, 0L,
435*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 4 */
436*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 4L, 1L, NOBLOCK},
437*49cdfc7eSAndroid Build Coastguard Worker 
438*49cdfc7eSAndroid Build Coastguard Worker 	/*
439*49cdfc7eSAndroid Build Coastguard Worker 	 * #48 Parent making write lock from byte 2 to byte 3 with
440*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = -2 and L_len = -2
441*49cdfc7eSAndroid Build Coastguard Worker 	 */
442*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -2L, -2L, SKIP, 0, 0L, 0L,
443*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 2 */
444*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 2L, 1L, WILLBLOCK},
445*49cdfc7eSAndroid Build Coastguard Worker 
446*49cdfc7eSAndroid Build Coastguard Worker 	/*
447*49cdfc7eSAndroid Build Coastguard Worker 	 * #49 Parent making write lock from byte 2 to byte 3 with
448*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = -2 and L_len = -2
449*49cdfc7eSAndroid Build Coastguard Worker 	 */
450*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, -2L, -2L, SKIP, 0, 0L, 0L,
451*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 3 */
452*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 3L, 1L, WILLBLOCK},
453*49cdfc7eSAndroid Build Coastguard Worker 
454*49cdfc7eSAndroid Build Coastguard Worker 	/*
455*49cdfc7eSAndroid Build Coastguard Worker 	 * #50 Parent making write lock from byte 6 to byte 7 with
456*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = 2 and L_len = -2
457*49cdfc7eSAndroid Build Coastguard Worker 	 */
458*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, 2L, -2L, SKIP, 0, 0L, 0L,
459*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 5 */
460*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 5L, 1L, NOBLOCK},
461*49cdfc7eSAndroid Build Coastguard Worker 
462*49cdfc7eSAndroid Build Coastguard Worker 	/*
463*49cdfc7eSAndroid Build Coastguard Worker 	 * #51 Parent making write lock from byte 6 to byte 7 with
464*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = 2 and L_len = -2
465*49cdfc7eSAndroid Build Coastguard Worker 	 */
466*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, 2L, -2L, SKIP, 0, 0L, 0L,
467*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 8 */
468*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 8L, 1L, NOBLOCK},
469*49cdfc7eSAndroid Build Coastguard Worker 
470*49cdfc7eSAndroid Build Coastguard Worker 	/*
471*49cdfc7eSAndroid Build Coastguard Worker 	 * #52 Parent making write lock from byte 6 to byte 7 with
472*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = 2 and L_len = -2
473*49cdfc7eSAndroid Build Coastguard Worker 	 */
474*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, 2L, -2L, SKIP, 0, 0L, 0L,
475*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 6 */
476*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 6L, 1L, WILLBLOCK},
477*49cdfc7eSAndroid Build Coastguard Worker 
478*49cdfc7eSAndroid Build Coastguard Worker 	/*
479*49cdfc7eSAndroid Build Coastguard Worker 	 * #53 Parent making write lock from byte 6 to byte 7 with
480*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = 2 and L_len = -2
481*49cdfc7eSAndroid Build Coastguard Worker 	 */
482*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, 2L, -2L, SKIP, 0, 0L, 0L,
483*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 7 */
484*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 7L, 1L, WILLBLOCK},
485*49cdfc7eSAndroid Build Coastguard Worker 
486*49cdfc7eSAndroid Build Coastguard Worker 	/*
487*49cdfc7eSAndroid Build Coastguard Worker 	 * #54 Parent making write lock from byte 3 to byte 7 with
488*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = 2 and L_len = -5
489*49cdfc7eSAndroid Build Coastguard Worker 	 */
490*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, 2L, -5L, SKIP, 0, 0L, 0L,
491*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 2 */
492*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 2L, 1L, NOBLOCK},
493*49cdfc7eSAndroid Build Coastguard Worker 
494*49cdfc7eSAndroid Build Coastguard Worker 	/*
495*49cdfc7eSAndroid Build Coastguard Worker 	 * #55 Parent making write lock from byte 3 to byte 7 with
496*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = 2 and L_len = -5
497*49cdfc7eSAndroid Build Coastguard Worker 	 */
498*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, 2L, -5L, SKIP, 0, 0L, 0L,
499*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 8 */
500*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 8L, 1L, NOBLOCK},
501*49cdfc7eSAndroid Build Coastguard Worker 
502*49cdfc7eSAndroid Build Coastguard Worker 	/*
503*49cdfc7eSAndroid Build Coastguard Worker 	 * #56 Parent making write lock from byte 3 to byte 7 with
504*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = 2 and L_len = -5
505*49cdfc7eSAndroid Build Coastguard Worker 	 */
506*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, 2L, -5L, SKIP, 0, 0L, 0L,
507*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 3 */
508*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 3L, 1L, WILLBLOCK},
509*49cdfc7eSAndroid Build Coastguard Worker 
510*49cdfc7eSAndroid Build Coastguard Worker 	/*
511*49cdfc7eSAndroid Build Coastguard Worker 	 * #57 Parent making write lock from byte 3 to byte 7 with
512*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = 2 and L_len = -5
513*49cdfc7eSAndroid Build Coastguard Worker 	 */
514*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, 2L, -5L, SKIP, 0, 0L, 0L,
515*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 5 */
516*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 5L, 1L, WILLBLOCK},
517*49cdfc7eSAndroid Build Coastguard Worker 
518*49cdfc7eSAndroid Build Coastguard Worker 	/*
519*49cdfc7eSAndroid Build Coastguard Worker 	 * #58 Parent making write lock from byte 3 to byte 7 with
520*49cdfc7eSAndroid Build Coastguard Worker 	 * L_start = 2 and L_len = -5
521*49cdfc7eSAndroid Build Coastguard Worker 	 */
522*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 1, 2L, -5L, SKIP, 0, 0L, 0L,
523*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 7 */
524*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 7L, 1L, WILLBLOCK},
525*49cdfc7eSAndroid Build Coastguard Worker 
526*49cdfc7eSAndroid Build Coastguard Worker 	/* Test case for block 4 */
527*49cdfc7eSAndroid Build Coastguard Worker 	/* #59 Parent making write lock on entire file */
528*49cdfc7eSAndroid Build Coastguard Worker 	{F_WRLCK, 0, 0L, 0L, SKIP, 0, 0L, 0L,
529*49cdfc7eSAndroid Build Coastguard Worker 	 /* Child attempting write lock on byte 15 to end of file */
530*49cdfc7eSAndroid Build Coastguard Worker 	 F_WRLCK, 0, 15L, 0L, WILLBLOCK},
531*49cdfc7eSAndroid Build Coastguard Worker };
532*49cdfc7eSAndroid Build Coastguard Worker 
533*49cdfc7eSAndroid Build Coastguard Worker static testcase *thiscase;
534*49cdfc7eSAndroid Build Coastguard Worker static struct flock flock;
535*49cdfc7eSAndroid Build Coastguard Worker static int parent, child, status, fail = 0;
536*49cdfc7eSAndroid Build Coastguard Worker static int got1 = 0;
537*49cdfc7eSAndroid Build Coastguard Worker static int fd;
538*49cdfc7eSAndroid Build Coastguard Worker static int test;
539*49cdfc7eSAndroid Build Coastguard Worker static char tmpname[40];
540*49cdfc7eSAndroid Build Coastguard Worker 
541*49cdfc7eSAndroid Build Coastguard Worker #define FILEDATA	"ten bytes!"
542*49cdfc7eSAndroid Build Coastguard Worker 
543*49cdfc7eSAndroid Build Coastguard Worker void catch1(int sig);
544*49cdfc7eSAndroid Build Coastguard Worker void catch_alarm(int sig);
545*49cdfc7eSAndroid Build Coastguard Worker 
546*49cdfc7eSAndroid Build Coastguard Worker char *TCID = "fcntl14";
547*49cdfc7eSAndroid Build Coastguard Worker int TST_TOTAL = 1;
548*49cdfc7eSAndroid Build Coastguard Worker int NO_NFS = 1;
549*49cdfc7eSAndroid Build Coastguard Worker 
cleanup(void)550*49cdfc7eSAndroid Build Coastguard Worker void cleanup(void)
551*49cdfc7eSAndroid Build Coastguard Worker {
552*49cdfc7eSAndroid Build Coastguard Worker 	tst_rmdir();
553*49cdfc7eSAndroid Build Coastguard Worker }
554*49cdfc7eSAndroid Build Coastguard Worker 
setup(void)555*49cdfc7eSAndroid Build Coastguard Worker void setup(void)
556*49cdfc7eSAndroid Build Coastguard Worker {
557*49cdfc7eSAndroid Build Coastguard Worker 	struct sigaction act;
558*49cdfc7eSAndroid Build Coastguard Worker 
559*49cdfc7eSAndroid Build Coastguard Worker 	tst_sig(FORK, DEF_HANDLER, cleanup);
560*49cdfc7eSAndroid Build Coastguard Worker 	signal(SIGHUP, SIG_IGN);
561*49cdfc7eSAndroid Build Coastguard Worker 	umask(0);
562*49cdfc7eSAndroid Build Coastguard Worker 	TEST_PAUSE;
563*49cdfc7eSAndroid Build Coastguard Worker 	tst_tmpdir();
564*49cdfc7eSAndroid Build Coastguard Worker 	parent = getpid();
565*49cdfc7eSAndroid Build Coastguard Worker 
566*49cdfc7eSAndroid Build Coastguard Worker 	sprintf(tmpname, "fcntl2.%d", parent);
567*49cdfc7eSAndroid Build Coastguard Worker 
568*49cdfc7eSAndroid Build Coastguard Worker 	/* setup signal handler for signal from child */
569*49cdfc7eSAndroid Build Coastguard Worker 	memset(&act, 0, sizeof(act));
570*49cdfc7eSAndroid Build Coastguard Worker 	act.sa_handler = catch1;
571*49cdfc7eSAndroid Build Coastguard Worker 	sigemptyset(&act.sa_mask);
572*49cdfc7eSAndroid Build Coastguard Worker 	sigaddset(&act.sa_mask, SIGUSR1);
573*49cdfc7eSAndroid Build Coastguard Worker 	if ((sigaction(SIGUSR1, &act, NULL)) < 0) {
574*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "SIGUSR1 signal setup failed, errno = %d",
575*49cdfc7eSAndroid Build Coastguard Worker 			 errno);
576*49cdfc7eSAndroid Build Coastguard Worker 		cleanup();
577*49cdfc7eSAndroid Build Coastguard Worker 	}
578*49cdfc7eSAndroid Build Coastguard Worker 
579*49cdfc7eSAndroid Build Coastguard Worker 	memset(&act, 0, sizeof(act));
580*49cdfc7eSAndroid Build Coastguard Worker 	act.sa_handler = catch_alarm;
581*49cdfc7eSAndroid Build Coastguard Worker 	sigemptyset(&act.sa_mask);
582*49cdfc7eSAndroid Build Coastguard Worker 	sigaddset(&act.sa_mask, SIGALRM);
583*49cdfc7eSAndroid Build Coastguard Worker 	if ((sigaction(SIGALRM, &act, NULL)) < 0) {
584*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "SIGALRM signal setup failed");
585*49cdfc7eSAndroid Build Coastguard Worker 		cleanup();
586*49cdfc7eSAndroid Build Coastguard Worker 	}
587*49cdfc7eSAndroid Build Coastguard Worker }
588*49cdfc7eSAndroid Build Coastguard Worker 
wake_parent(void)589*49cdfc7eSAndroid Build Coastguard Worker void wake_parent(void)
590*49cdfc7eSAndroid Build Coastguard Worker {
591*49cdfc7eSAndroid Build Coastguard Worker 	if ((kill(parent, SIGUSR1)) < 0) {
592*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Attempt to send signal to parent " "failed");
593*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Test case %d, errno = %d", test + 1, errno);
594*49cdfc7eSAndroid Build Coastguard Worker 		fail = 1;
595*49cdfc7eSAndroid Build Coastguard Worker 	}
596*49cdfc7eSAndroid Build Coastguard Worker }
597*49cdfc7eSAndroid Build Coastguard Worker 
do_usleep_child(void)598*49cdfc7eSAndroid Build Coastguard Worker void do_usleep_child(void)
599*49cdfc7eSAndroid Build Coastguard Worker {
600*49cdfc7eSAndroid Build Coastguard Worker 	usleep(100000);		/* XXX how long is long enough? */
601*49cdfc7eSAndroid Build Coastguard Worker 	wake_parent();
602*49cdfc7eSAndroid Build Coastguard Worker 	exit(0);
603*49cdfc7eSAndroid Build Coastguard Worker }
604*49cdfc7eSAndroid Build Coastguard Worker 
dochild(void)605*49cdfc7eSAndroid Build Coastguard Worker void dochild(void)
606*49cdfc7eSAndroid Build Coastguard Worker {
607*49cdfc7eSAndroid Build Coastguard Worker 	int rc;
608*49cdfc7eSAndroid Build Coastguard Worker 	pid_t pid;
609*49cdfc7eSAndroid Build Coastguard Worker 
610*49cdfc7eSAndroid Build Coastguard Worker 	flock.l_type = thiscase->c_type;
611*49cdfc7eSAndroid Build Coastguard Worker 	flock.l_whence = thiscase->c_whence;
612*49cdfc7eSAndroid Build Coastguard Worker 	flock.l_start = thiscase->c_start;
613*49cdfc7eSAndroid Build Coastguard Worker 	flock.l_len = thiscase->c_len;
614*49cdfc7eSAndroid Build Coastguard Worker 	flock.l_pid = 0;
615*49cdfc7eSAndroid Build Coastguard Worker 	fail = 0;
616*49cdfc7eSAndroid Build Coastguard Worker 
617*49cdfc7eSAndroid Build Coastguard Worker 	/*
618*49cdfc7eSAndroid Build Coastguard Worker 	 * Check to see if child lock will succeed. If it will, FLOCK
619*49cdfc7eSAndroid Build Coastguard Worker 	 * structure will return with l_type changed to F_UNLCK. If it will
620*49cdfc7eSAndroid Build Coastguard Worker 	 * not, the parent pid will be returned in l_pid and the type of
621*49cdfc7eSAndroid Build Coastguard Worker 	 * lock that will block it in l_type.
622*49cdfc7eSAndroid Build Coastguard Worker 	 */
623*49cdfc7eSAndroid Build Coastguard Worker 	if ((rc = fcntl(fd, F_GETLK, &flock)) < 0) {
624*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Attempt to check lock status failed");
625*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Test case %d, errno = %d", test + 1, errno);
626*49cdfc7eSAndroid Build Coastguard Worker 		fail = 1;
627*49cdfc7eSAndroid Build Coastguard Worker 	} else {
628*49cdfc7eSAndroid Build Coastguard Worker 
629*49cdfc7eSAndroid Build Coastguard Worker 		if ((thiscase->c_flag) == NOBLOCK) {
630*49cdfc7eSAndroid Build Coastguard Worker 			if (flock.l_type != F_UNLCK) {
631*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL,
632*49cdfc7eSAndroid Build Coastguard Worker 					 "Test case %d, GETLK: type = %d, "
633*49cdfc7eSAndroid Build Coastguard Worker 					 "%d was expected", test + 1,
634*49cdfc7eSAndroid Build Coastguard Worker 					 flock.l_type, F_UNLCK);
635*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
636*49cdfc7eSAndroid Build Coastguard Worker 			}
637*49cdfc7eSAndroid Build Coastguard Worker 
638*49cdfc7eSAndroid Build Coastguard Worker 			if (flock.l_whence != thiscase->c_whence) {
639*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL,
640*49cdfc7eSAndroid Build Coastguard Worker 					 "Test case %d, GETLK: whence = %d, "
641*49cdfc7eSAndroid Build Coastguard Worker 					 "should have remained %d", test + 1,
642*49cdfc7eSAndroid Build Coastguard Worker 					 flock.l_whence, thiscase->c_whence);
643*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
644*49cdfc7eSAndroid Build Coastguard Worker 			}
645*49cdfc7eSAndroid Build Coastguard Worker 
646*49cdfc7eSAndroid Build Coastguard Worker 			if (flock.l_start != thiscase->c_start) {
647*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL,
648*49cdfc7eSAndroid Build Coastguard Worker 					 "Test case %d, GETLK: start = %" PRId64
649*49cdfc7eSAndroid Build Coastguard Worker 					 ", " "should have remained %" PRId64,
650*49cdfc7eSAndroid Build Coastguard Worker 					 test + 1, (int64_t) flock.l_start,
651*49cdfc7eSAndroid Build Coastguard Worker 					 (int64_t) thiscase->c_start);
652*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
653*49cdfc7eSAndroid Build Coastguard Worker 			}
654*49cdfc7eSAndroid Build Coastguard Worker 
655*49cdfc7eSAndroid Build Coastguard Worker 			if (flock.l_len != thiscase->c_len) {
656*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL,
657*49cdfc7eSAndroid Build Coastguard Worker 					 "Test case %d, GETLK: len = %" PRId64
658*49cdfc7eSAndroid Build Coastguard Worker 					 ", " "should have remained %" PRId64,
659*49cdfc7eSAndroid Build Coastguard Worker 					 test + 1, (int64_t) flock.l_len,
660*49cdfc7eSAndroid Build Coastguard Worker 					 (int64_t) thiscase->c_len);
661*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
662*49cdfc7eSAndroid Build Coastguard Worker 			}
663*49cdfc7eSAndroid Build Coastguard Worker 
664*49cdfc7eSAndroid Build Coastguard Worker 			if (flock.l_pid != 0) {
665*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL,
666*49cdfc7eSAndroid Build Coastguard Worker 					 "Test case %d, GETLK: pid = %d, "
667*49cdfc7eSAndroid Build Coastguard Worker 					 "should have remained 0", test + 1,
668*49cdfc7eSAndroid Build Coastguard Worker 					 flock.l_pid);
669*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
670*49cdfc7eSAndroid Build Coastguard Worker 			}
671*49cdfc7eSAndroid Build Coastguard Worker 		} else {
672*49cdfc7eSAndroid Build Coastguard Worker 			if (flock.l_pid != parent) {
673*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL,
674*49cdfc7eSAndroid Build Coastguard Worker 					 "Test case %d, GETLK: pid = %d, "
675*49cdfc7eSAndroid Build Coastguard Worker 					 "should be parent's id of %d",
676*49cdfc7eSAndroid Build Coastguard Worker 					 test + 1, flock.l_pid, parent);
677*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
678*49cdfc7eSAndroid Build Coastguard Worker 			}
679*49cdfc7eSAndroid Build Coastguard Worker 
680*49cdfc7eSAndroid Build Coastguard Worker 			if (flock.l_type != thiscase->a_type) {
681*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL,
682*49cdfc7eSAndroid Build Coastguard Worker 					 "Test case %d, GETLK: type = %d, "
683*49cdfc7eSAndroid Build Coastguard Worker 					 "should be parent's first lock type of %d",
684*49cdfc7eSAndroid Build Coastguard Worker 					 test + 1, flock.l_type,
685*49cdfc7eSAndroid Build Coastguard Worker 					 thiscase->a_type);
686*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
687*49cdfc7eSAndroid Build Coastguard Worker 			}
688*49cdfc7eSAndroid Build Coastguard Worker 		}
689*49cdfc7eSAndroid Build Coastguard Worker 	}
690*49cdfc7eSAndroid Build Coastguard Worker 
691*49cdfc7eSAndroid Build Coastguard Worker 	/*
692*49cdfc7eSAndroid Build Coastguard Worker 	 * now try to set the lock, nonblocking
693*49cdfc7eSAndroid Build Coastguard Worker 	 * This will succeed for NOBLOCK,
694*49cdfc7eSAndroid Build Coastguard Worker 	 * fail for WILLBLOCK
695*49cdfc7eSAndroid Build Coastguard Worker 	 */
696*49cdfc7eSAndroid Build Coastguard Worker 	flock.l_type = thiscase->c_type;
697*49cdfc7eSAndroid Build Coastguard Worker 	flock.l_whence = thiscase->c_whence;
698*49cdfc7eSAndroid Build Coastguard Worker 	flock.l_start = thiscase->c_start;
699*49cdfc7eSAndroid Build Coastguard Worker 	flock.l_len = thiscase->c_len;
700*49cdfc7eSAndroid Build Coastguard Worker 	flock.l_pid = 0;
701*49cdfc7eSAndroid Build Coastguard Worker 
702*49cdfc7eSAndroid Build Coastguard Worker 	if ((rc = fcntl(fd, F_SETLK, &flock)) < 0) {
703*49cdfc7eSAndroid Build Coastguard Worker 		if ((thiscase->c_flag) == NOBLOCK) {
704*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "Attempt to set child NONBLOCKING "
705*49cdfc7eSAndroid Build Coastguard Worker 				 "lock failed");
706*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "Test case %d, errno = %d",
707*49cdfc7eSAndroid Build Coastguard Worker 				 test + 1, errno);
708*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
709*49cdfc7eSAndroid Build Coastguard Worker 		}
710*49cdfc7eSAndroid Build Coastguard Worker 	}
711*49cdfc7eSAndroid Build Coastguard Worker 
712*49cdfc7eSAndroid Build Coastguard Worker 	if ((thiscase->c_flag) == WILLBLOCK) {
713*49cdfc7eSAndroid Build Coastguard Worker 		if (rc != -1 || (errno != EACCES && errno != EAGAIN)) {
714*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL,
715*49cdfc7eSAndroid Build Coastguard Worker 				 "SETLK: rc = %d, errno = %d, -1/EAGAIN or EACCES "
716*49cdfc7eSAndroid Build Coastguard Worker 				 "was expected", rc, errno);
717*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
718*49cdfc7eSAndroid Build Coastguard Worker 		}
719*49cdfc7eSAndroid Build Coastguard Worker 		if (rc == 0) {
720*49cdfc7eSAndroid Build Coastguard Worker 			/* accidentally got the lock */
721*49cdfc7eSAndroid Build Coastguard Worker 			/* XXX how to clean up? */
722*49cdfc7eSAndroid Build Coastguard Worker 			(void)fcntl(fd, F_UNLCK, &flock);
723*49cdfc7eSAndroid Build Coastguard Worker 		}
724*49cdfc7eSAndroid Build Coastguard Worker 		/*
725*49cdfc7eSAndroid Build Coastguard Worker 		 * Lock should succeed after blocking and parent releases
726*49cdfc7eSAndroid Build Coastguard Worker 		 * lock, tell the parent to release the locks.
727*49cdfc7eSAndroid Build Coastguard Worker 		 * Do the lock in this process, send the signal in a child
728*49cdfc7eSAndroid Build Coastguard Worker 		 * process, so that the SETLKW actually uses the blocking
729*49cdfc7eSAndroid Build Coastguard Worker 		 * mechanism in the kernel.
730*49cdfc7eSAndroid Build Coastguard Worker 		 *
731*49cdfc7eSAndroid Build Coastguard Worker 		 * XXX inherent race: we want to wait until the
732*49cdfc7eSAndroid Build Coastguard Worker 		 * F_SETLKW has started, but we don't have a way to
733*49cdfc7eSAndroid Build Coastguard Worker 		 * check that reliably in the child.  (We'd
734*49cdfc7eSAndroid Build Coastguard Worker 		 * need some way to have fcntl() atomically unblock a
735*49cdfc7eSAndroid Build Coastguard Worker 		 * signal and wait for the lock.)
736*49cdfc7eSAndroid Build Coastguard Worker 		 */
737*49cdfc7eSAndroid Build Coastguard Worker 		pid = tst_fork();
738*49cdfc7eSAndroid Build Coastguard Worker 		switch (pid) {
739*49cdfc7eSAndroid Build Coastguard Worker 		case -1:
740*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "Fork failed");
741*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
742*49cdfc7eSAndroid Build Coastguard Worker 			break;
743*49cdfc7eSAndroid Build Coastguard Worker 		case 0:
744*49cdfc7eSAndroid Build Coastguard Worker 			do_usleep_child();
745*49cdfc7eSAndroid Build Coastguard Worker 			break;
746*49cdfc7eSAndroid Build Coastguard Worker 
747*49cdfc7eSAndroid Build Coastguard Worker 		default:
748*49cdfc7eSAndroid Build Coastguard Worker 			if ((rc = fcntl(fd, F_SETLKW, &flock)) < 0) {
749*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL, "Attempt to set child BLOCKING "
750*49cdfc7eSAndroid Build Coastguard Worker 					 "lock failed");
751*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL, "Test case %d, errno = %d",
752*49cdfc7eSAndroid Build Coastguard Worker 					 test + 1, errno);
753*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
754*49cdfc7eSAndroid Build Coastguard Worker 			}
755*49cdfc7eSAndroid Build Coastguard Worker 			waitpid(pid, &status, 0);
756*49cdfc7eSAndroid Build Coastguard Worker 			break;
757*49cdfc7eSAndroid Build Coastguard Worker 		}
758*49cdfc7eSAndroid Build Coastguard Worker 	}
759*49cdfc7eSAndroid Build Coastguard Worker 	if (fail) {
760*49cdfc7eSAndroid Build Coastguard Worker 		exit(1);
761*49cdfc7eSAndroid Build Coastguard Worker 	} else {
762*49cdfc7eSAndroid Build Coastguard Worker 		exit(0);
763*49cdfc7eSAndroid Build Coastguard Worker 	}
764*49cdfc7eSAndroid Build Coastguard Worker }
765*49cdfc7eSAndroid Build Coastguard Worker 
run_test(int file_flag,int file_mode,int seek,int start,int end)766*49cdfc7eSAndroid Build Coastguard Worker void run_test(int file_flag, int file_mode, int seek, int start, int end)
767*49cdfc7eSAndroid Build Coastguard Worker {
768*49cdfc7eSAndroid Build Coastguard Worker 	fail = 0;
769*49cdfc7eSAndroid Build Coastguard Worker 
770*49cdfc7eSAndroid Build Coastguard Worker 	for (test = start; test < end; test++) {
771*49cdfc7eSAndroid Build Coastguard Worker 		fd = SAFE_OPEN(cleanup, tmpname, file_flag, file_mode);
772*49cdfc7eSAndroid Build Coastguard Worker 
773*49cdfc7eSAndroid Build Coastguard Worker 		if (write(fd, FILEDATA, 10) < 0)
774*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK, cleanup, "write() failed");
775*49cdfc7eSAndroid Build Coastguard Worker 
776*49cdfc7eSAndroid Build Coastguard Worker 		if (seek) {
777*49cdfc7eSAndroid Build Coastguard Worker 			SAFE_LSEEK(cleanup, fd, seek, 0);
778*49cdfc7eSAndroid Build Coastguard Worker 		}
779*49cdfc7eSAndroid Build Coastguard Worker 
780*49cdfc7eSAndroid Build Coastguard Worker 		thiscase = &testcases[test];
781*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_type = thiscase->a_type;
782*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_whence = thiscase->a_whence;
783*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_start = thiscase->a_start;
784*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_len = thiscase->a_len;
785*49cdfc7eSAndroid Build Coastguard Worker 
786*49cdfc7eSAndroid Build Coastguard Worker 		/* set the initial parent lock on the file */
787*49cdfc7eSAndroid Build Coastguard Worker 		if ((fcntl(fd, F_SETLK, &flock)) < 0) {
788*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "First parent lock failed");
789*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "Test case %d, errno = %d",
790*49cdfc7eSAndroid Build Coastguard Worker 				 test + 1, errno);
791*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
792*49cdfc7eSAndroid Build Coastguard Worker 		}
793*49cdfc7eSAndroid Build Coastguard Worker 
794*49cdfc7eSAndroid Build Coastguard Worker 		if ((thiscase->b_type) != SKIP) {
795*49cdfc7eSAndroid Build Coastguard Worker 			flock.l_type = thiscase->b_type;
796*49cdfc7eSAndroid Build Coastguard Worker 			flock.l_whence = thiscase->b_whence;
797*49cdfc7eSAndroid Build Coastguard Worker 			flock.l_start = thiscase->b_start;
798*49cdfc7eSAndroid Build Coastguard Worker 			flock.l_len = thiscase->b_len;
799*49cdfc7eSAndroid Build Coastguard Worker 
800*49cdfc7eSAndroid Build Coastguard Worker 			/* set the second parent lock */
801*49cdfc7eSAndroid Build Coastguard Worker 			if ((fcntl(fd, F_SETLK, &flock)) < 0) {
802*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL, "Second parent lock failed");
803*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL, "Test case %d, errno = %d",
804*49cdfc7eSAndroid Build Coastguard Worker 					 test + 1, errno);
805*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
806*49cdfc7eSAndroid Build Coastguard Worker 			}
807*49cdfc7eSAndroid Build Coastguard Worker 		}
808*49cdfc7eSAndroid Build Coastguard Worker 		if ((thiscase->c_type) == SKIP) {
809*49cdfc7eSAndroid Build Coastguard Worker 			close(fd);
810*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TINFO, "skipping test %d", test + 1);
811*49cdfc7eSAndroid Build Coastguard Worker 			continue;
812*49cdfc7eSAndroid Build Coastguard Worker 		}
813*49cdfc7eSAndroid Build Coastguard Worker 
814*49cdfc7eSAndroid Build Coastguard Worker 		/* Mask SIG_USR1 before forking child, to avoid race */
815*49cdfc7eSAndroid Build Coastguard Worker 		(void)sighold(SIGUSR1);
816*49cdfc7eSAndroid Build Coastguard Worker 
817*49cdfc7eSAndroid Build Coastguard Worker 		/* flush the stdout to avoid garbled output */
818*49cdfc7eSAndroid Build Coastguard Worker 		fflush(stdout);
819*49cdfc7eSAndroid Build Coastguard Worker 
820*49cdfc7eSAndroid Build Coastguard Worker 		if ((child = tst_fork()) == 0)
821*49cdfc7eSAndroid Build Coastguard Worker 			dochild();
822*49cdfc7eSAndroid Build Coastguard Worker 
823*49cdfc7eSAndroid Build Coastguard Worker 		if (child < 0)
824*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK|TERRNO, cleanup, "Fork failed");
825*49cdfc7eSAndroid Build Coastguard Worker 
826*49cdfc7eSAndroid Build Coastguard Worker 		if ((thiscase->c_flag) == WILLBLOCK) {
827*49cdfc7eSAndroid Build Coastguard Worker 			/*
828*49cdfc7eSAndroid Build Coastguard Worker 			 * Wait for a signal from the child then remove
829*49cdfc7eSAndroid Build Coastguard Worker 			 * blocking lock. Set a 60 second alarm to break the
830*49cdfc7eSAndroid Build Coastguard Worker 			 * pause just in case the child never signals us.
831*49cdfc7eSAndroid Build Coastguard Worker 			 */
832*49cdfc7eSAndroid Build Coastguard Worker 			alarm(TIME_OUT);
833*49cdfc7eSAndroid Build Coastguard Worker 			sigpause(SIGUSR1);
834*49cdfc7eSAndroid Build Coastguard Worker 
835*49cdfc7eSAndroid Build Coastguard Worker 			/* turn off the alarm timer */
836*49cdfc7eSAndroid Build Coastguard Worker 			alarm((unsigned)0);
837*49cdfc7eSAndroid Build Coastguard Worker 			if (got1 != 1)
838*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TINFO, "Pause terminated without "
839*49cdfc7eSAndroid Build Coastguard Worker 					 "signal SIGUSR1 from child");
840*49cdfc7eSAndroid Build Coastguard Worker 			got1 = 0;
841*49cdfc7eSAndroid Build Coastguard Worker 
842*49cdfc7eSAndroid Build Coastguard Worker 			/*
843*49cdfc7eSAndroid Build Coastguard Worker 			 * setup lock structure for parent to delete
844*49cdfc7eSAndroid Build Coastguard Worker 			 * blocking lock then wait for child to exit
845*49cdfc7eSAndroid Build Coastguard Worker 			 */
846*49cdfc7eSAndroid Build Coastguard Worker 			flock.l_type = F_UNLCK;
847*49cdfc7eSAndroid Build Coastguard Worker 			flock.l_whence = 0;
848*49cdfc7eSAndroid Build Coastguard Worker 			flock.l_start = 0L;
849*49cdfc7eSAndroid Build Coastguard Worker 			flock.l_len = 0L;
850*49cdfc7eSAndroid Build Coastguard Worker 			if ((fcntl(fd, F_SETLK, &flock)) < 0) {
851*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL, "Attempt to release parent "
852*49cdfc7eSAndroid Build Coastguard Worker 					 "lock failed");
853*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL, "Test case %d, errno = %d",
854*49cdfc7eSAndroid Build Coastguard Worker 					 test + 1, errno);
855*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
856*49cdfc7eSAndroid Build Coastguard Worker 			}
857*49cdfc7eSAndroid Build Coastguard Worker 		}
858*49cdfc7eSAndroid Build Coastguard Worker 		/*
859*49cdfc7eSAndroid Build Coastguard Worker 		 * set a 60 second alarm to break the wait just in case the
860*49cdfc7eSAndroid Build Coastguard Worker 		 * child doesn't terminate on its own accord
861*49cdfc7eSAndroid Build Coastguard Worker 		 */
862*49cdfc7eSAndroid Build Coastguard Worker 		alarm(TIME_OUT);
863*49cdfc7eSAndroid Build Coastguard Worker 
864*49cdfc7eSAndroid Build Coastguard Worker 		/* wait for the child to terminate and close the file */
865*49cdfc7eSAndroid Build Coastguard Worker 		waitpid(child, &status, 0);
866*49cdfc7eSAndroid Build Coastguard Worker 		/* turn off the alarm clock */
867*49cdfc7eSAndroid Build Coastguard Worker 		alarm((unsigned)0);
868*49cdfc7eSAndroid Build Coastguard Worker 		if (status != 0) {
869*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "tchild returned status 0x%x", status);
870*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
871*49cdfc7eSAndroid Build Coastguard Worker 		}
872*49cdfc7eSAndroid Build Coastguard Worker 		close(fd);
873*49cdfc7eSAndroid Build Coastguard Worker 		if (fail)
874*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "testcase:%d FAILED", test + 1);
875*49cdfc7eSAndroid Build Coastguard Worker 		else
876*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TPASS, "testcase:%d PASSED", test + 1);
877*49cdfc7eSAndroid Build Coastguard Worker 	}
878*49cdfc7eSAndroid Build Coastguard Worker 	unlink(tmpname);
879*49cdfc7eSAndroid Build Coastguard Worker }
880*49cdfc7eSAndroid Build Coastguard Worker 
catch_alarm(int sig)881*49cdfc7eSAndroid Build Coastguard Worker void catch_alarm(int sig)
882*49cdfc7eSAndroid Build Coastguard Worker {
883*49cdfc7eSAndroid Build Coastguard Worker 	/*
884*49cdfc7eSAndroid Build Coastguard Worker 	 * Timer has runout and child has not signaled, need
885*49cdfc7eSAndroid Build Coastguard Worker 	 * to kill off the child as it appears it will not
886*49cdfc7eSAndroid Build Coastguard Worker 	 * on its own accord. Check that it is still around
887*49cdfc7eSAndroid Build Coastguard Worker 	 * as it may have terminated abnormally while parent
888*49cdfc7eSAndroid Build Coastguard Worker 	 * was waiting for SIGUSR1 signal from it.
889*49cdfc7eSAndroid Build Coastguard Worker 	 */
890*49cdfc7eSAndroid Build Coastguard Worker 	if (kill(child, 0) == 0) {
891*49cdfc7eSAndroid Build Coastguard Worker 		kill(child, SIGKILL);
892*49cdfc7eSAndroid Build Coastguard Worker 		perror("The child didnot terminate on its own accord");
893*49cdfc7eSAndroid Build Coastguard Worker 	}
894*49cdfc7eSAndroid Build Coastguard Worker }
895*49cdfc7eSAndroid Build Coastguard Worker 
catch1(int sig)896*49cdfc7eSAndroid Build Coastguard Worker void catch1(int sig)
897*49cdfc7eSAndroid Build Coastguard Worker {
898*49cdfc7eSAndroid Build Coastguard Worker 	struct sigaction act;
899*49cdfc7eSAndroid Build Coastguard Worker 
900*49cdfc7eSAndroid Build Coastguard Worker 	/*
901*49cdfc7eSAndroid Build Coastguard Worker 	 * Set flag to let parent know that child is ready to have lock
902*49cdfc7eSAndroid Build Coastguard Worker 	 * removed
903*49cdfc7eSAndroid Build Coastguard Worker 	 */
904*49cdfc7eSAndroid Build Coastguard Worker 	memset(&act, 0, sizeof(act));
905*49cdfc7eSAndroid Build Coastguard Worker 	act.sa_handler = catch1;
906*49cdfc7eSAndroid Build Coastguard Worker 	sigemptyset(&act.sa_mask);
907*49cdfc7eSAndroid Build Coastguard Worker 	sigaddset(&act.sa_mask, SIGUSR1);
908*49cdfc7eSAndroid Build Coastguard Worker 	sigaction(SIGUSR1, &act, NULL);
909*49cdfc7eSAndroid Build Coastguard Worker 	got1++;
910*49cdfc7eSAndroid Build Coastguard Worker }
911*49cdfc7eSAndroid Build Coastguard Worker 
testcheck_end(int check_fail,char * msg)912*49cdfc7eSAndroid Build Coastguard Worker static void testcheck_end(int check_fail, char *msg)
913*49cdfc7eSAndroid Build Coastguard Worker {
914*49cdfc7eSAndroid Build Coastguard Worker 	if (check_fail)
915*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "%s FAILED", msg);
916*49cdfc7eSAndroid Build Coastguard Worker 	else
917*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TPASS, "%s PASSED", msg);
918*49cdfc7eSAndroid Build Coastguard Worker }
919*49cdfc7eSAndroid Build Coastguard Worker 
main(int ac,char ** av)920*49cdfc7eSAndroid Build Coastguard Worker int main(int ac, char **av)
921*49cdfc7eSAndroid Build Coastguard Worker {
922*49cdfc7eSAndroid Build Coastguard Worker 	int lc;
923*49cdfc7eSAndroid Build Coastguard Worker 
924*49cdfc7eSAndroid Build Coastguard Worker 	tst_parse_opts(ac, av, NULL, NULL);
925*49cdfc7eSAndroid Build Coastguard Worker 
926*49cdfc7eSAndroid Build Coastguard Worker 	setup();
927*49cdfc7eSAndroid Build Coastguard Worker 
928*49cdfc7eSAndroid Build Coastguard Worker 	if (tst_fs_type(cleanup, ".") == TST_NFS_MAGIC)
929*49cdfc7eSAndroid Build Coastguard Worker 		NO_NFS = 0;
930*49cdfc7eSAndroid Build Coastguard Worker 
931*49cdfc7eSAndroid Build Coastguard Worker 	for (lc = 0; TEST_LOOPING(lc); lc++) {
932*49cdfc7eSAndroid Build Coastguard Worker 		tst_count = 0;
933*49cdfc7eSAndroid Build Coastguard Worker 
934*49cdfc7eSAndroid Build Coastguard Worker /* //block1: */
935*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Enter block 1: without mandatory locking");
936*49cdfc7eSAndroid Build Coastguard Worker 		fail = 0;
937*49cdfc7eSAndroid Build Coastguard Worker 		/*
938*49cdfc7eSAndroid Build Coastguard Worker 		 * try various file locks on an ordinary file without
939*49cdfc7eSAndroid Build Coastguard Worker 		 * mandatory locking
940*49cdfc7eSAndroid Build Coastguard Worker 		 */
941*49cdfc7eSAndroid Build Coastguard Worker 		(void)run_test(O_CREAT | O_RDWR | O_TRUNC, 0777, 0, 0, 36);
942*49cdfc7eSAndroid Build Coastguard Worker 		testcheck_end(fail, "Block 1, test 1");
943*49cdfc7eSAndroid Build Coastguard Worker 
944*49cdfc7eSAndroid Build Coastguard Worker 		/* Now try with negative values for L_start and L_len */
945*49cdfc7eSAndroid Build Coastguard Worker 		(void)run_test(O_CREAT | O_RDWR | O_TRUNC, 0777, 5, 36, 45);
946*49cdfc7eSAndroid Build Coastguard Worker 		testcheck_end(fail, "Block 1, test 2");
947*49cdfc7eSAndroid Build Coastguard Worker 
948*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Exit block 1");
949*49cdfc7eSAndroid Build Coastguard Worker 
950*49cdfc7eSAndroid Build Coastguard Worker /* //block2: */
951*49cdfc7eSAndroid Build Coastguard Worker 		/*
952*49cdfc7eSAndroid Build Coastguard Worker 		 * Skip block2 if test on NFS, since NFS does not support
953*49cdfc7eSAndroid Build Coastguard Worker 		 * mandatory locking
954*49cdfc7eSAndroid Build Coastguard Worker 		 */
955*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Enter block 2: with mandatory locking");
956*49cdfc7eSAndroid Build Coastguard Worker 		if (NO_NFS) {
957*49cdfc7eSAndroid Build Coastguard Worker 			fail = 0;
958*49cdfc7eSAndroid Build Coastguard Worker 			/*
959*49cdfc7eSAndroid Build Coastguard Worker 			 * Try various locks on a file with mandatory
960*49cdfc7eSAndroid Build Coastguard Worker 			 * record locking this should behave the same
961*49cdfc7eSAndroid Build Coastguard Worker 			 * as an ordinary file
962*49cdfc7eSAndroid Build Coastguard Worker 			 */
963*49cdfc7eSAndroid Build Coastguard Worker 			(void)run_test(O_CREAT | O_RDWR | O_TRUNC,
964*49cdfc7eSAndroid Build Coastguard Worker 				S_ENFMT | S_IRUSR | S_IWUSR, 0, 0, 36);
965*49cdfc7eSAndroid Build Coastguard Worker 			testcheck_end(fail, "Block 2, test 1");
966*49cdfc7eSAndroid Build Coastguard Worker 
967*49cdfc7eSAndroid Build Coastguard Worker 			/* Now try negative values for L_start and L_len */
968*49cdfc7eSAndroid Build Coastguard Worker 			(void)run_test(O_CREAT | O_RDWR | O_TRUNC,
969*49cdfc7eSAndroid Build Coastguard Worker 				S_ENFMT | S_IRUSR | S_IWUSR, 5, 36, 45);
970*49cdfc7eSAndroid Build Coastguard Worker 			testcheck_end(fail, "Block 2, test 2");
971*49cdfc7eSAndroid Build Coastguard Worker 		} else {
972*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TCONF, "Skip block 2 as NFS does not"
973*49cdfc7eSAndroid Build Coastguard Worker 				" support mandatory locking");
974*49cdfc7eSAndroid Build Coastguard Worker 		}
975*49cdfc7eSAndroid Build Coastguard Worker 
976*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Exit block 2");
977*49cdfc7eSAndroid Build Coastguard Worker 
978*49cdfc7eSAndroid Build Coastguard Worker /* //block3: */
979*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Enter block 3");
980*49cdfc7eSAndroid Build Coastguard Worker 		fail = 0;
981*49cdfc7eSAndroid Build Coastguard Worker 		/*
982*49cdfc7eSAndroid Build Coastguard Worker 		 * Check that proper error status is returned when invalid
983*49cdfc7eSAndroid Build Coastguard Worker 		 * argument used for WHENCE (negative value)
984*49cdfc7eSAndroid Build Coastguard Worker 		 */
985*49cdfc7eSAndroid Build Coastguard Worker 
986*49cdfc7eSAndroid Build Coastguard Worker 		fd = SAFE_OPEN(cleanup, tmpname, O_CREAT | O_RDWR | O_TRUNC,
987*49cdfc7eSAndroid Build Coastguard Worker 			       0777);
988*49cdfc7eSAndroid Build Coastguard Worker 
989*49cdfc7eSAndroid Build Coastguard Worker 		if (write(fd, FILEDATA, 10) < 0)
990*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK, cleanup, "write failed");
991*49cdfc7eSAndroid Build Coastguard Worker 
992*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_type = F_WRLCK;
993*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_whence = -1;
994*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_start = 0L;
995*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_len = 0L;
996*49cdfc7eSAndroid Build Coastguard Worker 
997*49cdfc7eSAndroid Build Coastguard Worker 		if ((fcntl(fd, F_SETLK, &flock)) < 0) {
998*49cdfc7eSAndroid Build Coastguard Worker 			if (errno != EINVAL) {
999*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL, "Expected %d got %d",
1000*49cdfc7eSAndroid Build Coastguard Worker 					 EINVAL, errno);
1001*49cdfc7eSAndroid Build Coastguard Worker 				fail = 1;
1002*49cdfc7eSAndroid Build Coastguard Worker 			}
1003*49cdfc7eSAndroid Build Coastguard Worker 		} else {
1004*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "Lock succeeded when it should have "
1005*49cdfc7eSAndroid Build Coastguard Worker 				 "failed");
1006*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
1007*49cdfc7eSAndroid Build Coastguard Worker 		}
1008*49cdfc7eSAndroid Build Coastguard Worker 
1009*49cdfc7eSAndroid Build Coastguard Worker 		close(fd);
1010*49cdfc7eSAndroid Build Coastguard Worker 		unlink(tmpname);
1011*49cdfc7eSAndroid Build Coastguard Worker 
1012*49cdfc7eSAndroid Build Coastguard Worker 		testcheck_end(fail, "Test with negative whence locking");
1013*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Exit block 3");
1014*49cdfc7eSAndroid Build Coastguard Worker 
1015*49cdfc7eSAndroid Build Coastguard Worker /* //block4: */
1016*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Enter block 4");
1017*49cdfc7eSAndroid Build Coastguard Worker 		fail = 0;
1018*49cdfc7eSAndroid Build Coastguard Worker 		/*
1019*49cdfc7eSAndroid Build Coastguard Worker 		 * Check that a lock on end of file is still valid when
1020*49cdfc7eSAndroid Build Coastguard Worker 		 * additional data is appended to end of file and a new
1021*49cdfc7eSAndroid Build Coastguard Worker 		 * process attempts to lock new data
1022*49cdfc7eSAndroid Build Coastguard Worker 		 */
1023*49cdfc7eSAndroid Build Coastguard Worker 		fd = SAFE_OPEN(cleanup, tmpname, O_CREAT | O_RDWR | O_TRUNC,
1024*49cdfc7eSAndroid Build Coastguard Worker 			       0777);
1025*49cdfc7eSAndroid Build Coastguard Worker 
1026*49cdfc7eSAndroid Build Coastguard Worker 		if (write(fd, FILEDATA, 10) < 0)
1027*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK, cleanup, "write failed");
1028*49cdfc7eSAndroid Build Coastguard Worker 
1029*49cdfc7eSAndroid Build Coastguard Worker 		thiscase = &testcases[58];
1030*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_type = thiscase->a_type;
1031*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_whence = thiscase->a_whence;
1032*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_start = thiscase->a_start;
1033*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_len = thiscase->a_len;
1034*49cdfc7eSAndroid Build Coastguard Worker 
1035*49cdfc7eSAndroid Build Coastguard Worker 		/* Set the initial parent lock on the file */
1036*49cdfc7eSAndroid Build Coastguard Worker 		if ((fcntl(fd, F_SETLK, &flock)) < 0) {
1037*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "First parent lock failed");
1038*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "Test case %d, errno = %d", 58, errno);
1039*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
1040*49cdfc7eSAndroid Build Coastguard Worker 		}
1041*49cdfc7eSAndroid Build Coastguard Worker 
1042*49cdfc7eSAndroid Build Coastguard Worker 		/* Write some additional data to end of file */
1043*49cdfc7eSAndroid Build Coastguard Worker 		if (write(fd, FILEDATA, 10) < 0)
1044*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK, cleanup, "write failed");
1045*49cdfc7eSAndroid Build Coastguard Worker 
1046*49cdfc7eSAndroid Build Coastguard Worker 		/* Mask signal to avoid race */
1047*49cdfc7eSAndroid Build Coastguard Worker 		if (sighold(SIGUSR1) < 0)
1048*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK, cleanup, "sighold failed");
1049*49cdfc7eSAndroid Build Coastguard Worker 
1050*49cdfc7eSAndroid Build Coastguard Worker 		if ((child = tst_fork()) == 0)
1051*49cdfc7eSAndroid Build Coastguard Worker 			dochild();
1052*49cdfc7eSAndroid Build Coastguard Worker 
1053*49cdfc7eSAndroid Build Coastguard Worker 		if (child < 0)
1054*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK|TERRNO, cleanup, "Fork failed");
1055*49cdfc7eSAndroid Build Coastguard Worker 
1056*49cdfc7eSAndroid Build Coastguard Worker 		/*
1057*49cdfc7eSAndroid Build Coastguard Worker 		 * Wait for a signal from the child then remove blocking lock.
1058*49cdfc7eSAndroid Build Coastguard Worker 		 * Set a 60 sec alarm to break the pause just in case the
1059*49cdfc7eSAndroid Build Coastguard Worker 		 * child doesn't terminate on its own accord
1060*49cdfc7eSAndroid Build Coastguard Worker 		 */
1061*49cdfc7eSAndroid Build Coastguard Worker 		(void)alarm(TIME_OUT);
1062*49cdfc7eSAndroid Build Coastguard Worker 
1063*49cdfc7eSAndroid Build Coastguard Worker 		(void)sigpause(SIGUSR1);
1064*49cdfc7eSAndroid Build Coastguard Worker 
1065*49cdfc7eSAndroid Build Coastguard Worker 		/* turn off the alarm timer */
1066*49cdfc7eSAndroid Build Coastguard Worker 		(void)alarm((unsigned)0);
1067*49cdfc7eSAndroid Build Coastguard Worker 		if (got1 != 1) {
1068*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TINFO, "Pause terminated without signal "
1069*49cdfc7eSAndroid Build Coastguard Worker 				 "SIGUSR1 from child");
1070*49cdfc7eSAndroid Build Coastguard Worker 		}
1071*49cdfc7eSAndroid Build Coastguard Worker 		got1 = 0;
1072*49cdfc7eSAndroid Build Coastguard Worker 
1073*49cdfc7eSAndroid Build Coastguard Worker 		/*
1074*49cdfc7eSAndroid Build Coastguard Worker 		 * Set up lock structure for parent to delete
1075*49cdfc7eSAndroid Build Coastguard Worker 		 * blocking lock then wait for child to exit
1076*49cdfc7eSAndroid Build Coastguard Worker 		 */
1077*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_type = F_UNLCK;
1078*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_whence = 0;
1079*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_start = 0L;
1080*49cdfc7eSAndroid Build Coastguard Worker 		flock.l_len = 0L;
1081*49cdfc7eSAndroid Build Coastguard Worker 		if ((fcntl(fd, F_SETLK, &flock)) < 0) {
1082*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "Attempt to release parent lock "
1083*49cdfc7eSAndroid Build Coastguard Worker 				 "failed");
1084*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "Test case %d, errno = %d", test + 1,
1085*49cdfc7eSAndroid Build Coastguard Worker 				 errno);
1086*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
1087*49cdfc7eSAndroid Build Coastguard Worker 		}
1088*49cdfc7eSAndroid Build Coastguard Worker 
1089*49cdfc7eSAndroid Build Coastguard Worker 		/*
1090*49cdfc7eSAndroid Build Coastguard Worker 		 * set a 60 sec alarm to break the wait just in case the
1091*49cdfc7eSAndroid Build Coastguard Worker 		 * child doesn't terminate on its own accord
1092*49cdfc7eSAndroid Build Coastguard Worker 		 */
1093*49cdfc7eSAndroid Build Coastguard Worker 		(void)alarm(TIME_OUT);
1094*49cdfc7eSAndroid Build Coastguard Worker 
1095*49cdfc7eSAndroid Build Coastguard Worker 		waitpid(child, &status, 0);
1096*49cdfc7eSAndroid Build Coastguard Worker 		if (WEXITSTATUS(status) != 0) {
1097*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
1098*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "child returned bad exit status");
1099*49cdfc7eSAndroid Build Coastguard Worker 		}
1100*49cdfc7eSAndroid Build Coastguard Worker 
1101*49cdfc7eSAndroid Build Coastguard Worker 		/* turn off the alarm clock */
1102*49cdfc7eSAndroid Build Coastguard Worker 		(void)alarm((unsigned)0);
1103*49cdfc7eSAndroid Build Coastguard Worker 		if (status != 0) {
1104*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "child returned status 0x%x", status);
1105*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
1106*49cdfc7eSAndroid Build Coastguard Worker 		}
1107*49cdfc7eSAndroid Build Coastguard Worker 		close(fd);
1108*49cdfc7eSAndroid Build Coastguard Worker 		unlink(tmpname);
1109*49cdfc7eSAndroid Build Coastguard Worker 
1110*49cdfc7eSAndroid Build Coastguard Worker 		testcheck_end(fail, "Test of locks on file");
1111*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Exit block 4");
1112*49cdfc7eSAndroid Build Coastguard Worker 	}
1113*49cdfc7eSAndroid Build Coastguard Worker 	cleanup();
1114*49cdfc7eSAndroid Build Coastguard Worker 	tst_exit();
1115*49cdfc7eSAndroid Build Coastguard Worker }
1116