• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *   Copyright (C) Bull S.A. 2001
3  *   Copyright (c) International Business Machines  Corp., 2001
4  *
5  *   This program is free software;  you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation; either version 2 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13  *   the GNU General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program;  if not, write to the Free Software
17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 /*
21  * Test Name: fcntl22
22  *
23  * Test Description:
24  *  Verify that, fcntl() fails with -1 and sets errno to EAGAIN when
25  *				  Operation  is  prohibited  by locks held by other processes.
26  *
27  * Expected Result:
28  *  fcntl() should fail with return value -1 and sets expected errno.
29  *
30  * HISTORY
31  *		 06/2002 Ported by Jacky Malcles
32  */
33 
34 #include <fcntl.h>
35 #include <errno.h>
36 #include <signal.h>
37 #include <stdlib.h>
38 #include <sys/types.h>
39 #include <sys/wait.h>
40 #include "test.h"
41 
42 int child_pid;
43 int file;
44 struct flock fl;
45 
46 char *TCID = "fcntl22";
47 int TST_TOTAL = 1;
48 
49 void setup(void);
50 void cleanup(void);
51 
main(int ac,char ** av)52 int main(int ac, char **av)
53 {
54 	int lc;
55 
56 	tst_parse_opts(ac, av, NULL, NULL);
57 
58 	setup();
59 
60 	for (lc = 0; TEST_LOOPING(lc); lc++) {
61 		tst_count = 0;
62 
63 		child_pid = FORK_OR_VFORK();
64 		switch (child_pid) {
65 		case 0:
66 			TEST(fcntl(file, F_SETLK, &fl));
67 
68 			if (TEST_RETURN != -1) {
69 				tst_resm(TFAIL, "fcntl() returned %ld,"
70 					 "expected -1, errno=%d", TEST_RETURN,
71 					 EAGAIN);
72 			} else {
73 				if (TEST_ERRNO == EAGAIN) {
74 					tst_resm(TPASS,
75 						 "fcntl() fails with expected "
76 						 "error EAGAIN errno:%d",
77 						 TEST_ERRNO);
78 				} else {
79 					tst_resm(TFAIL, "fcntl() fails, EAGAIN, "
80 						 "errno=%d, expected errno=%d",
81 						 TEST_ERRNO, EAGAIN);
82 				}
83 			}
84 			tst_exit();
85 		break;
86 		case -1:
87 			tst_brkm(TBROK|TERRNO, cleanup, "Fork failed");
88 		break;
89 		default:
90 			tst_record_childstatus(cleanup, child_pid);
91 		}
92 
93 	}
94 
95 	cleanup();
96 	tst_exit();
97 }
98 
setup(void)99 void setup(void)
100 {
101 	tst_sig(FORK, DEF_HANDLER, cleanup);
102 
103 	TEST_PAUSE;
104 
105 	tst_tmpdir();
106 
107 	if ((file = creat("regfile", 0777)) == -1) {
108 		tst_brkm(TBROK, cleanup,
109 			 "creat(regfile, 0777) failed, errno:%d %s", errno,
110 			 strerror(errno));
111 	}
112 
113 	fl.l_type = F_WRLCK;
114 	fl.l_whence = 0;
115 	fl.l_start = 0;
116 	fl.l_len = 0;
117 
118 	if (fcntl(file, F_SETLK, &fl) < 0)
119 		tst_brkm(TBROK | TERRNO, cleanup, "fcntl() failed");
120 }
121 
cleanup(void)122 void cleanup(void)
123 {
124 	close(file);
125 
126 	tst_rmdir();
127 }
128