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