Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tools/test/stress2/testcases/pty/pty.c
39566 views
1
/*-
2
* Copyright (c) 2008 Peter Holm <[email protected]>
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*
26
*/
27
28
/* Test PTYs */
29
30
#include <sys/types.h>
31
#include <sys/ioctl.h>
32
#include <err.h>
33
#include <libutil.h>
34
#include <stdio.h>
35
#include <stdlib.h>
36
#include <termios.h>
37
#include <unistd.h>
38
39
#include "stress.h"
40
41
#define TXT "Hello, world!"
42
43
int
44
setup(int nb __unused)
45
{
46
return (0);
47
}
48
49
void
50
cleanup(void)
51
{
52
}
53
54
int
55
test(void)
56
{
57
struct termios tios;
58
int i, master, slave;
59
int s[32], m[32];
60
char buf[512], slname[1025];
61
62
for (i = 0; i < 32; i++) {
63
if (openpty(&m[i], &s[i], slname, NULL, NULL) == -1)
64
err(1, "openpty");
65
}
66
for (i = 0; i < 32; i++) {
67
close(m[i]);
68
close(s[i]);
69
}
70
71
for (i = 0; i < 1024; i++) {
72
if (openpty(&m[0], &s[0], slname, NULL, NULL) == -1)
73
err(1, "openpty");
74
close(m[0]);
75
close(s[0]);
76
}
77
78
for (i = 0; i < 10 && done_testing == 0; i++) {
79
if (openpty(&master, &slave, slname, NULL, NULL) == -1)
80
err(1, "openpty");
81
if ((i & 1) == 0) {
82
if (close(master) == -1)
83
err(1, "close(master)");
84
if (close(slave) == -1)
85
err(1, "close(%s)", slname);
86
} else {
87
if (close(slave) == -1)
88
err(1, "close(%s)", slname);
89
if (close(master) == -1)
90
err(1, "close(master)");
91
}
92
}
93
94
if (openpty(&master, &slave, slname, NULL, NULL) == -1)
95
err(1, "openpty");
96
if (tcgetattr(slave, &tios) < 0)
97
err(1, "tcgetattr(%s)", slname);
98
cfmakeraw(&tios);
99
if (tcsetattr(slave, TCSAFLUSH, &tios) < 0)
100
err(1, "tcsetattr(%s)", slname);
101
102
for (i = 0; i < 64 && done_testing == 0; i++) {
103
if (write(master, TXT, sizeof(TXT)) == -1)
104
err(1, "write");
105
if (read(slave, buf, sizeof(TXT)) == -1)
106
err(1, "read(%s)", slname);
107
}
108
close(master);
109
close(slave);
110
return (0);
111
}
112
113