xref: /aosp_15_r20/external/ltp/testcases/kernel/syscalls/fcntl/fcntl01.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker /*
2*49cdfc7eSAndroid Build Coastguard Worker  * NAME
3*49cdfc7eSAndroid Build Coastguard Worker  *	fcntl01.c
4*49cdfc7eSAndroid Build Coastguard Worker  *
5*49cdfc7eSAndroid Build Coastguard Worker  * DESCRIPTION
6*49cdfc7eSAndroid Build Coastguard Worker  *	Test F_DUPFD, F_SETFL cmds of fcntl
7*49cdfc7eSAndroid Build Coastguard Worker  *
8*49cdfc7eSAndroid Build Coastguard Worker  * CALLS
9*49cdfc7eSAndroid Build Coastguard Worker  *	fcntl
10*49cdfc7eSAndroid Build Coastguard Worker  *
11*49cdfc7eSAndroid Build Coastguard Worker  * ALGORITHM
12*49cdfc7eSAndroid Build Coastguard Worker  *
13*49cdfc7eSAndroid Build Coastguard Worker  *	1. Testing F_DUPFD cmd with arg less than, equal to, and greater
14*49cdfc7eSAndroid Build Coastguard Worker  *	   than the next available file descriptor.
15*49cdfc7eSAndroid Build Coastguard Worker  *
16*49cdfc7eSAndroid Build Coastguard Worker  *	2. Checking F_SETFL cmd with each valid flag (O_NDELAY, O_APPEND).
17*49cdfc7eSAndroid Build Coastguard Worker  *
18*49cdfc7eSAndroid Build Coastguard Worker  *	3. Checking, setting and reading `close on exec' flag.
19*49cdfc7eSAndroid Build Coastguard Worker  *
20*49cdfc7eSAndroid Build Coastguard Worker  * USAGE
21*49cdfc7eSAndroid Build Coastguard Worker  *	fcntl01
22*49cdfc7eSAndroid Build Coastguard Worker  *
23*49cdfc7eSAndroid Build Coastguard Worker  * HISTORY
24*49cdfc7eSAndroid Build Coastguard Worker  *	07/2001 Ported by Wayne Boyer
25*49cdfc7eSAndroid Build Coastguard Worker  *	09/2002 added fd2 array to remove statid fds
26*49cdfc7eSAndroid Build Coastguard Worker  *
27*49cdfc7eSAndroid Build Coastguard Worker  * RESTRICTIONS
28*49cdfc7eSAndroid Build Coastguard Worker  *	None
29*49cdfc7eSAndroid Build Coastguard Worker  *
30*49cdfc7eSAndroid Build Coastguard Worker  */
31*49cdfc7eSAndroid Build Coastguard Worker 
32*49cdfc7eSAndroid Build Coastguard Worker #include <fcntl.h>
33*49cdfc7eSAndroid Build Coastguard Worker #include <errno.h>
34*49cdfc7eSAndroid Build Coastguard Worker #include <sys/types.h>
35*49cdfc7eSAndroid Build Coastguard Worker #include <sys/stat.h>
36*49cdfc7eSAndroid Build Coastguard Worker #include "test.h"
37*49cdfc7eSAndroid Build Coastguard Worker 
38*49cdfc7eSAndroid Build Coastguard Worker void setup(void);
39*49cdfc7eSAndroid Build Coastguard Worker void cleanup(void);
40*49cdfc7eSAndroid Build Coastguard Worker 
41*49cdfc7eSAndroid Build Coastguard Worker char *TCID = "fcntl01";
42*49cdfc7eSAndroid Build Coastguard Worker int TST_TOTAL = 1;
43*49cdfc7eSAndroid Build Coastguard Worker 
main(int ac,char ** av)44*49cdfc7eSAndroid Build Coastguard Worker int main(int ac, char **av)
45*49cdfc7eSAndroid Build Coastguard Worker {
46*49cdfc7eSAndroid Build Coastguard Worker 	int flags;
47*49cdfc7eSAndroid Build Coastguard Worker 	char fname[40];
48*49cdfc7eSAndroid Build Coastguard Worker 	int fd[10], fd2[10];
49*49cdfc7eSAndroid Build Coastguard Worker 	int mypid;
50*49cdfc7eSAndroid Build Coastguard Worker 	unsigned int i;
51*49cdfc7eSAndroid Build Coastguard Worker 	int lc;
52*49cdfc7eSAndroid Build Coastguard Worker 
53*49cdfc7eSAndroid Build Coastguard Worker 	tst_parse_opts(ac, av, NULL, NULL);
54*49cdfc7eSAndroid Build Coastguard Worker 
55*49cdfc7eSAndroid Build Coastguard Worker 	setup();
56*49cdfc7eSAndroid Build Coastguard Worker 
57*49cdfc7eSAndroid Build Coastguard Worker 	/* check for looping state if -i option is given */
58*49cdfc7eSAndroid Build Coastguard Worker 	for (lc = 0; TEST_LOOPING(lc); lc++) {
59*49cdfc7eSAndroid Build Coastguard Worker 
60*49cdfc7eSAndroid Build Coastguard Worker 		tst_count = 0;
61*49cdfc7eSAndroid Build Coastguard Worker 
62*49cdfc7eSAndroid Build Coastguard Worker 		mypid = getpid();
63*49cdfc7eSAndroid Build Coastguard Worker 		for (i = 0; i < 8; i++) {
64*49cdfc7eSAndroid Build Coastguard Worker 			sprintf(fname, "./fcntl%d.%d", i, mypid);
65*49cdfc7eSAndroid Build Coastguard Worker 			if ((fd[i] =
66*49cdfc7eSAndroid Build Coastguard Worker 			     open(fname, O_WRONLY | O_CREAT, 0666)) == -1)
67*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TBROK | TERRNO, "open failed");
68*49cdfc7eSAndroid Build Coastguard Worker 			fd2[i] = fd[i];
69*49cdfc7eSAndroid Build Coastguard Worker 		}
70*49cdfc7eSAndroid Build Coastguard Worker 
71*49cdfc7eSAndroid Build Coastguard Worker 		close(fd[2]);
72*49cdfc7eSAndroid Build Coastguard Worker 		close(fd[3]);
73*49cdfc7eSAndroid Build Coastguard Worker 		close(fd[4]);
74*49cdfc7eSAndroid Build Coastguard Worker 		close(fd[5]);
75*49cdfc7eSAndroid Build Coastguard Worker 
76*49cdfc7eSAndroid Build Coastguard Worker 		if ((fd[2] = fcntl(fd[1], F_DUPFD, 1)) == -1)
77*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL | TERRNO, "fcntl(.., 1) failed");
78*49cdfc7eSAndroid Build Coastguard Worker 
79*49cdfc7eSAndroid Build Coastguard Worker 		if (fd[2] < fd2[2])
80*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "new fd has unexpected value: "
81*49cdfc7eSAndroid Build Coastguard Worker 				 "got %d, expected greater than %d", fd[2], 5);
82*49cdfc7eSAndroid Build Coastguard Worker 
83*49cdfc7eSAndroid Build Coastguard Worker 		if ((fd[4] = fcntl(fd[1], F_DUPFD, fd2[3])) < 0)
84*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL | TERRNO, "fcntl(.., fd2[3]) failed");
85*49cdfc7eSAndroid Build Coastguard Worker 
86*49cdfc7eSAndroid Build Coastguard Worker 		if (fd[4] < fd2[3])
87*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "new fd has unexpected value, got %d, "
88*49cdfc7eSAndroid Build Coastguard Worker 				 "expect greater than %d", fd[4], fd2[3]);
89*49cdfc7eSAndroid Build Coastguard Worker 
90*49cdfc7eSAndroid Build Coastguard Worker 		if ((fd[8] = fcntl(fd[1], F_DUPFD, fd2[5])) < 0)
91*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL | TERRNO, "fcntl(.., fd2[5]) failed");
92*49cdfc7eSAndroid Build Coastguard Worker 
93*49cdfc7eSAndroid Build Coastguard Worker 		if (fd[8] != fd2[5])
94*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "new fd has unexpected value: "
95*49cdfc7eSAndroid Build Coastguard Worker 				 "got %d, expected %d", fd[8], fd2[5]);
96*49cdfc7eSAndroid Build Coastguard Worker /* //block1: */
97*49cdfc7eSAndroid Build Coastguard Worker 		flags = fcntl(fd[2], F_GETFL, 0);
98*49cdfc7eSAndroid Build Coastguard Worker 		if ((flags & O_WRONLY) == 0)
99*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "unexpected flag 0x%x, expected 0x%x",
100*49cdfc7eSAndroid Build Coastguard Worker 				 flags, O_WRONLY);
101*49cdfc7eSAndroid Build Coastguard Worker 
102*49cdfc7eSAndroid Build Coastguard Worker 		/* Check setting of no_delay flag */
103*49cdfc7eSAndroid Build Coastguard Worker 		if (fcntl(fd[2], F_SETFL, O_NDELAY) == -1)
104*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TBROK | TERRNO, "fcntl(.., O_NDELAY) failed");
105*49cdfc7eSAndroid Build Coastguard Worker 
106*49cdfc7eSAndroid Build Coastguard Worker 		flags = fcntl(fd[2], F_GETFL, 0);
107*49cdfc7eSAndroid Build Coastguard Worker 		if ((flags & (O_NDELAY | O_WRONLY)) == 0)
108*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "unexpected flag 0x%x, expected 0x%x",
109*49cdfc7eSAndroid Build Coastguard Worker 				 flags, O_NDELAY | O_WRONLY);
110*49cdfc7eSAndroid Build Coastguard Worker 
111*49cdfc7eSAndroid Build Coastguard Worker 		/* Check of setting append flag */
112*49cdfc7eSAndroid Build Coastguard Worker 		if (fcntl(fd[2], F_SETFL, O_APPEND) == -1)
113*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL | TERRNO, "fcntl(.., O_APPEND) failed");
114*49cdfc7eSAndroid Build Coastguard Worker 
115*49cdfc7eSAndroid Build Coastguard Worker 		flags = fcntl(fd[2], F_GETFL, 0);
116*49cdfc7eSAndroid Build Coastguard Worker 		if ((flags & (O_APPEND | O_WRONLY)) == 0)
117*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "unexpected flag ox%x, expected 0x%x",
118*49cdfc7eSAndroid Build Coastguard Worker 				 flags, O_APPEND | O_WRONLY);
119*49cdfc7eSAndroid Build Coastguard Worker 
120*49cdfc7eSAndroid Build Coastguard Worker 		/* Check setting flags together */
121*49cdfc7eSAndroid Build Coastguard Worker 		if (fcntl(fd[2], F_SETFL, O_NDELAY | O_APPEND) < 0)
122*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "fcntl(.., O_NDELAY|O_APPEND) failed");
123*49cdfc7eSAndroid Build Coastguard Worker 
124*49cdfc7eSAndroid Build Coastguard Worker 		flags = fcntl(fd[2], F_GETFL, 0);
125*49cdfc7eSAndroid Build Coastguard Worker 		if ((flags & (O_NDELAY | O_APPEND | O_WRONLY)) == 0)
126*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "unexpected flag 0x%x, expected 0x%x",
127*49cdfc7eSAndroid Build Coastguard Worker 				 flags,
128*49cdfc7eSAndroid Build Coastguard Worker 				 O_NDELAY | O_APPEND | O_SYNC | O_WRONLY);
129*49cdfc7eSAndroid Build Coastguard Worker 
130*49cdfc7eSAndroid Build Coastguard Worker 		/* Check that flags are not cummulative */
131*49cdfc7eSAndroid Build Coastguard Worker 		if (fcntl(fd[2], F_SETFL, 0) == -1)
132*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "fcntl(.., 0) failed");
133*49cdfc7eSAndroid Build Coastguard Worker 
134*49cdfc7eSAndroid Build Coastguard Worker 		flags = fcntl(fd[2], F_GETFL, 0);
135*49cdfc7eSAndroid Build Coastguard Worker 		if ((flags & O_WRONLY) == 0)
136*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "unexpected flag 0x%x, expected 0x%x",
137*49cdfc7eSAndroid Build Coastguard Worker 				 flags, O_WRONLY);
138*49cdfc7eSAndroid Build Coastguard Worker 
139*49cdfc7eSAndroid Build Coastguard Worker /* //block2: */
140*49cdfc7eSAndroid Build Coastguard Worker 		/*
141*49cdfc7eSAndroid Build Coastguard Worker 		 * Check ability to set (F_SETFD) the close on exec flag
142*49cdfc7eSAndroid Build Coastguard Worker 		 */
143*49cdfc7eSAndroid Build Coastguard Worker 		if ((flags = fcntl(fd[2], F_GETFD, 0)) < 0)
144*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL | TERRNO,
145*49cdfc7eSAndroid Build Coastguard Worker 				 "fcntl(.., F_GETFD, ..) #1 failed");
146*49cdfc7eSAndroid Build Coastguard Worker 		if (flags != 0)
147*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "unexpected flags got 0x%x expected "
148*49cdfc7eSAndroid Build Coastguard Worker 				 "0x%x", flags, 0);
149*49cdfc7eSAndroid Build Coastguard Worker 		if ((flags = fcntl(fd[2], F_SETFD, 1)) == -1)
150*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "fcntl(.., F_SETFD, ..) failed");
151*49cdfc7eSAndroid Build Coastguard Worker 		if ((flags = fcntl(fd[2], F_GETFD, 0)) == -1)
152*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL | TERRNO,
153*49cdfc7eSAndroid Build Coastguard Worker 				 "fcntl(.., F_GETFD, ..) #2 failed");
154*49cdfc7eSAndroid Build Coastguard Worker 		if (flags != 1)
155*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "unexpected flags, got 0x%x, "
156*49cdfc7eSAndroid Build Coastguard Worker 				 "expected 0x%x", flags, 1);
157*49cdfc7eSAndroid Build Coastguard Worker 
158*49cdfc7eSAndroid Build Coastguard Worker 		for (i = 0; i < ARRAY_SIZE(fd); i++)
159*49cdfc7eSAndroid Build Coastguard Worker 			close(fd[i]);
160*49cdfc7eSAndroid Build Coastguard Worker 		for (i = 0; i < 8; i++) {
161*49cdfc7eSAndroid Build Coastguard Worker 			sprintf(fname, "./fcntl%u.%d", i, mypid);
162*49cdfc7eSAndroid Build Coastguard Worker 			if ((unlink(fname)) == -1)
163*49cdfc7eSAndroid Build Coastguard Worker 				tst_resm(TFAIL | TERRNO,
164*49cdfc7eSAndroid Build Coastguard Worker 					 "unlinking %s failed", fname);
165*49cdfc7eSAndroid Build Coastguard Worker 		}
166*49cdfc7eSAndroid Build Coastguard Worker 	}
167*49cdfc7eSAndroid Build Coastguard Worker 	cleanup();
168*49cdfc7eSAndroid Build Coastguard Worker 	tst_exit();
169*49cdfc7eSAndroid Build Coastguard Worker }
170*49cdfc7eSAndroid Build Coastguard Worker 
171*49cdfc7eSAndroid Build Coastguard Worker /*
172*49cdfc7eSAndroid Build Coastguard Worker  * setup
173*49cdfc7eSAndroid Build Coastguard Worker  *	performs all ONE TIME setup for this test
174*49cdfc7eSAndroid Build Coastguard Worker  */
setup(void)175*49cdfc7eSAndroid Build Coastguard Worker void setup(void)
176*49cdfc7eSAndroid Build Coastguard Worker {
177*49cdfc7eSAndroid Build Coastguard Worker 	tst_sig(FORK, DEF_HANDLER, cleanup);
178*49cdfc7eSAndroid Build Coastguard Worker 	umask(0);
179*49cdfc7eSAndroid Build Coastguard Worker 	TEST_PAUSE;
180*49cdfc7eSAndroid Build Coastguard Worker 	tst_tmpdir();
181*49cdfc7eSAndroid Build Coastguard Worker }
182*49cdfc7eSAndroid Build Coastguard Worker 
cleanup(void)183*49cdfc7eSAndroid Build Coastguard Worker void cleanup(void)
184*49cdfc7eSAndroid Build Coastguard Worker {
185*49cdfc7eSAndroid Build Coastguard Worker 	tst_rmdir();
186*49cdfc7eSAndroid Build Coastguard Worker 
187*49cdfc7eSAndroid Build Coastguard Worker }
188