fcntl20.c revision d34d581c6a320e356a6cda923c7aa399479e812c
1865695bbc89088b9526ea9045410e5afb70a985cplars/*
2865695bbc89088b9526ea9045410e5afb70a985cplars *
3865695bbc89088b9526ea9045410e5afb70a985cplars *   Copyright (c) International Business Machines  Corp., 2001
4865695bbc89088b9526ea9045410e5afb70a985cplars *
5865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is free software;  you can redistribute it and/or modify
6865695bbc89088b9526ea9045410e5afb70a985cplars *   it under the terms of the GNU General Public License as published by
7865695bbc89088b9526ea9045410e5afb70a985cplars *   the Free Software Foundation; either version 2 of the License, or
8865695bbc89088b9526ea9045410e5afb70a985cplars *   (at your option) any later version.
9865695bbc89088b9526ea9045410e5afb70a985cplars *
10865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is distributed in the hope that it will be useful,
11865695bbc89088b9526ea9045410e5afb70a985cplars *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12865695bbc89088b9526ea9045410e5afb70a985cplars *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13865695bbc89088b9526ea9045410e5afb70a985cplars *   the GNU General Public License for more details.
14865695bbc89088b9526ea9045410e5afb70a985cplars *
15865695bbc89088b9526ea9045410e5afb70a985cplars *   You should have received a copy of the GNU General Public License
16865695bbc89088b9526ea9045410e5afb70a985cplars *   along with this program;  if not, write to the Free Software
17865695bbc89088b9526ea9045410e5afb70a985cplars *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18865695bbc89088b9526ea9045410e5afb70a985cplars */
19865695bbc89088b9526ea9045410e5afb70a985cplars
20865695bbc89088b9526ea9045410e5afb70a985cplars/*
21865695bbc89088b9526ea9045410e5afb70a985cplars * NAME
22fa31d55d3486830313bd044f7333697ce6124d22nstraz * 	fcntl20.c
23865695bbc89088b9526ea9045410e5afb70a985cplars *
24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION
25865695bbc89088b9526ea9045410e5afb70a985cplars * 	Check locking of regions of a file
26865695bbc89088b9526ea9045410e5afb70a985cplars *
27865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM
28865695bbc89088b9526ea9045410e5afb70a985cplars * 	Test unlocking sections around a read lock
29865695bbc89088b9526ea9045410e5afb70a985cplars *
30865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE
31fa31d55d3486830313bd044f7333697ce6124d22nstraz * 	fcntl20
32865695bbc89088b9526ea9045410e5afb70a985cplars *
33865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY
34865695bbc89088b9526ea9045410e5afb70a985cplars *	07/2001 Ported by Wayne Boyer
35865695bbc89088b9526ea9045410e5afb70a985cplars *
36865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS
37865695bbc89088b9526ea9045410e5afb70a985cplars * 	None
38865695bbc89088b9526ea9045410e5afb70a985cplars */
39865695bbc89088b9526ea9045410e5afb70a985cplars
40865695bbc89088b9526ea9045410e5afb70a985cplars#include <fcntl.h>
41865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
42865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h>
435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include <sys/stat.h>
445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include <sys/types.h>
45db63921767012310af15f29035a334e50486292cmridge#include <sys/wait.h>
465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include "test.h"
475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include "usctest.h"
48865695bbc89088b9526ea9045410e5afb70a985cplars
49865695bbc89088b9526ea9045410e5afb70a985cplars#define STRINGSIZE	27
50865695bbc89088b9526ea9045410e5afb70a985cplars#define STRING		"abcdefghijklmnopqrstuvwxyz\n"
51865695bbc89088b9526ea9045410e5afb70a985cplars#define STOP		0xFFF0
52865695bbc89088b9526ea9045410e5afb70a985cplars
53865695bbc89088b9526ea9045410e5afb70a985cplarsint parent_pipe[2];
54865695bbc89088b9526ea9045410e5afb70a985cplarsint child_pipe[2];
55865695bbc89088b9526ea9045410e5afb70a985cplarsint fd;
56a1e518de6c83215cacf5faad0f4a36148f2f8f8aplarspid_t parent_pid, child_pid;
57865695bbc89088b9526ea9045410e5afb70a985cplars
58865695bbc89088b9526ea9045410e5afb70a985cplarsvoid parent_put();
59865695bbc89088b9526ea9045410e5afb70a985cplarsvoid parent_get();
60865695bbc89088b9526ea9045410e5afb70a985cplarsvoid child_put();
61865695bbc89088b9526ea9045410e5afb70a985cplarsvoid child_get();
62865695bbc89088b9526ea9045410e5afb70a985cplarsvoid stop_child();
63a1e518de6c83215cacf5faad0f4a36148f2f8f8aplarsvoid compare_lock(struct flock *, short, short, int, int, pid_t);
64865695bbc89088b9526ea9045410e5afb70a985cplarsvoid unlock_file();
65865695bbc89088b9526ea9045410e5afb70a985cplarsvoid do_test(struct flock *, short, short, int, int);
66865695bbc89088b9526ea9045410e5afb70a985cplarsvoid catch_child();
67865695bbc89088b9526ea9045410e5afb70a985cplarschar *str_type();
68865695bbc89088b9526ea9045410e5afb70a985cplarsint do_lock(int, short, short, int, int);
69865695bbc89088b9526ea9045410e5afb70a985cplars
70fa31d55d3486830313bd044f7333697ce6124d22nstrazchar *TCID = "fcntl20";
71865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1;
72865695bbc89088b9526ea9045410e5afb70a985cplarsextern int Tst_count;
73865695bbc89088b9526ea9045410e5afb70a985cplars
74865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(void);
75865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(void);
76865695bbc89088b9526ea9045410e5afb70a985cplars
77865695bbc89088b9526ea9045410e5afb70a985cplarsint fail = 0;
78865695bbc89088b9526ea9045410e5afb70a985cplars
795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew/*
815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * setup
825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * 	performs all ONE TIME setup for this test
835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */
845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewsetup()
865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	char *buf = STRING;
88dad2271b03625d8d549ede28a8792c6a7836cc54robbiew	char template[PATH_MAX];
891e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	struct sigaction act;
905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	/* capture signals */
925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	tst_sig(FORK, DEF_HANDLER, cleanup);
935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	umask(0);
955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	/* Pause if that option was specified */
975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	TEST_PAUSE;
985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	pipe(parent_pipe);
1005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	pipe(child_pipe);
1015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_pid = getpid();
10254f7a718c05ce3e0c51950e1a6d2243513366076robbiew
10354f7a718c05ce3e0c51950e1a6d2243513366076robbiew	tst_tmpdir();
104dad2271b03625d8d549ede28a8792c6a7836cc54robbiew	snprintf(template, PATH_MAX, "fcntl20XXXXXX");
1055aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
106dad2271b03625d8d549ede28a8792c6a7836cc54robbiew	if ((fd = mkstemp(template)) < 0) {
107dad2271b03625d8d549ede28a8792c6a7836cc54robbiew                tst_resm(TFAIL, "Couldn't open temp file! errno = %d", errno);
108dad2271b03625d8d549ede28a8792c6a7836cc54robbiew        }
1095aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
110dad2271b03625d8d549ede28a8792c6a7836cc54robbiew        if (write(fd, buf, STRINGSIZE) < 0) {
111dad2271b03625d8d549ede28a8792c6a7836cc54robbiew                tst_resm(TFAIL, "Couldn't write to temp file! errno = %d", errno);
112dad2271b03625d8d549ede28a8792c6a7836cc54robbiew        }
1135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1141e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	memset(&act, 0, sizeof(act));
1151e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	act.sa_handler = catch_child;
1161e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigemptyset(&act.sa_mask);
1171e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigaddset(&act.sa_mask, SIGCLD);
1181e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	if ((sigaction(SIGCLD, &act, NULL)) < 0) {
1195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "SIGCLD signal setup failed, errno: %d",
1205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 errno);
1215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew/*
1265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * cleanup()
1275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * 	performs all ONE TIME cleanup for this test at completion or
1285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * 	premature exit
1295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */
1305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
1315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewcleanup()
1325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	/*
1345aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	 * print timing stats if that option was specified
1355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	 * print errno log if that option was specified
1365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	 */
1375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	TEST_CLEANUP;
1385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
13954f7a718c05ce3e0c51950e1a6d2243513366076robbiew	tst_rmdir();
1405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	/* exit with return code appropriate for results */
1415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	tst_exit();
1425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid do_child()
1455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
1475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	close(parent_pipe[1]);
1495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	close(child_pipe[0]);
1505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	while(1) {
1515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_get(&fl);
1525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (fcntl(fd, F_GETLK, &fl) < 0) {
153dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
154dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
1555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			fail = 1;
1565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
1575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_put(&fl);
1585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint do_lock(int cmd, short type, short whence, int start, int len)
1625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
1645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_type = type;
1665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_whence = whence;
1675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_start = start;
1685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_len = len;
1695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	return(fcntl(fd, cmd, &fl));
1705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
1735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewdo_test(struct flock *fl, short type, short whence, int start, int len)
1745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_type = type;
1765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_whence = whence;
1775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_start = start;
1785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_len = len;
1795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_pid = (short)0;
1805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_put(fl);
1825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_get(fl);
1835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
1865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewcompare_lock(struct flock *fl, short type, short whence, int start, int len,
1875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	     pid_t pid)
1885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_type != type) {
1905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "lock type is wrong should be %s is %s",
1915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 str_type(type), str_type(fl->l_type));
1925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_whence != whence) {
1965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "lock whence is wrong should be %d is %d",
1975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 whence, fl->l_whence);
1985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_start != start) {
2025aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "region starts in wrong place, should be"
2035aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 "%d is %d", start, fl->l_start);
2045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2055aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_len != len) {
2085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "region length is wrong, should be %d is %d",
2095aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 len, fl->l_len);
2105aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2115aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2125aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_pid != pid) {
2145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "locking pid is wrong, should be %d is %d",
2155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 pid, fl->l_pid);
2165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
2215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewunlock_file()
2225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
2245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 0, 0) < 0) {
226dad2271b03625d8d549ede28a8792c6a7836cc54robbiew		tst_resm(TFAIL, "fcntl on file failed, errno =%d",
2275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 errno);
2285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	do_test(&fl, F_WRLCK, 0, 0, 0);
2315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	compare_lock(&fl, (short)F_UNLCK, (short)0, 0, 0, (pid_t)0);
2325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2345aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewchar *
2355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewstr_type(int type)
2365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	static char buf[20];
2385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	switch (type) {
2405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 1:
2415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		return("F_RDLCK");
2425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 2:
2435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		return("F_WRLCK");
2445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 3:
2455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		return("F_UNLCK");
2465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	default:
2475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		sprintf(buf, "BAD VALUE: %d", type);
2485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		return(buf);
2495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
2535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewparent_put(struct flock *l)
2545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (write(parent_pipe[1], l, sizeof(*l)) != sizeof(*l)) {
2565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't send message to child");
2575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
2625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewparent_get(struct flock *l)
2635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (read(child_pipe[0], l, sizeof(*l)) != sizeof(*l)) {
2655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't get message from child");
2665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
2715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewchild_put(struct flock *l)
2725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (write(child_pipe[1], l, sizeof(*l)) != sizeof(*l)) {
2745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't send message to parent");
2755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
2805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewchild_get(struct flock *l)
2815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (read(parent_pipe[0], l, sizeof(*l)) != sizeof(*l)) {
2835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't get message from parent");
2845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		cleanup();
2855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	} else if (l->l_type == (short)STOP) {
2865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		exit(0);
2875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
2915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewstop_child()
2925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
2945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	(void) signal(SIGCLD, (void (*)())SIG_DFL);
2965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_type = STOP;
2975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_put(&fl);
2985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	wait(0);
2995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
3005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
3015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
3025aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewcatch_child()
3035aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
3045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	tst_resm(TFAIL, "Unexpected death of child process");
3055aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	cleanup();
3065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
3075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
3085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint main(int ac, char **av)
309865695bbc89088b9526ea9045410e5afb70a985cplars{
310865695bbc89088b9526ea9045410e5afb70a985cplars	struct flock tl;
311865695bbc89088b9526ea9045410e5afb70a985cplars
312865695bbc89088b9526ea9045410e5afb70a985cplars	int lc;				/* loop counter */
313865695bbc89088b9526ea9045410e5afb70a985cplars	char *msg;			/* message returned from parse_opts */
314865695bbc89088b9526ea9045410e5afb70a985cplars
315865695bbc89088b9526ea9045410e5afb70a985cplars	/* parse standard options */
316865695bbc89088b9526ea9045410e5afb70a985cplars	if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){
317865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg);
318865695bbc89088b9526ea9045410e5afb70a985cplars	}
319865695bbc89088b9526ea9045410e5afb70a985cplars
320d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
321d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child, "ddddd", &parent_pipe[0], &parent_pipe[1],
322d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe[0], &child_pipe[1], &fd);
323d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
324d34d581c6a320e356a6cda923c7aa399479e812crobbiew
325865695bbc89088b9526ea9045410e5afb70a985cplars	setup();			/* global setup */
326865695bbc89088b9526ea9045410e5afb70a985cplars
327865695bbc89088b9526ea9045410e5afb70a985cplars	/* Check for looping state if -i option is given */
328865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
329865695bbc89088b9526ea9045410e5afb70a985cplars		/* reset Tst_count in case we are looping */
330865695bbc89088b9526ea9045410e5afb70a985cplars		Tst_count = 0;
331865695bbc89088b9526ea9045410e5afb70a985cplars
332d34d581c6a320e356a6cda923c7aa399479e812crobbiew		if ((child_pid = FORK_OR_VFORK()) == 0) {	/* child */
333d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
334d34d581c6a320e356a6cda923c7aa399479e812crobbiew			if (self_exec(av[0], "ddddd", parent_pipe[0], parent_pipe[1],
335d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      child_pipe[0], child_pipe[1], fd) < 0) {
336d34d581c6a320e356a6cda923c7aa399479e812crobbiew				tst_resm(TFAIL, "self_exec failed");
337d34d581c6a320e356a6cda923c7aa399479e812crobbiew				cleanup();
338d34d581c6a320e356a6cda923c7aa399479e812crobbiew			}
339d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
340865695bbc89088b9526ea9045410e5afb70a985cplars			do_child();
341d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
342865695bbc89088b9526ea9045410e5afb70a985cplars		}
343865695bbc89088b9526ea9045410e5afb70a985cplars
344865695bbc89088b9526ea9045410e5afb70a985cplars		if (child_pid < 0) {
345865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TFAIL, "Fork failed");
346865695bbc89088b9526ea9045410e5afb70a985cplars			cleanup();
347865695bbc89088b9526ea9045410e5afb70a985cplars		}
348865695bbc89088b9526ea9045410e5afb70a985cplars
349865695bbc89088b9526ea9045410e5afb70a985cplars		(void)close(parent_pipe[0]);
350865695bbc89088b9526ea9045410e5afb70a985cplars		(void)close(child_pipe[1]);
351865695bbc89088b9526ea9045410e5afb70a985cplars
352db63921767012310af15f29035a334e50486292cmridge/* //block1: */
353865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 1");
354865695bbc89088b9526ea9045410e5afb70a985cplars		/*
355865695bbc89088b9526ea9045410e5afb70a985cplars		 * Add a read lock to the middle of the file and unlock a
356865695bbc89088b9526ea9045410e5afb70a985cplars		 * section just before the lock
357865695bbc89088b9526ea9045410e5afb70a985cplars		 */
358865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
359dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
360dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
361865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
362865695bbc89088b9526ea9045410e5afb70a985cplars		}
363865695bbc89088b9526ea9045410e5afb70a985cplars
364865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 5) < 0) {
365dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
366dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
367865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
368865695bbc89088b9526ea9045410e5afb70a985cplars		}
369865695bbc89088b9526ea9045410e5afb70a985cplars
370865695bbc89088b9526ea9045410e5afb70a985cplars		/*
371865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
372865695bbc89088b9526ea9045410e5afb70a985cplars		 */
373865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
374865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 5, parent_pid);
375865695bbc89088b9526ea9045410e5afb70a985cplars
376865695bbc89088b9526ea9045410e5afb70a985cplars		/*
377865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test that the rest of the file is unlocked
378865695bbc89088b9526ea9045410e5afb70a985cplars		 */
379865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
380a1e518de6c83215cacf5faad0f4a36148f2f8f8aplars		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t)0);
381865695bbc89088b9526ea9045410e5afb70a985cplars
382865695bbc89088b9526ea9045410e5afb70a985cplars		/*
383865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
384865695bbc89088b9526ea9045410e5afb70a985cplars		 */
385865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
386865695bbc89088b9526ea9045410e5afb70a985cplars
387865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
388865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 1: FAILED");
389865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
390865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 1: PASSED");
391865695bbc89088b9526ea9045410e5afb70a985cplars		}
392865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 1");
393865695bbc89088b9526ea9045410e5afb70a985cplars
394db63921767012310af15f29035a334e50486292cmridge/* //block2: */
395865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 2");
396865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
397865695bbc89088b9526ea9045410e5afb70a985cplars		/*
398865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle and do an unlock that
399865695bbc89088b9526ea9045410e5afb70a985cplars		 * ends at the first byte of the read lock.
400865695bbc89088b9526ea9045410e5afb70a985cplars		 */
401865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
402dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
403dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
404865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
405865695bbc89088b9526ea9045410e5afb70a985cplars		}
406865695bbc89088b9526ea9045410e5afb70a985cplars
407865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 6) < 0) {
408dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
409dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
410865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
411865695bbc89088b9526ea9045410e5afb70a985cplars		}
412865695bbc89088b9526ea9045410e5afb70a985cplars
413865695bbc89088b9526ea9045410e5afb70a985cplars		/*
414865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
415865695bbc89088b9526ea9045410e5afb70a985cplars		 */
416865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
417865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 11, 4, parent_pid);
418865695bbc89088b9526ea9045410e5afb70a985cplars
419865695bbc89088b9526ea9045410e5afb70a985cplars		/*
420865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
421865695bbc89088b9526ea9045410e5afb70a985cplars		 */
422865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
423a1e518de6c83215cacf5faad0f4a36148f2f8f8aplars		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t)0);
424865695bbc89088b9526ea9045410e5afb70a985cplars
425865695bbc89088b9526ea9045410e5afb70a985cplars		/*
426865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
427865695bbc89088b9526ea9045410e5afb70a985cplars		 */
428865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
429865695bbc89088b9526ea9045410e5afb70a985cplars
430865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
431865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 2: FAILED");
432865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
433865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 2: PASSED");
434865695bbc89088b9526ea9045410e5afb70a985cplars		}
435865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 2");
436865695bbc89088b9526ea9045410e5afb70a985cplars
437db63921767012310af15f29035a334e50486292cmridge/* //block3: */
438865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 3");
439865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
440865695bbc89088b9526ea9045410e5afb70a985cplars
441865695bbc89088b9526ea9045410e5afb70a985cplars		/*
442865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock on the middle of the file and do an
443865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that overlaps the front of the read
444865695bbc89088b9526ea9045410e5afb70a985cplars		 */
445865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
446dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
447dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
448865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
449865695bbc89088b9526ea9045410e5afb70a985cplars		}
450865695bbc89088b9526ea9045410e5afb70a985cplars
451865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 8) < 0) {
452dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
453dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
454865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
455865695bbc89088b9526ea9045410e5afb70a985cplars		}
456865695bbc89088b9526ea9045410e5afb70a985cplars
457865695bbc89088b9526ea9045410e5afb70a985cplars		/*
458865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
459865695bbc89088b9526ea9045410e5afb70a985cplars		 */
460865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
461865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 13, 2, parent_pid);
462865695bbc89088b9526ea9045410e5afb70a985cplars
463865695bbc89088b9526ea9045410e5afb70a985cplars		/*
464865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
465865695bbc89088b9526ea9045410e5afb70a985cplars		 */
466865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
467a1e518de6c83215cacf5faad0f4a36148f2f8f8aplars		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t)0);
468865695bbc89088b9526ea9045410e5afb70a985cplars
469865695bbc89088b9526ea9045410e5afb70a985cplars		/*
470865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
471865695bbc89088b9526ea9045410e5afb70a985cplars		 */
472865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
473865695bbc89088b9526ea9045410e5afb70a985cplars
474865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
475865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 3: FAILED");
476865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
477865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 3: PASSED");
478865695bbc89088b9526ea9045410e5afb70a985cplars		}
479865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 3");
480865695bbc89088b9526ea9045410e5afb70a985cplars
481db63921767012310af15f29035a334e50486292cmridge/* //block4: */
482865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter blcok 4");
483865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
484865695bbc89088b9526ea9045410e5afb70a985cplars
485865695bbc89088b9526ea9045410e5afb70a985cplars		/*
486865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle of a file and unlock a
487865695bbc89088b9526ea9045410e5afb70a985cplars		 * section in the middle of it
488865695bbc89088b9526ea9045410e5afb70a985cplars		 */
489865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 10) < 0) {
490dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
491dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
492865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
493865695bbc89088b9526ea9045410e5afb70a985cplars		}
494865695bbc89088b9526ea9045410e5afb70a985cplars
495865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 13, 5) < 0) {
496dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
497dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
498865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
499865695bbc89088b9526ea9045410e5afb70a985cplars		}
500865695bbc89088b9526ea9045410e5afb70a985cplars
501865695bbc89088b9526ea9045410e5afb70a985cplars		/*
502865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the first read lock
503865695bbc89088b9526ea9045410e5afb70a985cplars		 */
504865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
505865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 3, parent_pid);
506865695bbc89088b9526ea9045410e5afb70a985cplars
507865695bbc89088b9526ea9045410e5afb70a985cplars		/*
508865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the second read lock
509865695bbc89088b9526ea9045410e5afb70a985cplars		 */
510865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 13, 0);
511865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 18, 2, parent_pid);
512865695bbc89088b9526ea9045410e5afb70a985cplars
513865695bbc89088b9526ea9045410e5afb70a985cplars		/*
514865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
515865695bbc89088b9526ea9045410e5afb70a985cplars		 */
516865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 20, 0);
517a1e518de6c83215cacf5faad0f4a36148f2f8f8aplars		compare_lock(&tl, (short)F_UNLCK, (short)0, 20, 0, (pid_t)0);
518865695bbc89088b9526ea9045410e5afb70a985cplars
519865695bbc89088b9526ea9045410e5afb70a985cplars		/*
520865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
521865695bbc89088b9526ea9045410e5afb70a985cplars		 */
522865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
523865695bbc89088b9526ea9045410e5afb70a985cplars
524865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
525865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 4: FAILED");
526865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
527865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 4: PASSED");
528865695bbc89088b9526ea9045410e5afb70a985cplars		}
529865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 4");
530865695bbc89088b9526ea9045410e5afb70a985cplars
531db63921767012310af15f29035a334e50486292cmridge/* //block5: */
532865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 5");
533865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
534865695bbc89088b9526ea9045410e5afb70a985cplars
535865695bbc89088b9526ea9045410e5afb70a985cplars		/*
536865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle of the file and do a
537865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that overlaps the end
538865695bbc89088b9526ea9045410e5afb70a985cplars		 */
539865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
540dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
541dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
542865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
543865695bbc89088b9526ea9045410e5afb70a985cplars		}
544865695bbc89088b9526ea9045410e5afb70a985cplars
545865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 13, 5) < 0) {
546dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
547dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
548865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
549865695bbc89088b9526ea9045410e5afb70a985cplars		}
550865695bbc89088b9526ea9045410e5afb70a985cplars
551865695bbc89088b9526ea9045410e5afb70a985cplars		/*
552865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
553865695bbc89088b9526ea9045410e5afb70a985cplars		 */
554865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
555865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 3, parent_pid);
556865695bbc89088b9526ea9045410e5afb70a985cplars
557865695bbc89088b9526ea9045410e5afb70a985cplars		/*
558865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
559865695bbc89088b9526ea9045410e5afb70a985cplars		 */
560865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 13, 0);
561a1e518de6c83215cacf5faad0f4a36148f2f8f8aplars		compare_lock(&tl, (short)F_UNLCK, (short)0, 13, 0, (pid_t)0);
562865695bbc89088b9526ea9045410e5afb70a985cplars
563865695bbc89088b9526ea9045410e5afb70a985cplars		/*
564865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
565865695bbc89088b9526ea9045410e5afb70a985cplars		 */
566865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
567865695bbc89088b9526ea9045410e5afb70a985cplars
568865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
569865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 5: FAILED");
570865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
571865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 5: PASSED");
572865695bbc89088b9526ea9045410e5afb70a985cplars		}
573865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 5");
574865695bbc89088b9526ea9045410e5afb70a985cplars
575db63921767012310af15f29035a334e50486292cmridge/* //block6: */
576865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 6");
577865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
578865695bbc89088b9526ea9045410e5afb70a985cplars
579865695bbc89088b9526ea9045410e5afb70a985cplars		/*
580865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set read lock in the middle of the file and do an unlock
581865695bbc89088b9526ea9045410e5afb70a985cplars		 * starting at the last byte of the read lock
582865695bbc89088b9526ea9045410e5afb70a985cplars		 */
583865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
584dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
585dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
586865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
587865695bbc89088b9526ea9045410e5afb70a985cplars		}
588865695bbc89088b9526ea9045410e5afb70a985cplars
589865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 14, 5) < 0) {
590dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
591dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
592865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
593865695bbc89088b9526ea9045410e5afb70a985cplars		}
594865695bbc89088b9526ea9045410e5afb70a985cplars
595865695bbc89088b9526ea9045410e5afb70a985cplars		/*
596865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
597865695bbc89088b9526ea9045410e5afb70a985cplars		 */
598865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 10, 0);
599865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 4, parent_pid);
600865695bbc89088b9526ea9045410e5afb70a985cplars
601865695bbc89088b9526ea9045410e5afb70a985cplars		/*
602865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the end of the file is unlocked
603865695bbc89088b9526ea9045410e5afb70a985cplars		 */
604865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 14, 0);
605a1e518de6c83215cacf5faad0f4a36148f2f8f8aplars		compare_lock(&tl, (short)F_UNLCK, (short)0, 14, 0, (pid_t)0);
606865695bbc89088b9526ea9045410e5afb70a985cplars
607865695bbc89088b9526ea9045410e5afb70a985cplars		/*
608865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
609865695bbc89088b9526ea9045410e5afb70a985cplars		 */
610865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
611865695bbc89088b9526ea9045410e5afb70a985cplars
612865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
613865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 6: FAILED");
614865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
615865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 6: PASSED");
616865695bbc89088b9526ea9045410e5afb70a985cplars		}
617865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 6");
618865695bbc89088b9526ea9045410e5afb70a985cplars
619db63921767012310af15f29035a334e50486292cmridge/* //block7: */
620865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 7");
621865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
622865695bbc89088b9526ea9045410e5afb70a985cplars
623865695bbc89088b9526ea9045410e5afb70a985cplars		/*
624865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock at the middle of the file and do an
625865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that starts at the byte past the end of the read
626865695bbc89088b9526ea9045410e5afb70a985cplars		 * lock
627865695bbc89088b9526ea9045410e5afb70a985cplars		 */
628865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
629dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
630dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
631865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
632865695bbc89088b9526ea9045410e5afb70a985cplars		}
633865695bbc89088b9526ea9045410e5afb70a985cplars
634865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 16, 0) < 0) {
635dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
636dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
637865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
638865695bbc89088b9526ea9045410e5afb70a985cplars		}
639865695bbc89088b9526ea9045410e5afb70a985cplars
640865695bbc89088b9526ea9045410e5afb70a985cplars		/*
641865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
642865695bbc89088b9526ea9045410e5afb70a985cplars		 */
643865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
644865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 5, parent_pid);
645865695bbc89088b9526ea9045410e5afb70a985cplars
646865695bbc89088b9526ea9045410e5afb70a985cplars		/*
647865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
648865695bbc89088b9526ea9045410e5afb70a985cplars		 */
649865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 16, 0);
650a1e518de6c83215cacf5faad0f4a36148f2f8f8aplars		compare_lock(&tl, (short)F_UNLCK, (short)0, 16, 0, (pid_t)0);
651865695bbc89088b9526ea9045410e5afb70a985cplars
652865695bbc89088b9526ea9045410e5afb70a985cplars		/*
653865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
654865695bbc89088b9526ea9045410e5afb70a985cplars		 */
655865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
656865695bbc89088b9526ea9045410e5afb70a985cplars
657865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
658865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 7: FAILED");
659865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
660865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 7: PASSED");
661865695bbc89088b9526ea9045410e5afb70a985cplars		}
662865695bbc89088b9526ea9045410e5afb70a985cplars
663865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 7");
664865695bbc89088b9526ea9045410e5afb70a985cplars
665865695bbc89088b9526ea9045410e5afb70a985cplars		stop_child();
666865695bbc89088b9526ea9045410e5afb70a985cplars		close(fd);
667865695bbc89088b9526ea9045410e5afb70a985cplars	}
668865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
6695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	return(0);
670865695bbc89088b9526ea9045410e5afb70a985cplars}
671