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