xref: /freebsd/lib/libc/tests/stdio/fdopen_test.c (revision 559a218c9b257775fb249b67945fe4a05b7a6b9f)
1*1ee02192SEnji Cooper /*-
2*1ee02192SEnji Cooper  * Copyright (c) 2014 Jilles Tjoelker
3*1ee02192SEnji Cooper  * All rights reserved.
4*1ee02192SEnji Cooper  *
5*1ee02192SEnji Cooper  * Redistribution and use in source and binary forms, with or without
6*1ee02192SEnji Cooper  * modification, are permitted provided that the following conditions
7*1ee02192SEnji Cooper  * are met:
8*1ee02192SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
9*1ee02192SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
10*1ee02192SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
11*1ee02192SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
12*1ee02192SEnji Cooper  *    documentation and/or other materials provided with the distribution.
13*1ee02192SEnji Cooper  *
14*1ee02192SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*1ee02192SEnji Cooper  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*1ee02192SEnji Cooper  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*1ee02192SEnji Cooper  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*1ee02192SEnji Cooper  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*1ee02192SEnji Cooper  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*1ee02192SEnji Cooper  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*1ee02192SEnji Cooper  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*1ee02192SEnji Cooper  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*1ee02192SEnji Cooper  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*1ee02192SEnji Cooper  * SUCH DAMAGE.
25*1ee02192SEnji Cooper  */
26*1ee02192SEnji Cooper 
27*1ee02192SEnji Cooper #include <errno.h>
28*1ee02192SEnji Cooper #include <fcntl.h>
29*1ee02192SEnji Cooper #include <paths.h>
30*1ee02192SEnji Cooper #include <stdbool.h>
31*1ee02192SEnji Cooper #include <stdio.h>
32*1ee02192SEnji Cooper #include <string.h>
33*1ee02192SEnji Cooper #include <unistd.h>
34*1ee02192SEnji Cooper 
35*1ee02192SEnji Cooper #include <atf-c.h>
36*1ee02192SEnji Cooper 
37*1ee02192SEnji Cooper static void
runtest(const char * fname,int intmode,const char * strmode,bool success)38*1ee02192SEnji Cooper runtest(const char *fname, int intmode, const char *strmode, bool success)
39*1ee02192SEnji Cooper {
40*1ee02192SEnji Cooper 	FILE *fp;
41*1ee02192SEnji Cooper 	int fd;
42*1ee02192SEnji Cooper 
43*1ee02192SEnji Cooper 	fd = open(fname, intmode);
44*1ee02192SEnji Cooper 	ATF_REQUIRE_MSG(fd != -1,
45*1ee02192SEnji Cooper 	    "open(\"%s\", %#x) failed; errno=%d", fname, intmode, errno);
46*1ee02192SEnji Cooper 
47*1ee02192SEnji Cooper 	fp = fdopen(fd, strmode);
48*1ee02192SEnji Cooper 	if (fp == NULL) {
49*1ee02192SEnji Cooper 		close(fd);
50*1ee02192SEnji Cooper 		ATF_REQUIRE_MSG(success == false,
51*1ee02192SEnji Cooper 		    "fdopen(open(\"%s\", %#x), \"%s\") succeeded unexpectedly",
52*1ee02192SEnji Cooper 		    fname, intmode, strmode);
53*1ee02192SEnji Cooper 		return;
54*1ee02192SEnji Cooper 	}
55*1ee02192SEnji Cooper 	ATF_REQUIRE_MSG(success == true,
56*1ee02192SEnji Cooper 	    "fdopen(open(\"%s\", %#x), \"%s\") failed; errno=%d",
57*1ee02192SEnji Cooper 	    fname, intmode, strmode, errno);
58*1ee02192SEnji Cooper 	fclose(fp);
59*1ee02192SEnji Cooper }
60*1ee02192SEnji Cooper 
61*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDONLY__r_test);
ATF_TC_BODY(null__O_RDONLY__r_test,tc)62*1ee02192SEnji Cooper ATF_TC_BODY(null__O_RDONLY__r_test, tc)
63*1ee02192SEnji Cooper {
64*1ee02192SEnji Cooper 
65*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_RDONLY, "r", true);
66*1ee02192SEnji Cooper }
67*1ee02192SEnji Cooper 
68*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_WRONLY__r_test);
ATF_TC_BODY(null__O_WRONLY__r_test,tc)69*1ee02192SEnji Cooper ATF_TC_BODY(null__O_WRONLY__r_test, tc)
70*1ee02192SEnji Cooper {
71*1ee02192SEnji Cooper 
72*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_WRONLY, "r", false);
73*1ee02192SEnji Cooper }
74*1ee02192SEnji Cooper 
75*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDWR__r_test);
ATF_TC_BODY(null__O_RDWR__r_test,tc)76*1ee02192SEnji Cooper ATF_TC_BODY(null__O_RDWR__r_test, tc)
77*1ee02192SEnji Cooper {
78*1ee02192SEnji Cooper 
79*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_RDWR, "r", true);
80*1ee02192SEnji Cooper }
81*1ee02192SEnji Cooper 
82*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDONLY__w_test);
ATF_TC_BODY(null__O_RDONLY__w_test,tc)83*1ee02192SEnji Cooper ATF_TC_BODY(null__O_RDONLY__w_test, tc)
84*1ee02192SEnji Cooper {
85*1ee02192SEnji Cooper 
86*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_RDONLY, "w", false);
87*1ee02192SEnji Cooper }
88*1ee02192SEnji Cooper 
89*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_WRONLY__w_test);
ATF_TC_BODY(null__O_WRONLY__w_test,tc)90*1ee02192SEnji Cooper ATF_TC_BODY(null__O_WRONLY__w_test, tc)
91*1ee02192SEnji Cooper {
92*1ee02192SEnji Cooper 
93*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_WRONLY, "w", true);
94*1ee02192SEnji Cooper }
95*1ee02192SEnji Cooper 
96*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDWR__w_test);
ATF_TC_BODY(null__O_RDWR__w_test,tc)97*1ee02192SEnji Cooper ATF_TC_BODY(null__O_RDWR__w_test, tc)
98*1ee02192SEnji Cooper {
99*1ee02192SEnji Cooper 
100*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_RDWR, "w", true);
101*1ee02192SEnji Cooper }
102*1ee02192SEnji Cooper 
103*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDONLY__a_test);
ATF_TC_BODY(null__O_RDONLY__a_test,tc)104*1ee02192SEnji Cooper ATF_TC_BODY(null__O_RDONLY__a_test, tc)
105*1ee02192SEnji Cooper {
106*1ee02192SEnji Cooper 
107*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_RDONLY, "a", false);
108*1ee02192SEnji Cooper }
109*1ee02192SEnji Cooper 
110*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_WRONLY__a_test);
ATF_TC_BODY(null__O_WRONLY__a_test,tc)111*1ee02192SEnji Cooper ATF_TC_BODY(null__O_WRONLY__a_test, tc)
112*1ee02192SEnji Cooper {
113*1ee02192SEnji Cooper 
114*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_WRONLY, "a", true);
115*1ee02192SEnji Cooper }
116*1ee02192SEnji Cooper 
117*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDWR__test);
ATF_TC_BODY(null__O_RDWR__test,tc)118*1ee02192SEnji Cooper ATF_TC_BODY(null__O_RDWR__test, tc)
119*1ee02192SEnji Cooper {
120*1ee02192SEnji Cooper 
121*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_RDWR, "a", true);
122*1ee02192SEnji Cooper }
123*1ee02192SEnji Cooper 
124*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDONLY__r_append);
ATF_TC_BODY(null__O_RDONLY__r_append,tc)125*1ee02192SEnji Cooper ATF_TC_BODY(null__O_RDONLY__r_append, tc)
126*1ee02192SEnji Cooper {
127*1ee02192SEnji Cooper 
128*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_RDONLY, "r+", false);
129*1ee02192SEnji Cooper }
130*1ee02192SEnji Cooper 
131*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_WRONLY__r_append);
ATF_TC_BODY(null__O_WRONLY__r_append,tc)132*1ee02192SEnji Cooper ATF_TC_BODY(null__O_WRONLY__r_append, tc)
133*1ee02192SEnji Cooper {
134*1ee02192SEnji Cooper 
135*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_WRONLY, "r+", false);
136*1ee02192SEnji Cooper }
137*1ee02192SEnji Cooper 
138*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDWR__r_append);
ATF_TC_BODY(null__O_RDWR__r_append,tc)139*1ee02192SEnji Cooper ATF_TC_BODY(null__O_RDWR__r_append, tc)
140*1ee02192SEnji Cooper {
141*1ee02192SEnji Cooper 
142*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_RDWR, "r+", true);
143*1ee02192SEnji Cooper }
144*1ee02192SEnji Cooper 
145*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDONLY__w_append);
ATF_TC_BODY(null__O_RDONLY__w_append,tc)146*1ee02192SEnji Cooper ATF_TC_BODY(null__O_RDONLY__w_append, tc)
147*1ee02192SEnji Cooper {
148*1ee02192SEnji Cooper 
149*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_RDONLY, "w+", false);
150*1ee02192SEnji Cooper }
151*1ee02192SEnji Cooper 
152*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_WRONLY__w_append);
ATF_TC_BODY(null__O_WRONLY__w_append,tc)153*1ee02192SEnji Cooper ATF_TC_BODY(null__O_WRONLY__w_append, tc)
154*1ee02192SEnji Cooper {
155*1ee02192SEnji Cooper 
156*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_WRONLY, "w+", false);
157*1ee02192SEnji Cooper }
158*1ee02192SEnji Cooper 
159*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDWR__w_append);
ATF_TC_BODY(null__O_RDWR__w_append,tc)160*1ee02192SEnji Cooper ATF_TC_BODY(null__O_RDWR__w_append, tc)
161*1ee02192SEnji Cooper {
162*1ee02192SEnji Cooper 
163*1ee02192SEnji Cooper 	runtest(_PATH_DEVNULL, O_RDWR, "w+", true);
164*1ee02192SEnji Cooper }
165*1ee02192SEnji Cooper 
166*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(sh__O_EXEC__r);
ATF_TC_BODY(sh__O_EXEC__r,tc)167*1ee02192SEnji Cooper ATF_TC_BODY(sh__O_EXEC__r, tc)
168*1ee02192SEnji Cooper {
169*1ee02192SEnji Cooper 
170*1ee02192SEnji Cooper 	runtest("/bin/sh", O_EXEC, "r", false);
171*1ee02192SEnji Cooper }
172*1ee02192SEnji Cooper 
173*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(sh__O_EXEC__w);
ATF_TC_BODY(sh__O_EXEC__w,tc)174*1ee02192SEnji Cooper ATF_TC_BODY(sh__O_EXEC__w, tc)
175*1ee02192SEnji Cooper {
176*1ee02192SEnji Cooper 
177*1ee02192SEnji Cooper 	runtest("/bin/sh", O_EXEC, "w", false);
178*1ee02192SEnji Cooper }
179*1ee02192SEnji Cooper 
180*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(sh__O_EXEC__r_append);
ATF_TC_BODY(sh__O_EXEC__r_append,tc)181*1ee02192SEnji Cooper ATF_TC_BODY(sh__O_EXEC__r_append, tc)
182*1ee02192SEnji Cooper {
183*1ee02192SEnji Cooper 
184*1ee02192SEnji Cooper 	runtest("/bin/sh", O_EXEC, "r+", false);
185*1ee02192SEnji Cooper }
186*1ee02192SEnji Cooper 
187*1ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(sh__O_EXEC__w_append);
ATF_TC_BODY(sh__O_EXEC__w_append,tc)188*1ee02192SEnji Cooper ATF_TC_BODY(sh__O_EXEC__w_append, tc)
189*1ee02192SEnji Cooper {
190*1ee02192SEnji Cooper 
191*1ee02192SEnji Cooper 	runtest("/bin/sh", O_EXEC, "w+", false);
192*1ee02192SEnji Cooper }
193*1ee02192SEnji Cooper 
ATF_TP_ADD_TCS(tp)194*1ee02192SEnji Cooper ATF_TP_ADD_TCS(tp)
195*1ee02192SEnji Cooper {
196*1ee02192SEnji Cooper 
197*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_RDONLY__r_test);
198*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_WRONLY__r_test);
199*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_RDWR__r_test);
200*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_RDONLY__w_test);
201*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_WRONLY__w_test);
202*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_RDWR__w_test);
203*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_RDONLY__a_test);
204*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_WRONLY__a_test);
205*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_RDWR__test);
206*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_RDONLY__r_append);
207*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_WRONLY__r_append);
208*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_RDWR__r_append);
209*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_RDONLY__w_append);
210*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_WRONLY__w_append);
211*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, null__O_RDWR__w_append);
212*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, sh__O_EXEC__r);
213*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, sh__O_EXEC__w);
214*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, sh__O_EXEC__r_append);
215*1ee02192SEnji Cooper 	ATF_TP_ADD_TC(tp, sh__O_EXEC__w_append);
216*1ee02192SEnji Cooper 
217*1ee02192SEnji Cooper 	return (atf_no_error());
218*1ee02192SEnji Cooper }
219*1ee02192SEnji Cooper 
220*1ee02192SEnji Cooper /*
221*1ee02192SEnji Cooper  vim:ts=8:cin:sw=8
222*1ee02192SEnji Cooper  */
223