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