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