blob: 739abedf16a1dbd5ecb450680536a0fe4ff73be1 [file] [log] [blame]
plars865695b2001-08-27 22:15:12 +00001/*
2 *
3 * Copyright (c) International Business Machines Corp., 2001
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13 * the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
Wanlong Gao4548c6c2012-10-19 18:03:36 +080017 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
plars865695b2001-08-27 22:15:12 +000018 */
19
20/*
21 * NAME
22 * ioctl02.c
23 *
24 * DESCRIPTION
25 * Testcase to test the TCGETA, and TCSETA ioctl implementations for
26 * the tty driver
27 *
28 * ALGORITHM
29 * In this test, the parent and child open the parentty and the childtty
30 * respectively. After opening the childtty the child flushes the stream
31 * and sends a SIGUSR1 to the parent (thereby asking it to continue its
32 * testing). The parent, which was waiting for this signal to arrive, now
33 * starts the testing. It issues a TCGETA ioctl to get all the tty
34 * parameters. It then changes them to known values by issuing a TCSETA
35 * ioctl. Then the parent issues a TCGETA ioctl again and compares the
36 * received values with what it had set earlier. The test fails if TCGETA
37 * or TCSETA fails, or if the received values don't match those that were
38 * set. The parent does all the testing, the requirement of the child
39 * process is to moniter the testing done by the parent, and hence the
40 * child just waits for the parent.
41 *
42 * USAGE: <for command-line>
43 * ioctl02 -D /dev/tty[0-9] [-c n] [-f] [-i n] [-I x] [-P x] [-t]
44 * where, -c n : Run n copies concurrently.
45 * -f : Turn off functionality Testing.
46 * -i n : Execute test n times.
47 * -I x : Execute test for x seconds.
48 * -P x : Pause for x seconds between iterations.
49 * -t : Turn on syscall timing.
50 *
51 * HISTORY
52 * 07/2001 Ported by Wayne Boyer
53 *
54 * RESTRICTIONS
55 * test must be run with the -D option
56 * test may have to be run as root depending on the tty permissions
57 */
58
59#include <stdio.h>
plars865695b2001-08-27 22:15:12 +000060#include <termio.h>
61#include <fcntl.h>
62#include <signal.h>
63#include <errno.h>
robbiew0f24d852003-03-26 21:07:16 +000064#include <wait.h>
65#include <sys/types.h>
66#include <sys/stat.h>
67#include <sys/ioctl.h>
68#include <sys/termios.h>
plars865695b2001-08-27 22:15:12 +000069#include "test.h"
plars865695b2001-08-27 22:15:12 +000070
71#define CNUL 0
72
73char *TCID = "ioctl02";
74int TST_TOTAL = 1;
plars865695b2001-08-27 22:15:12 +000075
Wanlong Gao6633ce92012-11-05 11:19:57 +080076static struct termio termio, save_io;
plars865695b2001-08-27 22:15:12 +000077
Wanlong Gao6633ce92012-11-05 11:19:57 +080078static char *parenttty, *childtty;
79static int parentfd, childfd;
80static int parentpid, childpid;
81static volatile int sigterm, sigusr1, sigusr2;
82static int closed = 1;
plars865695b2001-08-27 22:15:12 +000083
Wanlong Gao6633ce92012-11-05 11:19:57 +080084static int do_child_setup(void);
85static int do_parent_setup(void);
86static int run_ptest(void);
87static int run_ctest(void);
88static int chk_tty_parms();
89static void setup(void);
90static void cleanup(void);
91static void help(void);
92static void do_child(void);
robbiewd34d5812005-07-11 22:28:09 +000093void do_child_uclinux(void);
Wanlong Gao6633ce92012-11-05 11:19:57 +080094static void sigterm_handler(void);
plars865695b2001-08-27 22:15:12 +000095
Wanlong Gao6633ce92012-11-05 11:19:57 +080096static int Devflag;
97static char *devname;
plars865695b2001-08-27 22:15:12 +000098
99/* for test specific parse_opts options - in this case "-D" */
Wanlong Gao6633ce92012-11-05 11:19:57 +0800100static option_t options[] = {
plars865695b2001-08-27 22:15:12 +0000101 {"D:", &Devflag, &devname},
102 {NULL, NULL, NULL}
103};
104
robbiew0f24d852003-03-26 21:07:16 +0000105int main(int ac, char **av)
plars865695b2001-08-27 22:15:12 +0000106{
Cyril Hrubis89af32a2012-10-24 16:39:11 +0200107 int lc;
plars865695b2001-08-27 22:15:12 +0000108 int rval;
Cyril Hrubis0b9589f2014-05-27 17:40:33 +0200109 const char *msg;
plars865695b2001-08-27 22:15:12 +0000110
Wanlong Gao6633ce92012-11-05 11:19:57 +0800111 msg = parse_opts(ac, av, options, &help);
112 if (msg != NULL)
Garrett Cooper60fa8012010-11-22 13:50:58 -0800113 tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
robbiewd34d5812005-07-11 22:28:09 +0000114#ifdef UCLINUX
115 maybe_run_child(&do_child_uclinux, "dS", &parentpid, &childtty);
116#endif
117
Garrett Cooper2b6b1ee2010-12-19 05:07:50 -0800118 if (!Devflag)
119 tst_brkm(TBROK, NULL, "You must specify a tty device with "
plars865695b2001-08-27 22:15:12 +0000120 "the -D option.");
plars865695b2001-08-27 22:15:12 +0000121
Garrett Cooperff29dd12010-12-19 05:05:40 -0800122 tst_require_root(NULL);
subrata_modaked216842008-09-24 15:58:12 +0000123
plars865695b2001-08-27 22:15:12 +0000124 setup();
125
plars865695b2001-08-27 22:15:12 +0000126 for (lc = 0; TEST_LOOPING(lc); lc++) {
127
Caspar Zhangd59a6592013-03-07 14:59:12 +0800128 tst_count = 0;
plars865695b2001-08-27 22:15:12 +0000129
130 parenttty = devname;
131 childtty = devname;
132
133 parentpid = getpid();
134
Wanlong Gao6633ce92012-11-05 11:19:57 +0800135 childpid = FORK_OR_VFORK();
136 if (childpid < 0)
Garrett Cooperff29dd12010-12-19 05:05:40 -0800137 tst_brkm(TBROK, cleanup, "fork failed");
plars865695b2001-08-27 22:15:12 +0000138
subrata_modak56207ce2009-03-23 13:35:39 +0000139 if (childpid == 0) { /* child */
robbiewd34d5812005-07-11 22:28:09 +0000140#ifdef UCLINUX
Garrett Cooperff29dd12010-12-19 05:05:40 -0800141 if (self_exec(av[0], "dS", parentpid, childtty) < 0)
robbiewd34d5812005-07-11 22:28:09 +0000142 tst_brkm(TBROK, cleanup, "self_exec failed");
robbiewd34d5812005-07-11 22:28:09 +0000143#else
144 do_child();
145#endif
plars865695b2001-08-27 22:15:12 +0000146 }
147
Garrett Cooperff29dd12010-12-19 05:05:40 -0800148 while (!sigusr1)
plars865695b2001-08-27 22:15:12 +0000149 sleep(1);
plars865695b2001-08-27 22:15:12 +0000150
151 sigusr1 = 0;
152
Wanlong Gao6633ce92012-11-05 11:19:57 +0800153 parentfd = do_parent_setup();
154 if (parentfd < 0) {
plars865695b2001-08-27 22:15:12 +0000155 kill(childpid, SIGTERM);
156 waitpid(childpid, NULL, 0);
157 cleanup();
Garrett Cooperff29dd12010-12-19 05:05:40 -0800158 }
plars865695b2001-08-27 22:15:12 +0000159
160 /* run the parent test */
Wanlong Gao6633ce92012-11-05 11:19:57 +0800161 rval = run_ptest();
162 if (rval == -1) {
subrata_modak4bb656a2009-02-26 12:02:09 +0000163 /*
plars865695b2001-08-27 22:15:12 +0000164 * Parent cannot set/get ioctl parameters.
165 * SIGTERM the child and cleanup.
166 */
167 kill(childpid, SIGTERM);
168 waitpid(childpid, NULL, 0);
169 cleanup();
170 }
171
Garrett Cooperff29dd12010-12-19 05:05:40 -0800172 if (rval != 0)
plars865695b2001-08-27 22:15:12 +0000173 tst_resm(TFAIL, "TCGETA/TCSETA tests FAILED with "
174 "%d %s", rval, rval > 1 ? "errors" : "error");
Garrett Cooperff29dd12010-12-19 05:05:40 -0800175 else
plars865695b2001-08-27 22:15:12 +0000176 tst_resm(TPASS, "TCGETA/TCSETA tests SUCCEEDED");
plars865695b2001-08-27 22:15:12 +0000177
Garrett Cooperff29dd12010-12-19 05:05:40 -0800178 /* FIXME: check return codes. */
plars865695b2001-08-27 22:15:12 +0000179 (void)kill(childpid, SIGTERM);
180 (void)waitpid(childpid, NULL, 0);
181
182 /*
183 * Clean up things from the parent by restoring the
184 * tty device information that was saved in setup()
185 * and closing the tty file descriptor.
186 */
Garrett Cooperff29dd12010-12-19 05:05:40 -0800187 if (ioctl(parentfd, TCSETA, &save_io) == -1)
plars865695b2001-08-27 22:15:12 +0000188 tst_resm(TINFO, "ioctl restore failed in main");
Garrett Cooperff29dd12010-12-19 05:05:40 -0800189 if (close(parentfd) == -1)
plars865695b2001-08-27 22:15:12 +0000190 tst_brkm(TBROK, cleanup, "close() failed in main");
plars865695b2001-08-27 22:15:12 +0000191
plars865695b2001-08-27 22:15:12 +0000192 closed = 1;
193 }
194 cleanup();
195
Garrett Cooper53740502010-12-16 00:04:01 -0800196 tst_exit();
plars865695b2001-08-27 22:15:12 +0000197}
198
Wanlong Gao6633ce92012-11-05 11:19:57 +0800199static void do_child(void)
subrata_modak56207ce2009-03-23 13:35:39 +0000200{
Wanlong Gao6633ce92012-11-05 11:19:57 +0800201 childfd = do_child_setup();
202 if (childfd < 0)
robbiewd34d5812005-07-11 22:28:09 +0000203 _exit(1);
robbiewd34d5812005-07-11 22:28:09 +0000204 run_ctest();
205 _exit(0);
206}
207
Wanlong Gao6633ce92012-11-05 11:19:57 +0800208void do_child_uclinux(void)
robbiewd34d5812005-07-11 22:28:09 +0000209{
210 struct sigaction act;
211
212 /* Set up the signal handlers again */
213 act.sa_handler = (void *)sigterm_handler;
214 act.sa_flags = 0;
Jan Stancekc5532e42013-05-14 11:59:33 +0200215 sigemptyset(&act.sa_mask);
robbiewd34d5812005-07-11 22:28:09 +0000216 (void)sigaction(SIGTERM, &act, 0);
subrata_modakbdbaec52009-02-26 12:14:51 +0000217
robbiewd34d5812005-07-11 22:28:09 +0000218 /* Run the normal child */
219 do_child();
220}
221
plars865695b2001-08-27 22:15:12 +0000222/*
223 * run_ptest() - setup the various termio structure values and issue
224 * the TCSETA ioctl call with the TEST macro.
225 */
Wanlong Gao6633ce92012-11-05 11:19:57 +0800226static int run_ptest(void)
plars865695b2001-08-27 22:15:12 +0000227{
228 int i, rval;
229
230 /* Use "old" line discipline */
231 termio.c_line = 0;
232
233 /* Set control modes */
subrata_modak56207ce2009-03-23 13:35:39 +0000234 termio.c_cflag = B50 | CS7 | CREAD | PARENB | PARODD | CLOCAL;
plars865695b2001-08-27 22:15:12 +0000235
236 /* Set control chars. */
subrata_modak56207ce2009-03-23 13:35:39 +0000237 for (i = 0; i < NCC; i++) {
Wanlong Gao6633ce92012-11-05 11:19:57 +0800238 if (i == VEOL2)
plars865695b2001-08-27 22:15:12 +0000239 continue;
plars865695b2001-08-27 22:15:12 +0000240 termio.c_cc[i] = CSTART;
241 }
242
243 /* Set local modes. */
subrata_modak56207ce2009-03-23 13:35:39 +0000244 termio.c_lflag =
245 ((unsigned short)(ISIG | ICANON | XCASE | ECHO | ECHOE | NOFLSH));
plars865695b2001-08-27 22:15:12 +0000246
247 /* Set input modes. */
subrata_modak56207ce2009-03-23 13:35:39 +0000248 termio.c_iflag =
249 BRKINT | IGNPAR | INPCK | ISTRIP | ICRNL | IUCLC | IXON | IXANY |
250 IXOFF;
plars865695b2001-08-27 22:15:12 +0000251
252 /* Set output modes. */
subrata_modak56207ce2009-03-23 13:35:39 +0000253 termio.c_oflag = OPOST | OLCUC | ONLCR | ONOCR;
plars865695b2001-08-27 22:15:12 +0000254
255 TEST(ioctl(parentfd, TCSETA, &termio));
256
257 if (TEST_RETURN < 0) {
258 tst_resm(TFAIL, "ioctl TCSETA failed : "
259 "errno = %d", TEST_ERRNO);
Wanlong Gao6633ce92012-11-05 11:19:57 +0800260 return -1;
plars865695b2001-08-27 22:15:12 +0000261 }
262
Cyril Hrubise38b9612014-06-02 17:20:57 +0200263 /* Get termio and see if all parameters actually got set */
264 rval = ioctl(parentfd, TCGETA, &termio);
265 if (rval < 0) {
266 tst_resm(TFAIL, "ioctl TCGETA failed. Ending test.");
267 return -1;
plars865695b2001-08-27 22:15:12 +0000268 }
Cyril Hrubise38b9612014-06-02 17:20:57 +0200269
270 return chk_tty_parms();
plars865695b2001-08-27 22:15:12 +0000271}
272
Wanlong Gao6633ce92012-11-05 11:19:57 +0800273static int run_ctest(void)
plars865695b2001-08-27 22:15:12 +0000274{
plars865695b2001-08-27 22:15:12 +0000275 /*
276 * Wait till the parent has finished testing.
277 */
Wanlong Gao6633ce92012-11-05 11:19:57 +0800278 while (!sigterm)
plars865695b2001-08-27 22:15:12 +0000279 sleep(1);
Wanlong Gao6633ce92012-11-05 11:19:57 +0800280
plars865695b2001-08-27 22:15:12 +0000281 sigterm = 0;
282
283 tst_resm(TINFO, "child: Got SIGTERM from parent.");
284
Wanlong Gao6633ce92012-11-05 11:19:57 +0800285 if (close(childfd) == -1)
plars865695b2001-08-27 22:15:12 +0000286 tst_resm(TINFO, "close() in run_ctest() failed");
subrata_modak43337a32009-02-26 11:43:51 +0000287 return 0;
plars865695b2001-08-27 22:15:12 +0000288}
289
Wanlong Gao6633ce92012-11-05 11:19:57 +0800290static int chk_tty_parms(void)
plars865695b2001-08-27 22:15:12 +0000291{
292 int i, flag = 0;
293
294 if (termio.c_line != 0) {
295 tst_resm(TINFO, "line discipline has incorrect value %o",
296 termio.c_line);
297 flag++;
298 }
Wanlong Gao6633ce92012-11-05 11:19:57 +0800299 /*
300 * The following Code Sniffet is disabled to check the value of c_cflag
301 * as it seems that due to some changes from 2.6.24 onwards, this
302 * setting is not done properly for either of (B50|CS7|CREAD|PARENB|
303 * PARODD|CLOCAL|(CREAD|HUPCL|CLOCAL).
304 * However, it has been observed that other flags are properly set.
305 */
306#if 0
Wanlong Gao354ebb42012-12-07 10:10:04 +0800307 if (termio.c_cflag != (B50 | CS7 | CREAD | PARENB | PARODD | CLOCAL)) {
Wanlong Gao6633ce92012-11-05 11:19:57 +0800308 tst_resm(TINFO, "cflag has incorrect value. %o",
309 termio.c_cflag);
310 flag++;
311 }
312#endif
plars865695b2001-08-27 22:15:12 +0000313
subrata_modak56207ce2009-03-23 13:35:39 +0000314 for (i = 0; i < NCC; i++) {
plars865695b2001-08-27 22:15:12 +0000315 if (i == VEOL2) {
316 if (termio.c_cc[VEOL2] == CNUL) {
317 continue;
318 } else {
319 tst_resm(TINFO, "control char %d has "
320 "incorrect value %d %d", i,
subrata_modak4bb656a2009-02-26 12:02:09 +0000321 termio.c_cc[i], CNUL);
plars865695b2001-08-27 22:15:12 +0000322 flag++;
323 continue;
324 }
325 }
326
327 if (termio.c_cc[i] != CSTART) {
328 tst_resm(TINFO, "control char %d has incorrect "
329 "value %d.", i, termio.c_cc[i]);
330 flag++;
331 }
332 }
333
subrata_modak56207ce2009-03-23 13:35:39 +0000334 if (!
335 (termio.c_lflag
336 && (ISIG | ICANON | XCASE | ECHO | ECHOE | NOFLSH))) {
plars865695b2001-08-27 22:15:12 +0000337 tst_resm(TINFO, "lflag has incorrect value. %o",
338 termio.c_lflag);
339 flag++;
340 }
341
subrata_modak56207ce2009-03-23 13:35:39 +0000342 if (!
343 (termio.c_iflag
344 && (BRKINT | IGNPAR | INPCK | ISTRIP | ICRNL | IUCLC | IXON | IXANY
345 | IXOFF))) {
plars865695b2001-08-27 22:15:12 +0000346 tst_resm(TINFO, "iflag has incorrect value. %o",
347 termio.c_iflag);
348 flag++;
349 }
350
subrata_modak56207ce2009-03-23 13:35:39 +0000351 if (!(termio.c_oflag && (OPOST | OLCUC | ONLCR | ONOCR))) {
plars865695b2001-08-27 22:15:12 +0000352 tst_resm(TINFO, "oflag has incorrect value. %o",
353 termio.c_oflag);
354 flag++;
355 }
356
Wanlong Gao6633ce92012-11-05 11:19:57 +0800357 if (!flag)
plars865695b2001-08-27 22:15:12 +0000358 tst_resm(TINFO, "termio values are set as expected");
plars865695b2001-08-27 22:15:12 +0000359
Wanlong Gao6633ce92012-11-05 11:19:57 +0800360 return flag;
plars865695b2001-08-27 22:15:12 +0000361}
362
Wanlong Gao6633ce92012-11-05 11:19:57 +0800363static int do_parent_setup(void)
plars865695b2001-08-27 22:15:12 +0000364{
365 int pfd;
366
Wanlong Gao6633ce92012-11-05 11:19:57 +0800367 pfd = open(parenttty, O_RDWR, 0777);
368 if (pfd < 0)
plars865695b2001-08-27 22:15:12 +0000369 tst_brkm(TBROK, cleanup, "Could not open %s in "
370 "do_parent_setup(), errno = %d", parenttty, errno);
plars865695b2001-08-27 22:15:12 +0000371
372 /* unset the closed flag */
373 closed = 0;
subrata_modakbdbaec52009-02-26 12:14:51 +0000374
plars865695b2001-08-27 22:15:12 +0000375 /* flush tty queues to remove old output */
Garrett Cooperff29dd12010-12-19 05:05:40 -0800376 if (ioctl(pfd, TCFLSH, 2) < 0)
plars865695b2001-08-27 22:15:12 +0000377 tst_brkm(TBROK, cleanup, "ioctl TCFLSH failed : "
378 "errno = %d", errno);
Wanlong Gao6633ce92012-11-05 11:19:57 +0800379 return pfd;
plars865695b2001-08-27 22:15:12 +0000380}
381
Wanlong Gao6633ce92012-11-05 11:19:57 +0800382static int do_child_setup(void)
plars865695b2001-08-27 22:15:12 +0000383{
384 int cfd;
385
Wanlong Gao6633ce92012-11-05 11:19:57 +0800386 cfd = open(childtty, O_RDWR, 0777);
387 if (cfd < 0) {
plars865695b2001-08-27 22:15:12 +0000388 tst_resm(TINFO, "Could not open %s in do_child_setup(), errno "
389 "= %d", childtty, errno);
390 /* signal the parent so we don't hang the test */
391 kill(parentpid, SIGUSR1);
Wanlong Gao6633ce92012-11-05 11:19:57 +0800392 return -1;
plars865695b2001-08-27 22:15:12 +0000393 }
394
395 /* flush tty queues to remove old output */
396 if (ioctl(cfd, TCFLSH, 2) < 0) {
397 tst_resm(TINFO, "ioctl TCFLSH failed. : errno = %d", errno);
398 /* signal the parent so we don't hang the test */
399 kill(parentpid, SIGUSR1);
Wanlong Gao6633ce92012-11-05 11:19:57 +0800400 return -1;
plars865695b2001-08-27 22:15:12 +0000401 }
402
403 /* tell the parent that we're done */
404 kill(parentpid, SIGUSR1);
405
Wanlong Gao6633ce92012-11-05 11:19:57 +0800406 return cfd;
plars865695b2001-08-27 22:15:12 +0000407}
408
409/*
410 * Define the signals handlers here.
411 */
Wanlong Gao6633ce92012-11-05 11:19:57 +0800412static void sigterm_handler(void)
plars865695b2001-08-27 22:15:12 +0000413{
414 sigterm = 1;
415}
416
Wanlong Gao6633ce92012-11-05 11:19:57 +0800417static void sigusr1_handler(void)
plars865695b2001-08-27 22:15:12 +0000418{
419 sigusr1 = 1;
420}
421
Wanlong Gao6633ce92012-11-05 11:19:57 +0800422static void sigusr2_handler(void)
plars865695b2001-08-27 22:15:12 +0000423{
424 sigusr2 = 1;
425}
426
Wanlong Gao6633ce92012-11-05 11:19:57 +0800427static void help(void)
plars865695b2001-08-27 22:15:12 +0000428{
429 printf(" -D <tty device> : for example, /dev/tty[0-9]\n");
430}
431
Wanlong Gao6633ce92012-11-05 11:19:57 +0800432static void setup(void)
plars865695b2001-08-27 22:15:12 +0000433{
434 int fd;
435 struct sigaction act;
436
Garrett Cooperff29dd12010-12-19 05:05:40 -0800437 /* XXX: TERRNO required all over the place */
Wanlong Gao6633ce92012-11-05 11:19:57 +0800438 fd = open(devname, O_RDWR, 0777);
439 if (fd < 0)
Garrett Cooperff29dd12010-12-19 05:05:40 -0800440 tst_brkm(TBROK, NULL, "Could not open %s in "
plars865695b2001-08-27 22:15:12 +0000441 "setup(), errno = %d", devname, errno);
subrata_modakbdbaec52009-02-26 12:14:51 +0000442
plars865695b2001-08-27 22:15:12 +0000443 /* Save the current device information - to be restored in cleanup() */
Garrett Cooperff29dd12010-12-19 05:05:40 -0800444 if (ioctl(fd, TCGETA, &save_io) < 0)
plars865695b2001-08-27 22:15:12 +0000445 tst_brkm(TBROK, cleanup, "TCGETA ioctl failed in "
Garrett Cooperff29dd12010-12-19 05:05:40 -0800446 "do_parent_setup");
plars865695b2001-08-27 22:15:12 +0000447
448 /* Close the device */
Garrett Cooperff29dd12010-12-19 05:05:40 -0800449 if (close(fd) == -1)
450 tst_brkm(TBROK, cleanup, "close failed in setup");
plars865695b2001-08-27 22:15:12 +0000451
452 /* Set up the signal handlers */
453 act.sa_handler = (void *)sigterm_handler;
454 act.sa_flags = 0;
Jan Stancekc5532e42013-05-14 11:59:33 +0200455 sigemptyset(&act.sa_mask);
plars865695b2001-08-27 22:15:12 +0000456 (void)sigaction(SIGTERM, &act, 0);
457
458 act.sa_handler = (void *)sigusr1_handler;
459 act.sa_flags = 0;
460 (void)sigaction(SIGUSR1, &act, 0);
461
462 act.sa_handler = (void *)sigusr2_handler;
463 act.sa_flags = 0;
464 (void)sigaction(SIGUSR2, &act, 0);
465
plarsd93a8e72001-11-30 20:38:48 +0000466 act.sa_handler = SIG_IGN;
467 act.sa_flags = 0;
468 (void)sigaction(SIGTTOU, &act, 0);
469
plars865695b2001-08-27 22:15:12 +0000470 sigterm = sigusr1 = sigusr2 = 0;
471
plars865695b2001-08-27 22:15:12 +0000472 TEST_PAUSE;
473}
474
Wanlong Gao6633ce92012-11-05 11:19:57 +0800475static void cleanup(void)
plars865695b2001-08-27 22:15:12 +0000476{
plars865695b2001-08-27 22:15:12 +0000477 if (!closed) {
Garrett Cooperff29dd12010-12-19 05:05:40 -0800478 if (ioctl(parentfd, TCSETA, &save_io) == -1)
plars865695b2001-08-27 22:15:12 +0000479 tst_resm(TINFO, "ioctl restore failed in cleanup()");
Garrett Cooperff29dd12010-12-19 05:05:40 -0800480 if (close(parentfd) == -1)
plars865695b2001-08-27 22:15:12 +0000481 tst_resm(TINFO, "close() failed in cleanup()");
plars865695b2001-08-27 22:15:12 +0000482 }
Chris Dearmanec6edca2012-10-17 19:54:01 -0700483}