xref: /aosp_15_r20/external/ltp/testcases/kernel/pty/ptem01.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker /*
2*49cdfc7eSAndroid Build Coastguard Worker  *   Copyright (c) International Business Machines  Corp., 2002
3*49cdfc7eSAndroid Build Coastguard Worker  *   Copyright (c) 2020 Petr Vorel <[email protected]>
4*49cdfc7eSAndroid Build Coastguard Worker  *
5*49cdfc7eSAndroid Build Coastguard Worker  *   This program is free software;  you can redistribute it and/or modify
6*49cdfc7eSAndroid Build Coastguard Worker  *   it under the terms of the GNU General Public License as published by
7*49cdfc7eSAndroid Build Coastguard Worker  *   the Free Software Foundation; either version 2 of the License, or
8*49cdfc7eSAndroid Build Coastguard Worker  *   (at your option) any later version.
9*49cdfc7eSAndroid Build Coastguard Worker  *
10*49cdfc7eSAndroid Build Coastguard Worker  *   This program is distributed in the hope that it will be useful,
11*49cdfc7eSAndroid Build Coastguard Worker  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12*49cdfc7eSAndroid Build Coastguard Worker  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13*49cdfc7eSAndroid Build Coastguard Worker  *   the GNU General Public License for more details.
14*49cdfc7eSAndroid Build Coastguard Worker  *
15*49cdfc7eSAndroid Build Coastguard Worker  *   You should have received a copy of the GNU General Public License
16*49cdfc7eSAndroid Build Coastguard Worker  *   along with this program;  if not, write to the Free Software
17*49cdfc7eSAndroid Build Coastguard Worker  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18*49cdfc7eSAndroid Build Coastguard Worker  */
19*49cdfc7eSAndroid Build Coastguard Worker 
20*49cdfc7eSAndroid Build Coastguard Worker /* 12/23/2002   Port to LTP     [email protected] */
21*49cdfc7eSAndroid Build Coastguard Worker /* 06/30/2001   Port to Linux   [email protected] */
22*49cdfc7eSAndroid Build Coastguard Worker 
23*49cdfc7eSAndroid Build Coastguard Worker #define _GNU_SOURCE
24*49cdfc7eSAndroid Build Coastguard Worker #include <errno.h>
25*49cdfc7eSAndroid Build Coastguard Worker #include <stdio.h>
26*49cdfc7eSAndroid Build Coastguard Worker #include <stdlib.h>
27*49cdfc7eSAndroid Build Coastguard Worker #include <stdio.h>
28*49cdfc7eSAndroid Build Coastguard Worker #include <termios.h>
29*49cdfc7eSAndroid Build Coastguard Worker #include <fcntl.h>
30*49cdfc7eSAndroid Build Coastguard Worker #include <sys/stat.h>
31*49cdfc7eSAndroid Build Coastguard Worker #include <sys/poll.h>
32*49cdfc7eSAndroid Build Coastguard Worker #include <sys/types.h>
33*49cdfc7eSAndroid Build Coastguard Worker 
34*49cdfc7eSAndroid Build Coastguard Worker #include "test.h"
35*49cdfc7eSAndroid Build Coastguard Worker #include "safe_macros.h"
36*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/ioctl.h"
37*49cdfc7eSAndroid Build Coastguard Worker 
38*49cdfc7eSAndroid Build Coastguard Worker char *TCID = "ptem01";		/* Test program identifier.    */
39*49cdfc7eSAndroid Build Coastguard Worker int TST_TOTAL = 6;		/* Total number of test cases. */
40*49cdfc7eSAndroid Build Coastguard Worker /**************/
41*49cdfc7eSAndroid Build Coastguard Worker 
42*49cdfc7eSAndroid Build Coastguard Worker /*
43*49cdfc7eSAndroid Build Coastguard Worker  * pty master clone device
44*49cdfc7eSAndroid Build Coastguard Worker  */
45*49cdfc7eSAndroid Build Coastguard Worker #define MASTERCLONE "/dev/ptmx"
46*49cdfc7eSAndroid Build Coastguard Worker 
47*49cdfc7eSAndroid Build Coastguard Worker #define BUFSZ 4096
48*49cdfc7eSAndroid Build Coastguard Worker 
49*49cdfc7eSAndroid Build Coastguard Worker /*
50*49cdfc7eSAndroid Build Coastguard Worker  * test termio/termios ioctls
51*49cdfc7eSAndroid Build Coastguard Worker  */
test1(void)52*49cdfc7eSAndroid Build Coastguard Worker int test1(void)
53*49cdfc7eSAndroid Build Coastguard Worker {
54*49cdfc7eSAndroid Build Coastguard Worker 	int masterfd, slavefd;
55*49cdfc7eSAndroid Build Coastguard Worker 	char *slavename;
56*49cdfc7eSAndroid Build Coastguard Worker 	struct termio termio;
57*49cdfc7eSAndroid Build Coastguard Worker 	struct termios termios;
58*49cdfc7eSAndroid Build Coastguard Worker 
59*49cdfc7eSAndroid Build Coastguard Worker 	masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
60*49cdfc7eSAndroid Build Coastguard Worker 
61*49cdfc7eSAndroid Build Coastguard Worker 	slavename = ptsname(masterfd);
62*49cdfc7eSAndroid Build Coastguard Worker 	if (slavename == NULL) {
63*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
64*49cdfc7eSAndroid Build Coastguard Worker 	}
65*49cdfc7eSAndroid Build Coastguard Worker 
66*49cdfc7eSAndroid Build Coastguard Worker 	if (grantpt(masterfd) != 0) {
67*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
68*49cdfc7eSAndroid Build Coastguard Worker 	}
69*49cdfc7eSAndroid Build Coastguard Worker 
70*49cdfc7eSAndroid Build Coastguard Worker 	if (unlockpt(masterfd) != 0) {
71*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "unlockpt() call failed");
72*49cdfc7eSAndroid Build Coastguard Worker 	}
73*49cdfc7eSAndroid Build Coastguard Worker 
74*49cdfc7eSAndroid Build Coastguard Worker 	if ((slavefd = open(slavename, O_RDWR)) < 0) {
75*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "Could not open %s", slavename);
76*49cdfc7eSAndroid Build Coastguard Worker 	}
77*49cdfc7eSAndroid Build Coastguard Worker 
78*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCGETS, &termios) != 0) {
79*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCGETS");
80*49cdfc7eSAndroid Build Coastguard Worker 	}
81*49cdfc7eSAndroid Build Coastguard Worker 
82*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCSETS, &termios) != 0) {
83*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCSETS");
84*49cdfc7eSAndroid Build Coastguard Worker 	}
85*49cdfc7eSAndroid Build Coastguard Worker 
86*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCSETSW, &termios) != 0) {
87*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCSETSW");
88*49cdfc7eSAndroid Build Coastguard Worker 	}
89*49cdfc7eSAndroid Build Coastguard Worker 
90*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCSETSF, &termios) != 0) {
91*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCSETSF");
92*49cdfc7eSAndroid Build Coastguard Worker 	}
93*49cdfc7eSAndroid Build Coastguard Worker 
94*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCSETS, &termios) != 0) {
95*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCSETS");
96*49cdfc7eSAndroid Build Coastguard Worker 	}
97*49cdfc7eSAndroid Build Coastguard Worker 
98*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCGETA, &termio) != 0) {
99*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCGETA");
100*49cdfc7eSAndroid Build Coastguard Worker 	}
101*49cdfc7eSAndroid Build Coastguard Worker 
102*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCSETA, &termio) != 0) {
103*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCSETA");
104*49cdfc7eSAndroid Build Coastguard Worker 	}
105*49cdfc7eSAndroid Build Coastguard Worker 
106*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCSETAW, &termio) != 0) {
107*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCSETAW");
108*49cdfc7eSAndroid Build Coastguard Worker 	}
109*49cdfc7eSAndroid Build Coastguard Worker 
110*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCSETAF, &termio) != 0) {
111*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCSETAF");
112*49cdfc7eSAndroid Build Coastguard Worker 	}
113*49cdfc7eSAndroid Build Coastguard Worker 
114*49cdfc7eSAndroid Build Coastguard Worker 	if (close(slavefd) != 0) {
115*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close slave");
116*49cdfc7eSAndroid Build Coastguard Worker 	}
117*49cdfc7eSAndroid Build Coastguard Worker 
118*49cdfc7eSAndroid Build Coastguard Worker 	if (close(masterfd) != 0) {
119*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close master");
120*49cdfc7eSAndroid Build Coastguard Worker 	}
121*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TPASS, "test1");
122*49cdfc7eSAndroid Build Coastguard Worker 
123*49cdfc7eSAndroid Build Coastguard Worker 	/** NOT REACHED **/
124*49cdfc7eSAndroid Build Coastguard Worker 	return 0;
125*49cdfc7eSAndroid Build Coastguard Worker }
126*49cdfc7eSAndroid Build Coastguard Worker 
127*49cdfc7eSAndroid Build Coastguard Worker /*
128*49cdfc7eSAndroid Build Coastguard Worker  * test window size setting and getting
129*49cdfc7eSAndroid Build Coastguard Worker  */
test2(void)130*49cdfc7eSAndroid Build Coastguard Worker int test2(void)
131*49cdfc7eSAndroid Build Coastguard Worker {
132*49cdfc7eSAndroid Build Coastguard Worker 	int masterfd, slavefd;
133*49cdfc7eSAndroid Build Coastguard Worker 	char *slavename;
134*49cdfc7eSAndroid Build Coastguard Worker 	struct winsize wsz;
135*49cdfc7eSAndroid Build Coastguard Worker 	struct winsize wsz1 = { 24, 80, 5, 10 };
136*49cdfc7eSAndroid Build Coastguard Worker 	struct winsize wsz2 = { 60, 100, 11, 777 };
137*49cdfc7eSAndroid Build Coastguard Worker 
138*49cdfc7eSAndroid Build Coastguard Worker 	masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
139*49cdfc7eSAndroid Build Coastguard Worker 
140*49cdfc7eSAndroid Build Coastguard Worker 	slavename = ptsname(masterfd);
141*49cdfc7eSAndroid Build Coastguard Worker 	if (slavename == NULL) {
142*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
143*49cdfc7eSAndroid Build Coastguard Worker 	}
144*49cdfc7eSAndroid Build Coastguard Worker 
145*49cdfc7eSAndroid Build Coastguard Worker 	if (grantpt(masterfd) != 0) {
146*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
147*49cdfc7eSAndroid Build Coastguard Worker 	}
148*49cdfc7eSAndroid Build Coastguard Worker 
149*49cdfc7eSAndroid Build Coastguard Worker 	if (unlockpt(masterfd) != 0) {
150*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "unlockpt() call failed");
151*49cdfc7eSAndroid Build Coastguard Worker 	}
152*49cdfc7eSAndroid Build Coastguard Worker 
153*49cdfc7eSAndroid Build Coastguard Worker 	if ((slavefd = open(slavename, O_RDWR)) < 0) {
154*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "Could not open %s", slavename);
155*49cdfc7eSAndroid Build Coastguard Worker 	}
156*49cdfc7eSAndroid Build Coastguard Worker 
157*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(masterfd, TIOCSWINSZ, &wsz1) != 0) {
158*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TIOCSWINSZ");
159*49cdfc7eSAndroid Build Coastguard Worker 	}
160*49cdfc7eSAndroid Build Coastguard Worker 
161*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TIOCGWINSZ, &wsz) != 0) {
162*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TIOCGWINSZ");
163*49cdfc7eSAndroid Build Coastguard Worker 	}
164*49cdfc7eSAndroid Build Coastguard Worker 
165*49cdfc7eSAndroid Build Coastguard Worker 	if (wsz.ws_row != wsz1.ws_row || wsz.ws_col != wsz1.ws_col ||
166*49cdfc7eSAndroid Build Coastguard Worker 	    wsz.ws_xpixel != wsz1.ws_xpixel ||
167*49cdfc7eSAndroid Build Coastguard Worker 	    wsz.ws_ypixel != wsz1.ws_ypixel) {
168*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "unexpected window size returned");
169*49cdfc7eSAndroid Build Coastguard Worker 	}
170*49cdfc7eSAndroid Build Coastguard Worker 
171*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(masterfd, TIOCGWINSZ, &wsz) != 0) {
172*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TIOCGWINSZ");
173*49cdfc7eSAndroid Build Coastguard Worker 	}
174*49cdfc7eSAndroid Build Coastguard Worker 
175*49cdfc7eSAndroid Build Coastguard Worker 	if (wsz.ws_row != wsz1.ws_row || wsz.ws_col != wsz1.ws_col ||
176*49cdfc7eSAndroid Build Coastguard Worker 	    wsz.ws_xpixel != wsz1.ws_xpixel ||
177*49cdfc7eSAndroid Build Coastguard Worker 	    wsz.ws_ypixel != wsz1.ws_ypixel) {
178*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "unexpected window size returned");
179*49cdfc7eSAndroid Build Coastguard Worker 	}
180*49cdfc7eSAndroid Build Coastguard Worker 
181*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TIOCSWINSZ, &wsz2) != 0) {
182*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TIOCSWINSZ");
183*49cdfc7eSAndroid Build Coastguard Worker 	}
184*49cdfc7eSAndroid Build Coastguard Worker 
185*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TIOCGWINSZ, &wsz) != 0) {
186*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TIOCGWINSZ");
187*49cdfc7eSAndroid Build Coastguard Worker 	}
188*49cdfc7eSAndroid Build Coastguard Worker 
189*49cdfc7eSAndroid Build Coastguard Worker 	if (wsz.ws_row != wsz2.ws_row || wsz.ws_col != wsz2.ws_col ||
190*49cdfc7eSAndroid Build Coastguard Worker 	    wsz.ws_xpixel != wsz2.ws_xpixel ||
191*49cdfc7eSAndroid Build Coastguard Worker 	    wsz.ws_ypixel != wsz2.ws_ypixel) {
192*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "unexpected window size returned");
193*49cdfc7eSAndroid Build Coastguard Worker 	}
194*49cdfc7eSAndroid Build Coastguard Worker 
195*49cdfc7eSAndroid Build Coastguard Worker 	if (close(slavefd) != 0) {
196*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close");
197*49cdfc7eSAndroid Build Coastguard Worker 	}
198*49cdfc7eSAndroid Build Coastguard Worker 
199*49cdfc7eSAndroid Build Coastguard Worker 	if (close(masterfd) != 0) {
200*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close");
201*49cdfc7eSAndroid Build Coastguard Worker 	}
202*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TPASS, "test2");
203*49cdfc7eSAndroid Build Coastguard Worker 
204*49cdfc7eSAndroid Build Coastguard Worker 	/** NOT REACHED **/
205*49cdfc7eSAndroid Build Coastguard Worker 	return 0;
206*49cdfc7eSAndroid Build Coastguard Worker }
207*49cdfc7eSAndroid Build Coastguard Worker 
208*49cdfc7eSAndroid Build Coastguard Worker /*
209*49cdfc7eSAndroid Build Coastguard Worker  * test sending a break
210*49cdfc7eSAndroid Build Coastguard Worker  */
test3(void)211*49cdfc7eSAndroid Build Coastguard Worker int test3(void)
212*49cdfc7eSAndroid Build Coastguard Worker {
213*49cdfc7eSAndroid Build Coastguard Worker 	int masterfd, slavefd;
214*49cdfc7eSAndroid Build Coastguard Worker 	char *slavename;
215*49cdfc7eSAndroid Build Coastguard Worker 
216*49cdfc7eSAndroid Build Coastguard Worker 	masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
217*49cdfc7eSAndroid Build Coastguard Worker 
218*49cdfc7eSAndroid Build Coastguard Worker 	slavename = ptsname(masterfd);
219*49cdfc7eSAndroid Build Coastguard Worker 	if (slavename == NULL) {
220*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
221*49cdfc7eSAndroid Build Coastguard Worker 	}
222*49cdfc7eSAndroid Build Coastguard Worker 
223*49cdfc7eSAndroid Build Coastguard Worker 	if (grantpt(masterfd) != 0) {
224*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
225*49cdfc7eSAndroid Build Coastguard Worker 	}
226*49cdfc7eSAndroid Build Coastguard Worker 
227*49cdfc7eSAndroid Build Coastguard Worker 	if (unlockpt(masterfd) != 0) {
228*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "unlockpt() call failed");
229*49cdfc7eSAndroid Build Coastguard Worker 	}
230*49cdfc7eSAndroid Build Coastguard Worker 
231*49cdfc7eSAndroid Build Coastguard Worker 	if ((slavefd = open(slavename, O_RDWR)) < 0) {
232*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "Could not open %s", slavename);
233*49cdfc7eSAndroid Build Coastguard Worker 	}
234*49cdfc7eSAndroid Build Coastguard Worker 
235*49cdfc7eSAndroid Build Coastguard Worker 	if (tcsendbreak(masterfd, 10) != 0) {
236*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "tcsendbreak");
237*49cdfc7eSAndroid Build Coastguard Worker 	}
238*49cdfc7eSAndroid Build Coastguard Worker 
239*49cdfc7eSAndroid Build Coastguard Worker 	if (tcsendbreak(slavefd, 10) != 0) {
240*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "tcsendbreak");
241*49cdfc7eSAndroid Build Coastguard Worker 	}
242*49cdfc7eSAndroid Build Coastguard Worker 
243*49cdfc7eSAndroid Build Coastguard Worker 	if (close(slavefd) != 0) {
244*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close slave");
245*49cdfc7eSAndroid Build Coastguard Worker 	}
246*49cdfc7eSAndroid Build Coastguard Worker 
247*49cdfc7eSAndroid Build Coastguard Worker 	if (close(masterfd) != 0) {
248*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close master");
249*49cdfc7eSAndroid Build Coastguard Worker 	}
250*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TPASS, "test3");
251*49cdfc7eSAndroid Build Coastguard Worker 
252*49cdfc7eSAndroid Build Coastguard Worker 	/** NOT REACHED **/
253*49cdfc7eSAndroid Build Coastguard Worker 	return 0;
254*49cdfc7eSAndroid Build Coastguard Worker }
255*49cdfc7eSAndroid Build Coastguard Worker 
256*49cdfc7eSAndroid Build Coastguard Worker /*
257*49cdfc7eSAndroid Build Coastguard Worker  * test multiple opens of slave side
258*49cdfc7eSAndroid Build Coastguard Worker  */
test4(void)259*49cdfc7eSAndroid Build Coastguard Worker int test4(void)
260*49cdfc7eSAndroid Build Coastguard Worker {
261*49cdfc7eSAndroid Build Coastguard Worker 	int masterfd, slavefd, slavefd2, slavefd3;
262*49cdfc7eSAndroid Build Coastguard Worker 	char *slavename;
263*49cdfc7eSAndroid Build Coastguard Worker 
264*49cdfc7eSAndroid Build Coastguard Worker 	masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
265*49cdfc7eSAndroid Build Coastguard Worker 
266*49cdfc7eSAndroid Build Coastguard Worker 	slavename = ptsname(masterfd);
267*49cdfc7eSAndroid Build Coastguard Worker 	if (slavename == NULL) {
268*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
269*49cdfc7eSAndroid Build Coastguard Worker 	}
270*49cdfc7eSAndroid Build Coastguard Worker 
271*49cdfc7eSAndroid Build Coastguard Worker 	if (grantpt(masterfd) != 0) {
272*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
273*49cdfc7eSAndroid Build Coastguard Worker 	}
274*49cdfc7eSAndroid Build Coastguard Worker 
275*49cdfc7eSAndroid Build Coastguard Worker 	if (unlockpt(masterfd) != 0) {
276*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "unlockpt() call failed");
277*49cdfc7eSAndroid Build Coastguard Worker 	}
278*49cdfc7eSAndroid Build Coastguard Worker 
279*49cdfc7eSAndroid Build Coastguard Worker 	if ((slavefd = open(slavename, O_RDWR)) < 0) {
280*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "Could not open %s", slavename);
281*49cdfc7eSAndroid Build Coastguard Worker 	}
282*49cdfc7eSAndroid Build Coastguard Worker 
283*49cdfc7eSAndroid Build Coastguard Worker 	if ((slavefd2 = open(slavename, O_RDWR)) < 0) {
284*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "Could not open %s (again)", slavename);
285*49cdfc7eSAndroid Build Coastguard Worker 	}
286*49cdfc7eSAndroid Build Coastguard Worker 
287*49cdfc7eSAndroid Build Coastguard Worker 	if ((slavefd3 = open(slavename, O_RDWR)) < 0) {
288*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "Could not open %s (once more)",
289*49cdfc7eSAndroid Build Coastguard Worker 			 slavename);
290*49cdfc7eSAndroid Build Coastguard Worker 	}
291*49cdfc7eSAndroid Build Coastguard Worker 
292*49cdfc7eSAndroid Build Coastguard Worker 	if (close(slavefd) != 0) {
293*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close slave");
294*49cdfc7eSAndroid Build Coastguard Worker 	}
295*49cdfc7eSAndroid Build Coastguard Worker 	if (close(slavefd2) != 0) {
296*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close slave again");
297*49cdfc7eSAndroid Build Coastguard Worker 	}
298*49cdfc7eSAndroid Build Coastguard Worker 	if (close(slavefd3) != 0) {
299*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close slave once more");
300*49cdfc7eSAndroid Build Coastguard Worker 	}
301*49cdfc7eSAndroid Build Coastguard Worker 	if (close(masterfd) != 0) {
302*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close master");
303*49cdfc7eSAndroid Build Coastguard Worker 	}
304*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TPASS, "test4");
305*49cdfc7eSAndroid Build Coastguard Worker 
306*49cdfc7eSAndroid Build Coastguard Worker 	/** NOT REACHED **/
307*49cdfc7eSAndroid Build Coastguard Worker 	return 0;
308*49cdfc7eSAndroid Build Coastguard Worker }
309*49cdfc7eSAndroid Build Coastguard Worker 
310*49cdfc7eSAndroid Build Coastguard Worker #define NUMOPENS 6
311*49cdfc7eSAndroid Build Coastguard Worker 
312*49cdfc7eSAndroid Build Coastguard Worker /*
313*49cdfc7eSAndroid Build Coastguard Worker  * test several simultaneous opens
314*49cdfc7eSAndroid Build Coastguard Worker  */
test5(void)315*49cdfc7eSAndroid Build Coastguard Worker int test5(void)
316*49cdfc7eSAndroid Build Coastguard Worker {
317*49cdfc7eSAndroid Build Coastguard Worker 	static int masterfd[NUMOPENS];
318*49cdfc7eSAndroid Build Coastguard Worker 	static int slavefd[NUMOPENS];
319*49cdfc7eSAndroid Build Coastguard Worker 	char *slavename;
320*49cdfc7eSAndroid Build Coastguard Worker 	int i;
321*49cdfc7eSAndroid Build Coastguard Worker 
322*49cdfc7eSAndroid Build Coastguard Worker 	for (i = 0; i < NUMOPENS; ++i) {
323*49cdfc7eSAndroid Build Coastguard Worker 		masterfd[i] = open(MASTERCLONE, O_RDWR);
324*49cdfc7eSAndroid Build Coastguard Worker 		if (masterfd[i] < 0) {
325*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TBROK, "%s", MASTERCLONE);
326*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TBROK, "out of ptys");
327*49cdfc7eSAndroid Build Coastguard Worker 			for (i = 0; i < NUMOPENS; ++i) {
328*49cdfc7eSAndroid Build Coastguard Worker 				if (masterfd[i] != 0) {
329*49cdfc7eSAndroid Build Coastguard Worker 					(void)close(masterfd[i]);
330*49cdfc7eSAndroid Build Coastguard Worker 				}
331*49cdfc7eSAndroid Build Coastguard Worker 				if (slavefd[i] != 0) {
332*49cdfc7eSAndroid Build Coastguard Worker 					(void)close(slavefd[i]);
333*49cdfc7eSAndroid Build Coastguard Worker 				}
334*49cdfc7eSAndroid Build Coastguard Worker 			}
335*49cdfc7eSAndroid Build Coastguard Worker 			tst_exit();
336*49cdfc7eSAndroid Build Coastguard Worker 		}
337*49cdfc7eSAndroid Build Coastguard Worker 
338*49cdfc7eSAndroid Build Coastguard Worker 		slavename = ptsname(masterfd[i]);
339*49cdfc7eSAndroid Build Coastguard Worker 		if (slavename == NULL) {
340*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK | TERRNO, NULL,
341*49cdfc7eSAndroid Build Coastguard Worker 				 "ptsname() call failed");
342*49cdfc7eSAndroid Build Coastguard Worker 		}
343*49cdfc7eSAndroid Build Coastguard Worker 
344*49cdfc7eSAndroid Build Coastguard Worker 		if (grantpt(masterfd[i]) != 0) {
345*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK | TERRNO, NULL,
346*49cdfc7eSAndroid Build Coastguard Worker 				 "grantpt() call failed");
347*49cdfc7eSAndroid Build Coastguard Worker 		}
348*49cdfc7eSAndroid Build Coastguard Worker 
349*49cdfc7eSAndroid Build Coastguard Worker 		if (unlockpt(masterfd[i]) != 0) {
350*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK, NULL, "unlockpt() call failed");
351*49cdfc7eSAndroid Build Coastguard Worker 		}
352*49cdfc7eSAndroid Build Coastguard Worker 
353*49cdfc7eSAndroid Build Coastguard Worker 		if ((slavefd[i] = open(slavename, O_RDWR)) < 0) {
354*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TFAIL, NULL,
355*49cdfc7eSAndroid Build Coastguard Worker 				 "Iteration %d: Could not open %s", i,
356*49cdfc7eSAndroid Build Coastguard Worker 				 slavename);
357*49cdfc7eSAndroid Build Coastguard Worker 		}
358*49cdfc7eSAndroid Build Coastguard Worker 
359*49cdfc7eSAndroid Build Coastguard Worker 	}
360*49cdfc7eSAndroid Build Coastguard Worker 
361*49cdfc7eSAndroid Build Coastguard Worker 	for (i = 0; i < NUMOPENS; ++i) {
362*49cdfc7eSAndroid Build Coastguard Worker 		if (close(slavefd[i]) != 0) {
363*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK, NULL, "Iteration %d: close slave", i);
364*49cdfc7eSAndroid Build Coastguard Worker 		}
365*49cdfc7eSAndroid Build Coastguard Worker 		if (close(masterfd[i]) != 0) {
366*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK, NULL, "close master");
367*49cdfc7eSAndroid Build Coastguard Worker 		}
368*49cdfc7eSAndroid Build Coastguard Worker 	}
369*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TPASS, "test5");
370*49cdfc7eSAndroid Build Coastguard Worker 
371*49cdfc7eSAndroid Build Coastguard Worker 	/** NOT REACHED **/
372*49cdfc7eSAndroid Build Coastguard Worker 	return 0;
373*49cdfc7eSAndroid Build Coastguard Worker }
374*49cdfc7eSAndroid Build Coastguard Worker 
375*49cdfc7eSAndroid Build Coastguard Worker /*
376*49cdfc7eSAndroid Build Coastguard Worker  * test hangup semantics
377*49cdfc7eSAndroid Build Coastguard Worker  */
test6(void)378*49cdfc7eSAndroid Build Coastguard Worker int test6(void)
379*49cdfc7eSAndroid Build Coastguard Worker {
380*49cdfc7eSAndroid Build Coastguard Worker 	static int masterfd;
381*49cdfc7eSAndroid Build Coastguard Worker 	static int slavefd;
382*49cdfc7eSAndroid Build Coastguard Worker 	char *slavename;
383*49cdfc7eSAndroid Build Coastguard Worker 	struct termios termios;
384*49cdfc7eSAndroid Build Coastguard Worker 
385*49cdfc7eSAndroid Build Coastguard Worker 	masterfd = SAFE_OPEN(NULL, MASTERCLONE, O_RDWR);
386*49cdfc7eSAndroid Build Coastguard Worker 
387*49cdfc7eSAndroid Build Coastguard Worker 	slavename = ptsname(masterfd);
388*49cdfc7eSAndroid Build Coastguard Worker 	if (slavename == NULL) {
389*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
390*49cdfc7eSAndroid Build Coastguard Worker 	}
391*49cdfc7eSAndroid Build Coastguard Worker 
392*49cdfc7eSAndroid Build Coastguard Worker 	if (grantpt(masterfd) != 0) {
393*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
394*49cdfc7eSAndroid Build Coastguard Worker 	}
395*49cdfc7eSAndroid Build Coastguard Worker 
396*49cdfc7eSAndroid Build Coastguard Worker 	if (unlockpt(masterfd) != 0) {
397*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "unlockpt() call failed");
398*49cdfc7eSAndroid Build Coastguard Worker 	}
399*49cdfc7eSAndroid Build Coastguard Worker 
400*49cdfc7eSAndroid Build Coastguard Worker 	if ((slavefd = open(slavename, O_RDWR)) < 0) {
401*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "Could not open %s", slavename);
402*49cdfc7eSAndroid Build Coastguard Worker 	}
403*49cdfc7eSAndroid Build Coastguard Worker 
404*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCGETS, &termios) != 0) {
405*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCGETS");
406*49cdfc7eSAndroid Build Coastguard Worker 	}
407*49cdfc7eSAndroid Build Coastguard Worker 
408*49cdfc7eSAndroid Build Coastguard Worker 	termios.c_cflag &= ~CBAUD;
409*49cdfc7eSAndroid Build Coastguard Worker 	termios.c_cflag |= B0 & CBAUD;
410*49cdfc7eSAndroid Build Coastguard Worker 	if (ioctl(slavefd, TCSETS, &termios) != 0) {
411*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TFAIL, NULL, "TCGETS");
412*49cdfc7eSAndroid Build Coastguard Worker 	}
413*49cdfc7eSAndroid Build Coastguard Worker 
414*49cdfc7eSAndroid Build Coastguard Worker 	if (close(slavefd) != 0) {
415*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close");
416*49cdfc7eSAndroid Build Coastguard Worker 	}
417*49cdfc7eSAndroid Build Coastguard Worker 	if (close(masterfd) != 0) {
418*49cdfc7eSAndroid Build Coastguard Worker 		tst_brkm(TBROK, NULL, "close");
419*49cdfc7eSAndroid Build Coastguard Worker 	}
420*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TPASS, "test6");
421*49cdfc7eSAndroid Build Coastguard Worker 
422*49cdfc7eSAndroid Build Coastguard Worker 	/** NOT REACHED **/
423*49cdfc7eSAndroid Build Coastguard Worker 	return 0;
424*49cdfc7eSAndroid Build Coastguard Worker }
425*49cdfc7eSAndroid Build Coastguard Worker 
426*49cdfc7eSAndroid Build Coastguard Worker /*
427*49cdfc7eSAndroid Build Coastguard Worker  * main test driver
428*49cdfc7eSAndroid Build Coastguard Worker  */
main(void)429*49cdfc7eSAndroid Build Coastguard Worker int main(void)
430*49cdfc7eSAndroid Build Coastguard Worker {
431*49cdfc7eSAndroid Build Coastguard Worker 	test1();
432*49cdfc7eSAndroid Build Coastguard Worker 	test2();
433*49cdfc7eSAndroid Build Coastguard Worker 	test3();
434*49cdfc7eSAndroid Build Coastguard Worker 	test4();
435*49cdfc7eSAndroid Build Coastguard Worker 	test5();
436*49cdfc7eSAndroid Build Coastguard Worker 	test6();
437*49cdfc7eSAndroid Build Coastguard Worker 	/*
438*49cdfc7eSAndroid Build Coastguard Worker 	 * all done
439*49cdfc7eSAndroid Build Coastguard Worker 	 */
440*49cdfc7eSAndroid Build Coastguard Worker 	tst_exit();
441*49cdfc7eSAndroid Build Coastguard Worker }
442