1b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
2b87390939c55e574c5b4c66a341d80df3863762frobbiew *
3b87390939c55e574c5b4c66a341d80df3863762frobbiew *   Copyright (c) International Business Machines  Corp., 2002
4b87390939c55e574c5b4c66a341d80df3863762frobbiew *
5b87390939c55e574c5b4c66a341d80df3863762frobbiew *   This program is free software;  you can redistribute it and/or modify
6b87390939c55e574c5b4c66a341d80df3863762frobbiew *   it under the terms of the GNU General Public License as published by
7b87390939c55e574c5b4c66a341d80df3863762frobbiew *   the Free Software Foundation; either version 2 of the License, or
8b87390939c55e574c5b4c66a341d80df3863762frobbiew *   (at your option) any later version.
9b87390939c55e574c5b4c66a341d80df3863762frobbiew *
10b87390939c55e574c5b4c66a341d80df3863762frobbiew *   This program is distributed in the hope that it will be useful,
11b87390939c55e574c5b4c66a341d80df3863762frobbiew *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12b87390939c55e574c5b4c66a341d80df3863762frobbiew *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13b87390939c55e574c5b4c66a341d80df3863762frobbiew *   the GNU General Public License for more details.
14b87390939c55e574c5b4c66a341d80df3863762frobbiew *
15b87390939c55e574c5b4c66a341d80df3863762frobbiew *   You should have received a copy of the GNU General Public License
16b87390939c55e574c5b4c66a341d80df3863762frobbiew *   along with this program;  if not, write to the Free Software
174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18b87390939c55e574c5b4c66a341d80df3863762frobbiew */
19b87390939c55e574c5b4c66a341d80df3863762frobbiew
20b87390939c55e574c5b4c66a341d80df3863762frobbiew/* 12/23/2002	Port to LTP	robbiew@us.ibm.com */
21b87390939c55e574c5b4c66a341d80df3863762frobbiew/* 06/30/2001	Port to Linux	nsharoff@us.ibm.com */
22b87390939c55e574c5b4c66a341d80df3863762frobbiew
23b87390939c55e574c5b4c66a341d80df3863762frobbiew#ifndef _GNU_SOURCE
24b87390939c55e574c5b4c66a341d80df3863762frobbiew#define _GNU_SOURCE 1
25b87390939c55e574c5b4c66a341d80df3863762frobbiew#endif
26b87390939c55e574c5b4c66a341d80df3863762frobbiew
27a714316724b351377609a2eacaa188201b297404Garrett Cooper#include <sys/types.h>
28a714316724b351377609a2eacaa188201b297404Garrett Cooper#include <sys/stat.h>
29a714316724b351377609a2eacaa188201b297404Garrett Cooper#include <sys/wait.h>
30b87390939c55e574c5b4c66a341d80df3863762frobbiew#include <errno.h>
31a714316724b351377609a2eacaa188201b297404Garrett Cooper#include <fcntl.h>
32b87390939c55e574c5b4c66a341d80df3863762frobbiew#include <stdio.h>
33b87390939c55e574c5b4c66a341d80df3863762frobbiew#include <stdlib.h>
34a714316724b351377609a2eacaa188201b297404Garrett Cooper#include <string.h>
35b87390939c55e574c5b4c66a341d80df3863762frobbiew#include <termio.h>
36b87390939c55e574c5b4c66a341d80df3863762frobbiew#include <unistd.h>
37b87390939c55e574c5b4c66a341d80df3863762frobbiew
38b87390939c55e574c5b4c66a341d80df3863762frobbiew/** LTP Port **/
39b87390939c55e574c5b4c66a341d80df3863762frobbiew#include "test.h"
40b87390939c55e574c5b4c66a341d80df3863762frobbiew
41354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *TCID = "pty01";		/* Test program identifier.    */
42354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint TST_TOTAL = 5;		/* Total number of test cases. */
43b87390939c55e574c5b4c66a341d80df3863762frobbiew/**************/
44b87390939c55e574c5b4c66a341d80df3863762frobbiew
45b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
46b87390939c55e574c5b4c66a341d80df3863762frobbiew * pty master clone device
47b87390939c55e574c5b4c66a341d80df3863762frobbiew */
48b87390939c55e574c5b4c66a341d80df3863762frobbiew#define MASTERCLONE "/dev/ptmx"
49b87390939c55e574c5b4c66a341d80df3863762frobbiew
50b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
51b87390939c55e574c5b4c66a341d80df3863762frobbiew * string for testing read/write on ptys
52b87390939c55e574c5b4c66a341d80df3863762frobbiew */
53b87390939c55e574c5b4c66a341d80df3863762frobbiew#define STRING "Linux Test Project\n"
54b87390939c55e574c5b4c66a341d80df3863762frobbiew
55b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
56b87390939c55e574c5b4c66a341d80df3863762frobbiew * test buffer size
57b87390939c55e574c5b4c66a341d80df3863762frobbiew */
58b87390939c55e574c5b4c66a341d80df3863762frobbiew#define TESTSIZE 1024
59b87390939c55e574c5b4c66a341d80df3863762frobbiew
60b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
61b87390939c55e574c5b4c66a341d80df3863762frobbiew * mode we expect grantpt() to leave pty as
62b87390939c55e574c5b4c66a341d80df3863762frobbiew */
63b87390939c55e574c5b4c66a341d80df3863762frobbiew#define PTY_MODE 020622
64b87390939c55e574c5b4c66a341d80df3863762frobbiew
65b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
66b87390939c55e574c5b4c66a341d80df3863762frobbiew * number of procs for parallel test
67b87390939c55e574c5b4c66a341d80df3863762frobbiew */
68b87390939c55e574c5b4c66a341d80df3863762frobbiew#define NUMPROCS 15
69bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
70b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
71b87390939c55e574c5b4c66a341d80df3863762frobbiew * test slave locking
72b87390939c55e574c5b4c66a341d80df3863762frobbiew */
73354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int test1(void)
74b87390939c55e574c5b4c66a341d80df3863762frobbiew{
75b87390939c55e574c5b4c66a341d80df3863762frobbiew	int masterfd;		/* master pty fd */
76b87390939c55e574c5b4c66a341d80df3863762frobbiew	int slavefd;		/* slave pty fd */
77b87390939c55e574c5b4c66a341d80df3863762frobbiew	char *slavename;
78b87390939c55e574c5b4c66a341d80df3863762frobbiew	struct stat st;
79b87390939c55e574c5b4c66a341d80df3863762frobbiew	char buf[TESTSIZE];
80b87390939c55e574c5b4c66a341d80df3863762frobbiew
81b87390939c55e574c5b4c66a341d80df3863762frobbiew	masterfd = open(MASTERCLONE, O_RDWR);
82b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (masterfd < 0) {
83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, MASTERCLONE);
84b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
85bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
86b87390939c55e574c5b4c66a341d80df3863762frobbiew	slavename = ptsname(masterfd);
87a714316724b351377609a2eacaa188201b297404Garrett Cooper	if (slavename == NULL) {
88354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
89b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
90b87390939c55e574c5b4c66a341d80df3863762frobbiew
91b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (grantpt(masterfd) != 0) {
92354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
93b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
94b87390939c55e574c5b4c66a341d80df3863762frobbiew
95b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (stat(slavename, &st) != 0) {
96354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "stat(%s) failed", slavename);
97b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
98b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (st.st_uid != getuid()) {
99a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TBROK, NULL, "uid mismatch");
100b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
101b87390939c55e574c5b4c66a341d80df3863762frobbiew
102b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (st.st_mode != (S_IFCHR | S_IRUSR | S_IWUSR | S_IWGRP)) {
103a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TBROK, NULL, "mode mismatch (mode=%o)", st.st_mode);
104b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
105b87390939c55e574c5b4c66a341d80df3863762frobbiew
106b87390939c55e574c5b4c66a341d80df3863762frobbiew	slavefd = open(slavename, O_RDWR);
107a714316724b351377609a2eacaa188201b297404Garrett Cooper	if (slavefd >= 0) {
108a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TBROK, NULL, "open didn't fail as expected!");
109b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
110b87390939c55e574c5b4c66a341d80df3863762frobbiew
111b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (unlockpt(masterfd) != 0) {
112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "unlockpt() failed");
113b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
114bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
115b87390939c55e574c5b4c66a341d80df3863762frobbiew	slavefd = open(slavename, O_RDWR);
116b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (slavefd < 0) {
117a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TBROK, NULL, "Could not open %s", slavename);
118b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
119b87390939c55e574c5b4c66a341d80df3863762frobbiew
120b87390939c55e574c5b4c66a341d80df3863762frobbiew	/*
121b87390939c55e574c5b4c66a341d80df3863762frobbiew	 * test writing to the master / reading from the slave
122b87390939c55e574c5b4c66a341d80df3863762frobbiew	 */
123b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (write(masterfd, STRING, strlen(STRING)) != strlen(STRING)) {
124a714316724b351377609a2eacaa188201b297404Garrett Cooper		/*
125a714316724b351377609a2eacaa188201b297404Garrett Cooper		 * XXX: the errno printout might be garbage, but better to be
126a714316724b351377609a2eacaa188201b297404Garrett Cooper		 * safe than sorry..
127a714316724b351377609a2eacaa188201b297404Garrett Cooper		 */
128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TFAIL | TERRNO, NULL, "write to master");
129b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
130b87390939c55e574c5b4c66a341d80df3863762frobbiew
131b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (read(slavefd, buf, strlen(STRING)) != strlen(STRING)) {
132a714316724b351377609a2eacaa188201b297404Garrett Cooper		/* XXX: Same as write above.. */
133354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TFAIL | TERRNO, NULL, "read from slave");
134b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (strncmp(STRING, buf, strlen(STRING) - 1) != 0) {
136e959aa81d4b978936a8d5c8e0492b8c19e72e1acGarrett Cooper		tst_brkm(TFAIL, NULL,
137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "strings are different (STRING = '%s' != buf = '%s')",
138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 STRING, buf);
139b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
140b87390939c55e574c5b4c66a341d80df3863762frobbiew
141b87390939c55e574c5b4c66a341d80df3863762frobbiew	/*
142b87390939c55e574c5b4c66a341d80df3863762frobbiew	 * test writing to the slave / reading from the master
143b87390939c55e574c5b4c66a341d80df3863762frobbiew	 */
144b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (write(slavefd, STRING, strlen(STRING)) != strlen(STRING)) {
145a714316724b351377609a2eacaa188201b297404Garrett Cooper		/* XXX: Same as write above.. */
146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TFAIL | TERRNO, NULL, "write to slave");
147b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
148b87390939c55e574c5b4c66a341d80df3863762frobbiew
149b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (read(masterfd, buf, strlen(STRING)) != strlen(STRING)) {
150a714316724b351377609a2eacaa188201b297404Garrett Cooper		/* XXX: Same as write above.. */
151354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TFAIL | TERRNO, NULL, "read from master");
152b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (strncmp(STRING, buf, strlen(STRING) - 1) != 0) {
154a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TFAIL, NULL,
155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "strings are different (STRING = '%s' != buf = '%s').",
156354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 STRING, buf);
157b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
158b87390939c55e574c5b4c66a341d80df3863762frobbiew
159b87390939c55e574c5b4c66a341d80df3863762frobbiew	/*
160b87390939c55e574c5b4c66a341d80df3863762frobbiew	 * try an invalid ioctl on the slave...
161b87390939c55e574c5b4c66a341d80df3863762frobbiew	 */
162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ioctl(slavefd, TIOCGWINSZ, NULL) == 0) {
163a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TFAIL, NULL,
164354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "invalid slave TIOCGWINSZ ioctl succeeded.. it should "
165354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "have failed");
166b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
167b87390939c55e574c5b4c66a341d80df3863762frobbiew
168b87390939c55e574c5b4c66a341d80df3863762frobbiew	/*
169b87390939c55e574c5b4c66a341d80df3863762frobbiew	 * try an invalid ioctl on the master...
170b87390939c55e574c5b4c66a341d80df3863762frobbiew	 */
171354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ioctl(masterfd, TIOCGWINSZ, NULL) == 0) {
172a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TFAIL, NULL,
173354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "invalid master TIOCGWINSZ ioctl succeeded.. it should "
174354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "have failed");
175b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
176b87390939c55e574c5b4c66a341d80df3863762frobbiew
177b87390939c55e574c5b4c66a341d80df3863762frobbiew	/*
178b87390939c55e574c5b4c66a341d80df3863762frobbiew	 * close pty fds
179b87390939c55e574c5b4c66a341d80df3863762frobbiew	 */
180b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (close(slavefd) != 0) {
181354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "close of slave");
182b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
183b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (close(masterfd) != 0) {
184354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "close of master");
185b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
186a714316724b351377609a2eacaa188201b297404Garrett Cooper	tst_resm(TPASS, "test1");
187a714316724b351377609a2eacaa188201b297404Garrett Cooper	/** NOTREACHED **/
18843337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak	return 0;
189b87390939c55e574c5b4c66a341d80df3863762frobbiew}
190b87390939c55e574c5b4c66a341d80df3863762frobbiew
191b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
192b87390939c55e574c5b4c66a341d80df3863762frobbiew * test slave operations with closed master
193b87390939c55e574c5b4c66a341d80df3863762frobbiew */
194354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void test2(void)
195b87390939c55e574c5b4c66a341d80df3863762frobbiew{
196b87390939c55e574c5b4c66a341d80df3863762frobbiew	int masterfd;		/* master pty fd */
197b87390939c55e574c5b4c66a341d80df3863762frobbiew	int slavefd;		/* slave pty fd */
198b87390939c55e574c5b4c66a341d80df3863762frobbiew	int i;
199b87390939c55e574c5b4c66a341d80df3863762frobbiew	char *slavename;
200b87390939c55e574c5b4c66a341d80df3863762frobbiew	char c;
201b87390939c55e574c5b4c66a341d80df3863762frobbiew
202b87390939c55e574c5b4c66a341d80df3863762frobbiew	masterfd = open(MASTERCLONE, O_RDWR);
203b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (masterfd < 0) {
204354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, MASTERCLONE);
205b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
206bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
207b87390939c55e574c5b4c66a341d80df3863762frobbiew	slavename = ptsname(masterfd);
2084e2bab8415bfd5ddd552220203ed22c93a4617e5Cyril Hrubis	if (slavename == NULL) {
209354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "ptsname() call failed");
210b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
211b87390939c55e574c5b4c66a341d80df3863762frobbiew
212b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (grantpt(masterfd) != 0) {
213354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "grantpt() call failed");
214b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
215b87390939c55e574c5b4c66a341d80df3863762frobbiew
216b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (unlockpt(masterfd) != 0) {
217354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "unlockpt() call failed");
218b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
219b87390939c55e574c5b4c66a341d80df3863762frobbiew
220b87390939c55e574c5b4c66a341d80df3863762frobbiew	slavefd = open(slavename, O_RDWR);
221b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (slavefd < 0) {
222354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "Could not open %s", slavename);
223b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
224b87390939c55e574c5b4c66a341d80df3863762frobbiew
225b87390939c55e574c5b4c66a341d80df3863762frobbiew	/*
226b87390939c55e574c5b4c66a341d80df3863762frobbiew	 * close pty fds.  See what happens when we close the master
227b87390939c55e574c5b4c66a341d80df3863762frobbiew	 * first.
228b87390939c55e574c5b4c66a341d80df3863762frobbiew	 */
229b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (close(masterfd) != 0) {
230354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "close()");
231b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
232b87390939c55e574c5b4c66a341d80df3863762frobbiew
233b87390939c55e574c5b4c66a341d80df3863762frobbiew	errno = 0;
234b87390939c55e574c5b4c66a341d80df3863762frobbiew	if ((i = read(slavefd, &c, 1)) == 1) {
235e959aa81d4b978936a8d5c8e0492b8c19e72e1acGarrett Cooper		tst_brkm(TFAIL, NULL,
236354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "reading from slave fd should have failed, but didn't"
237354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "(read '%c')", c);
238b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
239b87390939c55e574c5b4c66a341d80df3863762frobbiew
240b87390939c55e574c5b4c66a341d80df3863762frobbiew	if ((i = write(slavefd, &c, 1)) == 1) {
241e959aa81d4b978936a8d5c8e0492b8c19e72e1acGarrett Cooper		tst_brkm(TFAIL, NULL,
242354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "writing to slave fd should have failed, but didn't");
243b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
244b87390939c55e574c5b4c66a341d80df3863762frobbiew
245354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ioctl(slavefd, TIOCGWINSZ, NULL) == 0) {
246e959aa81d4b978936a8d5c8e0492b8c19e72e1acGarrett Cooper		tst_brkm(TFAIL, NULL,
247354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "trying TIOCGWINSZ on slave fd should have failed, "
248354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "but didn't");
249b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
250b87390939c55e574c5b4c66a341d80df3863762frobbiew
251b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (close(slavefd) != 0) {
252e959aa81d4b978936a8d5c8e0492b8c19e72e1acGarrett Cooper		tst_brkm(TBROK, NULL, "close");
253b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
254e959aa81d4b978936a8d5c8e0492b8c19e72e1acGarrett Cooper	tst_resm(TPASS, "test2");
255b87390939c55e574c5b4c66a341d80df3863762frobbiew}
256b87390939c55e574c5b4c66a341d80df3863762frobbiew
257b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
258b87390939c55e574c5b4c66a341d80df3863762frobbiew * test operations on master with closed slave
259b87390939c55e574c5b4c66a341d80df3863762frobbiew */
260354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void test3(void)
261b87390939c55e574c5b4c66a341d80df3863762frobbiew{
262b87390939c55e574c5b4c66a341d80df3863762frobbiew	int masterfd;		/* master pty fd */
263b87390939c55e574c5b4c66a341d80df3863762frobbiew
264b87390939c55e574c5b4c66a341d80df3863762frobbiew	masterfd = open(MASTERCLONE, O_RDWR);
265b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (masterfd < 0) {
266a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TBROK, NULL, MASTERCLONE);
267b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
268b87390939c55e574c5b4c66a341d80df3863762frobbiew
2694e2bab8415bfd5ddd552220203ed22c93a4617e5Cyril Hrubis	if (ioctl(masterfd, TIOCGWINSZ, NULL) == 0) {
270354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TFAIL | TERRNO, NULL,
271354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "trying TIOCGWINSZ on master with no open slave "
272354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "succeeded unexpectedly");
273b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
274354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	tst_resm(TPASS, "test3");
275b87390939c55e574c5b4c66a341d80df3863762frobbiew}
276b87390939c55e574c5b4c66a341d80df3863762frobbiew
277b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
278b87390939c55e574c5b4c66a341d80df3863762frobbiew * test multiple opens on slave side of pty
279b87390939c55e574c5b4c66a341d80df3863762frobbiew */
280354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void test4(void)
281b87390939c55e574c5b4c66a341d80df3863762frobbiew{
282b87390939c55e574c5b4c66a341d80df3863762frobbiew	int masterfd;		/* master pty fd */
283b87390939c55e574c5b4c66a341d80df3863762frobbiew	int slavefd;		/* slave pty fd */
284bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak	int slavefd2;
285bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak	int slavefd3;
286b87390939c55e574c5b4c66a341d80df3863762frobbiew	char *slavename;
287b87390939c55e574c5b4c66a341d80df3863762frobbiew
288b87390939c55e574c5b4c66a341d80df3863762frobbiew	masterfd = open(MASTERCLONE, O_RDWR);
289b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (masterfd < 0) {
290526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "%s", MASTERCLONE);
291b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
292bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
293b87390939c55e574c5b4c66a341d80df3863762frobbiew	slavename = ptsname(masterfd);
2944e2bab8415bfd5ddd552220203ed22c93a4617e5Cyril Hrubis	if (slavename == NULL) {
295526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "ptsname() call failed");
296b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
297b87390939c55e574c5b4c66a341d80df3863762frobbiew
298b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (grantpt(masterfd) != 0) {
299526fdf8d8ea3b43b73de7cc25eb754f12702c8d2Cyril Hrubis		tst_brkm(TBROK, NULL, "grantpt() call failed");
300b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
301b87390939c55e574c5b4c66a341d80df3863762frobbiew
302b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (unlockpt(masterfd) != 0) {
303354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "unlockpt() call failed");
304b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
305b87390939c55e574c5b4c66a341d80df3863762frobbiew
306b87390939c55e574c5b4c66a341d80df3863762frobbiew	slavefd = open(slavename, O_RDWR);
307b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (slavefd < 0) {
308354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "Could not open %s", slavename);
309b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
310b87390939c55e574c5b4c66a341d80df3863762frobbiew
311b87390939c55e574c5b4c66a341d80df3863762frobbiew	slavefd2 = open(slavename, O_RDWR);
312b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (slavefd < 0) {
313354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TFAIL | TERRNO, NULL, "Could not open %s (again)",
314354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 slavename);
315b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
316b87390939c55e574c5b4c66a341d80df3863762frobbiew
317b87390939c55e574c5b4c66a341d80df3863762frobbiew	slavefd3 = open(slavename, O_RDWR);
318b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (slavefd < 0) {
319354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TFAIL | TERRNO, NULL, "Could not open %s (once more)",
320354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 slavename);
321b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
322b87390939c55e574c5b4c66a341d80df3863762frobbiew
323b87390939c55e574c5b4c66a341d80df3863762frobbiew	/*
324b87390939c55e574c5b4c66a341d80df3863762frobbiew	 * close pty fds.
325b87390939c55e574c5b4c66a341d80df3863762frobbiew	 */
326b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (close(slavefd) != 0) {
327354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, NULL, "close slave");
328b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
329b87390939c55e574c5b4c66a341d80df3863762frobbiew
330b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (close(slavefd2) != 0) {
331a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TBROK, NULL, "close slave again");
332b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
333b87390939c55e574c5b4c66a341d80df3863762frobbiew
334b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (close(slavefd3) != 0) {
335a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TBROK, NULL, "close slave once more");
336b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
337b87390939c55e574c5b4c66a341d80df3863762frobbiew
338b87390939c55e574c5b4c66a341d80df3863762frobbiew	if (close(masterfd) != 0) {
339a714316724b351377609a2eacaa188201b297404Garrett Cooper		tst_brkm(TBROK, NULL, "close master");
340bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak	}
341354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	tst_resm(TPASS, "test4");
342b87390939c55e574c5b4c66a341d80df3863762frobbiew}
343b87390939c55e574c5b4c66a341d80df3863762frobbiew
344b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
345b87390939c55e574c5b4c66a341d80df3863762frobbiew * test opening/closing lots of ptys in parallel.  We may run out
346b87390939c55e574c5b4c66a341d80df3863762frobbiew * of ptys for this test depending on how the system is configured,
3472c28215423293e443469a07ae7011135d058b671Garrett Cooper * but that's not a fatal error.
348b87390939c55e574c5b4c66a341d80df3863762frobbiew */
349354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void test5(void)
350b87390939c55e574c5b4c66a341d80df3863762frobbiew{
351b87390939c55e574c5b4c66a341d80df3863762frobbiew	int masterfd;		/* master pty fd */
352b87390939c55e574c5b4c66a341d80df3863762frobbiew	char *slavename;
353b87390939c55e574c5b4c66a341d80df3863762frobbiew	int status;
354b87390939c55e574c5b4c66a341d80df3863762frobbiew	int i;
355b87390939c55e574c5b4c66a341d80df3863762frobbiew
356b87390939c55e574c5b4c66a341d80df3863762frobbiew	for (i = 0; i < NUMPROCS; ++i) {
357b87390939c55e574c5b4c66a341d80df3863762frobbiew		switch (fork()) {
358b87390939c55e574c5b4c66a341d80df3863762frobbiew		case -1:
359a714316724b351377609a2eacaa188201b297404Garrett Cooper			tst_brkm(TBROK, NULL, "fork()");
360b87390939c55e574c5b4c66a341d80df3863762frobbiew			break;
361b87390939c55e574c5b4c66a341d80df3863762frobbiew		case 0:
362b87390939c55e574c5b4c66a341d80df3863762frobbiew			masterfd = open(MASTERCLONE, O_RDWR);
363b87390939c55e574c5b4c66a341d80df3863762frobbiew			if (masterfd < 0) {
364a714316724b351377609a2eacaa188201b297404Garrett Cooper				printf("proc %d: opening %s failed: %s",
365354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       i, MASTERCLONE, strerror(errno));
366a714316724b351377609a2eacaa188201b297404Garrett Cooper				exit(1);
367b87390939c55e574c5b4c66a341d80df3863762frobbiew			}
368b87390939c55e574c5b4c66a341d80df3863762frobbiew			if (grantpt(masterfd) != 0) {
369e959aa81d4b978936a8d5c8e0492b8c19e72e1acGarrett Cooper				printf("proc %d: grantpt() call failed: %s",
370354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       i, strerror(errno));
371a714316724b351377609a2eacaa188201b297404Garrett Cooper				exit(1);
372b87390939c55e574c5b4c66a341d80df3863762frobbiew			}
373b87390939c55e574c5b4c66a341d80df3863762frobbiew			slavename = ptsname(masterfd);
374a714316724b351377609a2eacaa188201b297404Garrett Cooper			if (slavename == NULL) {
375a714316724b351377609a2eacaa188201b297404Garrett Cooper				printf("proc %d: ptsname() call failed: %s",
376354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       i, strerror(errno));
377a714316724b351377609a2eacaa188201b297404Garrett Cooper				exit(1);
378b87390939c55e574c5b4c66a341d80df3863762frobbiew			}
379b87390939c55e574c5b4c66a341d80df3863762frobbiew			sleep(10);
380b87390939c55e574c5b4c66a341d80df3863762frobbiew			if (close(masterfd) != 0) {
381a714316724b351377609a2eacaa188201b297404Garrett Cooper				printf("proc %d: close failed: %s",
382354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       i, strerror(errno));
383a714316724b351377609a2eacaa188201b297404Garrett Cooper				exit(1);
384bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak			}
385a714316724b351377609a2eacaa188201b297404Garrett Cooper			exit(0);
386b87390939c55e574c5b4c66a341d80df3863762frobbiew		default:
387b87390939c55e574c5b4c66a341d80df3863762frobbiew			break;
388b87390939c55e574c5b4c66a341d80df3863762frobbiew		}
389b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
390b87390939c55e574c5b4c66a341d80df3863762frobbiew	while (wait(&status) > 0) {
391a714316724b351377609a2eacaa188201b297404Garrett Cooper		if (status) {
392a714316724b351377609a2eacaa188201b297404Garrett Cooper			tst_brkm(TFAIL, NULL,
393354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 "child exited with non-zero status %d",
394354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				 status);
395b87390939c55e574c5b4c66a341d80df3863762frobbiew		}
396b87390939c55e574c5b4c66a341d80df3863762frobbiew	}
397a714316724b351377609a2eacaa188201b297404Garrett Cooper	tst_resm(TPASS, "test5");
398bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak}
3992c28215423293e443469a07ae7011135d058b671Garrett Cooper
400b87390939c55e574c5b4c66a341d80df3863762frobbiew/*
401b87390939c55e574c5b4c66a341d80df3863762frobbiew * main test driver
402b87390939c55e574c5b4c66a341d80df3863762frobbiew */
403354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(int argc, char **argv)
404b87390939c55e574c5b4c66a341d80df3863762frobbiew{
405b87390939c55e574c5b4c66a341d80df3863762frobbiew	test1();
406b87390939c55e574c5b4c66a341d80df3863762frobbiew	test2();
407b87390939c55e574c5b4c66a341d80df3863762frobbiew	test3();
408b87390939c55e574c5b4c66a341d80df3863762frobbiew	test4();
409b87390939c55e574c5b4c66a341d80df3863762frobbiew	test5();
410b87390939c55e574c5b4c66a341d80df3863762frobbiew
411b87390939c55e574c5b4c66a341d80df3863762frobbiew	/*
412354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	 * all done
413b87390939c55e574c5b4c66a341d80df3863762frobbiew	 */
414b87390939c55e574c5b4c66a341d80df3863762frobbiew	tst_exit();
415ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
416