xref: /netbsd-src/tests/lib/libc/gen/t_ttyname.c (revision 149b98196c9f381508b0f872f329cd03c72b59be)
1*149b9819Schristos /*	$NetBSD: t_ttyname.c,v 1.4 2017/01/10 15:33:40 christos Exp $ */
2e1481082Sjruoho 
3e1481082Sjruoho /*-
4e1481082Sjruoho  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5e1481082Sjruoho  * All rights reserved.
6e1481082Sjruoho  *
7e1481082Sjruoho  * This code is derived from software contributed to The NetBSD Foundation
8e1481082Sjruoho  * by Jukka Ruohonen.
9e1481082Sjruoho  *
10e1481082Sjruoho  * Redistribution and use in source and binary forms, with or without
11e1481082Sjruoho  * modification, are permitted provided that the following conditions
12e1481082Sjruoho  * are met:
13e1481082Sjruoho  * 1. Redistributions of source code must retain the above copyright
14e1481082Sjruoho  *    notice, this list of conditions and the following disclaimer.
15e1481082Sjruoho  * 2. Redistributions in binary form must reproduce the above copyright
16e1481082Sjruoho  *    notice, this list of conditions and the following disclaimer in the
17e1481082Sjruoho  *    documentation and/or other materials provided with the distribution.
18e1481082Sjruoho  *
19e1481082Sjruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20e1481082Sjruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21e1481082Sjruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22e1481082Sjruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23e1481082Sjruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24e1481082Sjruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25e1481082Sjruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26e1481082Sjruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27e1481082Sjruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28e1481082Sjruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29e1481082Sjruoho  * POSSIBILITY OF SUCH DAMAGE.
30e1481082Sjruoho  */
31e1481082Sjruoho #include <sys/cdefs.h>
32*149b9819Schristos __RCSID("$NetBSD: t_ttyname.c,v 1.4 2017/01/10 15:33:40 christos Exp $");
33e1481082Sjruoho 
34e1481082Sjruoho #include <atf-c.h>
35e1481082Sjruoho #include <errno.h>
36e1481082Sjruoho #include <fcntl.h>
37576aaaa5Sjruoho #include <stdlib.h>
38576aaaa5Sjruoho #include <string.h>
39e1481082Sjruoho #include <unistd.h>
40e1481082Sjruoho 
41576aaaa5Sjruoho static long ttymax = 0;
42576aaaa5Sjruoho 
43e1481082Sjruoho ATF_TC(ttyname_err);
ATF_TC_HEAD(ttyname_err,tc)44e1481082Sjruoho ATF_TC_HEAD(ttyname_err, tc)
45e1481082Sjruoho {
46e1481082Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test errors in ttyname(3)");
47e1481082Sjruoho }
48e1481082Sjruoho 
ATF_TC_BODY(ttyname_err,tc)49e1481082Sjruoho ATF_TC_BODY(ttyname_err, tc)
50e1481082Sjruoho {
51576aaaa5Sjruoho 	int fd;
52e1481082Sjruoho 
53e1481082Sjruoho 	fd = open("XXX", O_RDONLY);
54e1481082Sjruoho 
55e1481082Sjruoho 	if (fd < 0) {
56e1481082Sjruoho 
57e1481082Sjruoho 		errno = 0;
58e1481082Sjruoho 
59e1481082Sjruoho 		ATF_REQUIRE(isatty(fd) != -1);
60e1481082Sjruoho 		ATF_REQUIRE(errno == EBADF);
61e1481082Sjruoho 
62e1481082Sjruoho 		errno = 0;
63e1481082Sjruoho 
64e1481082Sjruoho 		ATF_REQUIRE(ttyname(fd) == NULL);
65e1481082Sjruoho 		ATF_REQUIRE(errno == EBADF);
66e1481082Sjruoho 	}
67e1481082Sjruoho 
68e1481082Sjruoho 	fd = open("/etc/passwd", O_RDONLY);
69e1481082Sjruoho 
70e1481082Sjruoho 	if (fd >= 0) {
71e1481082Sjruoho 
72e1481082Sjruoho 		errno = 0;
73e1481082Sjruoho 
74e1481082Sjruoho 		ATF_REQUIRE(isatty(fd) != -1);
75e1481082Sjruoho 		ATF_REQUIRE(errno == ENOTTY);
76e1481082Sjruoho 
77e1481082Sjruoho 		errno = 0;
78e1481082Sjruoho 
79e1481082Sjruoho 		ATF_REQUIRE(ttyname(fd) == NULL);
80e1481082Sjruoho 		ATF_REQUIRE(errno == ENOTTY);
81*149b9819Schristos 		(void)close(fd);
82e1481082Sjruoho 	}
83576aaaa5Sjruoho }
84576aaaa5Sjruoho 
85576aaaa5Sjruoho ATF_TC(ttyname_r_err);
ATF_TC_HEAD(ttyname_r_err,tc)86576aaaa5Sjruoho ATF_TC_HEAD(ttyname_r_err, tc)
87576aaaa5Sjruoho {
88576aaaa5Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test errors in ttyname_r(3)");
89576aaaa5Sjruoho }
90576aaaa5Sjruoho 
ATF_TC_BODY(ttyname_r_err,tc)91576aaaa5Sjruoho ATF_TC_BODY(ttyname_r_err, tc)
92576aaaa5Sjruoho {
93576aaaa5Sjruoho 	char sbuf[0];
94576aaaa5Sjruoho 	char *buf;
95576aaaa5Sjruoho 	int fd;
96576aaaa5Sjruoho 	int rv;
97576aaaa5Sjruoho 
98576aaaa5Sjruoho 	buf = malloc(ttymax + 1);
99576aaaa5Sjruoho 
100576aaaa5Sjruoho 	if (buf == NULL)
101576aaaa5Sjruoho 		return;
102576aaaa5Sjruoho 
103576aaaa5Sjruoho 	(void)memset(buf, '\0', ttymax + 1);
104e1481082Sjruoho 
105e1481082Sjruoho 	if (isatty(STDIN_FILENO) != 0) {
106e1481082Sjruoho 
107576aaaa5Sjruoho 		rv = ttyname_r(STDIN_FILENO, sbuf, sizeof(sbuf));
108e1481082Sjruoho 		ATF_REQUIRE(rv == ERANGE);
109e1481082Sjruoho 	}
110576aaaa5Sjruoho 
111576aaaa5Sjruoho 	rv = ttyname_r(-1, buf, ttymax);
112576aaaa5Sjruoho 	ATF_REQUIRE(rv == EBADF);
113576aaaa5Sjruoho 
114576aaaa5Sjruoho 	fd = open("/etc/passwd", O_RDONLY);
115576aaaa5Sjruoho 
116576aaaa5Sjruoho 	if (fd >= 0) {
117576aaaa5Sjruoho 		rv = ttyname_r(fd, buf, ttymax);
118576aaaa5Sjruoho 		ATF_REQUIRE(rv == ENOTTY);
119576aaaa5Sjruoho 		ATF_REQUIRE(close(fd) == 0);
120576aaaa5Sjruoho 	}
121576aaaa5Sjruoho 
122576aaaa5Sjruoho 	free(buf);
123576aaaa5Sjruoho }
124576aaaa5Sjruoho 
125576aaaa5Sjruoho ATF_TC(ttyname_r_stdin);
ATF_TC_HEAD(ttyname_r_stdin,tc)126576aaaa5Sjruoho ATF_TC_HEAD(ttyname_r_stdin, tc)
127576aaaa5Sjruoho {
128576aaaa5Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test ttyname_r(3) with stdin(3)");
129576aaaa5Sjruoho }
130576aaaa5Sjruoho 
ATF_TC_BODY(ttyname_r_stdin,tc)131576aaaa5Sjruoho ATF_TC_BODY(ttyname_r_stdin, tc)
132576aaaa5Sjruoho {
133576aaaa5Sjruoho 	const char *str;
134576aaaa5Sjruoho 	char *buf;
135576aaaa5Sjruoho 	int rv;
136576aaaa5Sjruoho 
137576aaaa5Sjruoho 	if (isatty(STDIN_FILENO) == 0)
138576aaaa5Sjruoho 		return;
139576aaaa5Sjruoho 
140576aaaa5Sjruoho 	buf = malloc(ttymax + 1);
141576aaaa5Sjruoho 
142576aaaa5Sjruoho 	if (buf == NULL)
143576aaaa5Sjruoho 		return;
144576aaaa5Sjruoho 
145576aaaa5Sjruoho 	(void)memset(buf, '\0', ttymax + 1);
146576aaaa5Sjruoho 
147576aaaa5Sjruoho 	str = ttyname(STDIN_FILENO);
148576aaaa5Sjruoho 	rv = ttyname_r(STDIN_FILENO, buf, ttymax);
149576aaaa5Sjruoho 
150576aaaa5Sjruoho 	ATF_REQUIRE(rv == 0);
151576aaaa5Sjruoho 	ATF_REQUIRE(str != NULL);
152576aaaa5Sjruoho 
153576aaaa5Sjruoho 	if (strcmp(str, buf) != 0)
154576aaaa5Sjruoho 		atf_tc_fail("ttyname(3) and ttyname_r(3) conflict");
155576aaaa5Sjruoho 
156576aaaa5Sjruoho 	free(buf);
157e1481082Sjruoho }
158e1481082Sjruoho 
159e1481082Sjruoho ATF_TC(ttyname_stdin);
ATF_TC_HEAD(ttyname_stdin,tc)160e1481082Sjruoho ATF_TC_HEAD(ttyname_stdin, tc)
161e1481082Sjruoho {
162e1481082Sjruoho 	atf_tc_set_md_var(tc, "descr", "Test ttyname(3) with stdin(3)");
163e1481082Sjruoho }
164e1481082Sjruoho 
ATF_TC_BODY(ttyname_stdin,tc)165e1481082Sjruoho ATF_TC_BODY(ttyname_stdin, tc)
166e1481082Sjruoho {
167e1481082Sjruoho 
1685ebf3524Sjruoho 	if (isatty(STDIN_FILENO) != 0)
169e1481082Sjruoho 		ATF_REQUIRE(ttyname(STDIN_FILENO) != NULL);
170e1481082Sjruoho 
1715ebf3524Sjruoho 	(void)close(STDIN_FILENO);
172e1481082Sjruoho 
173e1481082Sjruoho 	ATF_REQUIRE(isatty(STDIN_FILENO) != 1);
174e1481082Sjruoho 	ATF_REQUIRE(ttyname(STDIN_FILENO) == NULL);
175e1481082Sjruoho }
176e1481082Sjruoho 
ATF_TP_ADD_TCS(tp)177e1481082Sjruoho ATF_TP_ADD_TCS(tp)
178e1481082Sjruoho {
179e1481082Sjruoho 
180576aaaa5Sjruoho 	ttymax = sysconf(_SC_TTY_NAME_MAX);
181576aaaa5Sjruoho 	ATF_REQUIRE(ttymax >= 0);
182576aaaa5Sjruoho 
183e1481082Sjruoho 	ATF_TP_ADD_TC(tp, ttyname_err);
184576aaaa5Sjruoho 	ATF_TP_ADD_TC(tp, ttyname_r_err);
185576aaaa5Sjruoho 	ATF_TP_ADD_TC(tp, ttyname_r_stdin);
186e1481082Sjruoho 	ATF_TP_ADD_TC(tp, ttyname_stdin);
187e1481082Sjruoho 
188e1481082Sjruoho 	return atf_no_error();
189e1481082Sjruoho }
190