11ee02192SEnji Cooper /*-
21ee02192SEnji Cooper * Copyright (c) 2014 Jilles Tjoelker
31ee02192SEnji Cooper * All rights reserved.
41ee02192SEnji Cooper *
51ee02192SEnji Cooper * Redistribution and use in source and binary forms, with or without
61ee02192SEnji Cooper * modification, are permitted provided that the following conditions
71ee02192SEnji Cooper * are met:
81ee02192SEnji Cooper * 1. Redistributions of source code must retain the above copyright
91ee02192SEnji Cooper * notice, this list of conditions and the following disclaimer.
101ee02192SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright
111ee02192SEnji Cooper * notice, this list of conditions and the following disclaimer in the
121ee02192SEnji Cooper * documentation and/or other materials provided with the distribution.
131ee02192SEnji Cooper *
141ee02192SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
151ee02192SEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
161ee02192SEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
171ee02192SEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
181ee02192SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
191ee02192SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
201ee02192SEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
211ee02192SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
221ee02192SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
231ee02192SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
241ee02192SEnji Cooper * SUCH DAMAGE.
251ee02192SEnji Cooper */
261ee02192SEnji Cooper
271ee02192SEnji Cooper #include <errno.h>
281ee02192SEnji Cooper #include <fcntl.h>
291ee02192SEnji Cooper #include <paths.h>
301ee02192SEnji Cooper #include <stdbool.h>
311ee02192SEnji Cooper #include <stdio.h>
321ee02192SEnji Cooper #include <string.h>
331ee02192SEnji Cooper #include <unistd.h>
341ee02192SEnji Cooper
351ee02192SEnji Cooper #include <atf-c.h>
361ee02192SEnji Cooper
371ee02192SEnji Cooper static void
runtest(const char * fname,int intmode,const char * strmode,bool success)381ee02192SEnji Cooper runtest(const char *fname, int intmode, const char *strmode, bool success)
391ee02192SEnji Cooper {
401ee02192SEnji Cooper FILE *fp;
411ee02192SEnji Cooper int fd;
421ee02192SEnji Cooper
431ee02192SEnji Cooper fd = open(fname, intmode);
441ee02192SEnji Cooper ATF_REQUIRE_MSG(fd != -1,
451ee02192SEnji Cooper "open(\"%s\", %#x) failed; errno=%d", fname, intmode, errno);
461ee02192SEnji Cooper
471ee02192SEnji Cooper fp = fdopen(fd, strmode);
481ee02192SEnji Cooper if (fp == NULL) {
491ee02192SEnji Cooper close(fd);
501ee02192SEnji Cooper ATF_REQUIRE_MSG(success == false,
511ee02192SEnji Cooper "fdopen(open(\"%s\", %#x), \"%s\") succeeded unexpectedly",
521ee02192SEnji Cooper fname, intmode, strmode);
531ee02192SEnji Cooper return;
541ee02192SEnji Cooper }
551ee02192SEnji Cooper ATF_REQUIRE_MSG(success == true,
561ee02192SEnji Cooper "fdopen(open(\"%s\", %#x), \"%s\") failed; errno=%d",
571ee02192SEnji Cooper fname, intmode, strmode, errno);
581ee02192SEnji Cooper fclose(fp);
591ee02192SEnji Cooper }
601ee02192SEnji Cooper
611ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDONLY__r_test);
ATF_TC_BODY(null__O_RDONLY__r_test,tc)621ee02192SEnji Cooper ATF_TC_BODY(null__O_RDONLY__r_test, tc)
631ee02192SEnji Cooper {
641ee02192SEnji Cooper
651ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_RDONLY, "r", true);
661ee02192SEnji Cooper }
671ee02192SEnji Cooper
681ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_WRONLY__r_test);
ATF_TC_BODY(null__O_WRONLY__r_test,tc)691ee02192SEnji Cooper ATF_TC_BODY(null__O_WRONLY__r_test, tc)
701ee02192SEnji Cooper {
711ee02192SEnji Cooper
721ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_WRONLY, "r", false);
731ee02192SEnji Cooper }
741ee02192SEnji Cooper
751ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDWR__r_test);
ATF_TC_BODY(null__O_RDWR__r_test,tc)761ee02192SEnji Cooper ATF_TC_BODY(null__O_RDWR__r_test, tc)
771ee02192SEnji Cooper {
781ee02192SEnji Cooper
791ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_RDWR, "r", true);
801ee02192SEnji Cooper }
811ee02192SEnji Cooper
821ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDONLY__w_test);
ATF_TC_BODY(null__O_RDONLY__w_test,tc)831ee02192SEnji Cooper ATF_TC_BODY(null__O_RDONLY__w_test, tc)
841ee02192SEnji Cooper {
851ee02192SEnji Cooper
861ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_RDONLY, "w", false);
871ee02192SEnji Cooper }
881ee02192SEnji Cooper
891ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_WRONLY__w_test);
ATF_TC_BODY(null__O_WRONLY__w_test,tc)901ee02192SEnji Cooper ATF_TC_BODY(null__O_WRONLY__w_test, tc)
911ee02192SEnji Cooper {
921ee02192SEnji Cooper
931ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_WRONLY, "w", true);
941ee02192SEnji Cooper }
951ee02192SEnji Cooper
961ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDWR__w_test);
ATF_TC_BODY(null__O_RDWR__w_test,tc)971ee02192SEnji Cooper ATF_TC_BODY(null__O_RDWR__w_test, tc)
981ee02192SEnji Cooper {
991ee02192SEnji Cooper
1001ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_RDWR, "w", true);
1011ee02192SEnji Cooper }
1021ee02192SEnji Cooper
1031ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDONLY__a_test);
ATF_TC_BODY(null__O_RDONLY__a_test,tc)1041ee02192SEnji Cooper ATF_TC_BODY(null__O_RDONLY__a_test, tc)
1051ee02192SEnji Cooper {
1061ee02192SEnji Cooper
1071ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_RDONLY, "a", false);
1081ee02192SEnji Cooper }
1091ee02192SEnji Cooper
1101ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_WRONLY__a_test);
ATF_TC_BODY(null__O_WRONLY__a_test,tc)1111ee02192SEnji Cooper ATF_TC_BODY(null__O_WRONLY__a_test, tc)
1121ee02192SEnji Cooper {
1131ee02192SEnji Cooper
1141ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_WRONLY, "a", true);
1151ee02192SEnji Cooper }
1161ee02192SEnji Cooper
1171ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDWR__test);
ATF_TC_BODY(null__O_RDWR__test,tc)1181ee02192SEnji Cooper ATF_TC_BODY(null__O_RDWR__test, tc)
1191ee02192SEnji Cooper {
1201ee02192SEnji Cooper
1211ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_RDWR, "a", true);
1221ee02192SEnji Cooper }
1231ee02192SEnji Cooper
1241ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDONLY__r_append);
ATF_TC_BODY(null__O_RDONLY__r_append,tc)1251ee02192SEnji Cooper ATF_TC_BODY(null__O_RDONLY__r_append, tc)
1261ee02192SEnji Cooper {
1271ee02192SEnji Cooper
1281ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_RDONLY, "r+", false);
1291ee02192SEnji Cooper }
1301ee02192SEnji Cooper
1311ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_WRONLY__r_append);
ATF_TC_BODY(null__O_WRONLY__r_append,tc)1321ee02192SEnji Cooper ATF_TC_BODY(null__O_WRONLY__r_append, tc)
1331ee02192SEnji Cooper {
1341ee02192SEnji Cooper
1351ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_WRONLY, "r+", false);
1361ee02192SEnji Cooper }
1371ee02192SEnji Cooper
1381ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDWR__r_append);
ATF_TC_BODY(null__O_RDWR__r_append,tc)1391ee02192SEnji Cooper ATF_TC_BODY(null__O_RDWR__r_append, tc)
1401ee02192SEnji Cooper {
1411ee02192SEnji Cooper
1421ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_RDWR, "r+", true);
1431ee02192SEnji Cooper }
1441ee02192SEnji Cooper
1451ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDONLY__w_append);
ATF_TC_BODY(null__O_RDONLY__w_append,tc)1461ee02192SEnji Cooper ATF_TC_BODY(null__O_RDONLY__w_append, tc)
1471ee02192SEnji Cooper {
1481ee02192SEnji Cooper
1491ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_RDONLY, "w+", false);
1501ee02192SEnji Cooper }
1511ee02192SEnji Cooper
1521ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_WRONLY__w_append);
ATF_TC_BODY(null__O_WRONLY__w_append,tc)1531ee02192SEnji Cooper ATF_TC_BODY(null__O_WRONLY__w_append, tc)
1541ee02192SEnji Cooper {
1551ee02192SEnji Cooper
1561ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_WRONLY, "w+", false);
1571ee02192SEnji Cooper }
1581ee02192SEnji Cooper
1591ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(null__O_RDWR__w_append);
ATF_TC_BODY(null__O_RDWR__w_append,tc)1601ee02192SEnji Cooper ATF_TC_BODY(null__O_RDWR__w_append, tc)
1611ee02192SEnji Cooper {
1621ee02192SEnji Cooper
1631ee02192SEnji Cooper runtest(_PATH_DEVNULL, O_RDWR, "w+", true);
1641ee02192SEnji Cooper }
1651ee02192SEnji Cooper
1661ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(sh__O_EXEC__r);
ATF_TC_BODY(sh__O_EXEC__r,tc)1671ee02192SEnji Cooper ATF_TC_BODY(sh__O_EXEC__r, tc)
1681ee02192SEnji Cooper {
1691ee02192SEnji Cooper
1701ee02192SEnji Cooper runtest("/bin/sh", O_EXEC, "r", false);
1711ee02192SEnji Cooper }
1721ee02192SEnji Cooper
1731ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(sh__O_EXEC__w);
ATF_TC_BODY(sh__O_EXEC__w,tc)1741ee02192SEnji Cooper ATF_TC_BODY(sh__O_EXEC__w, tc)
1751ee02192SEnji Cooper {
1761ee02192SEnji Cooper
1771ee02192SEnji Cooper runtest("/bin/sh", O_EXEC, "w", false);
1781ee02192SEnji Cooper }
1791ee02192SEnji Cooper
1801ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(sh__O_EXEC__r_append);
ATF_TC_BODY(sh__O_EXEC__r_append,tc)1811ee02192SEnji Cooper ATF_TC_BODY(sh__O_EXEC__r_append, tc)
1821ee02192SEnji Cooper {
1831ee02192SEnji Cooper
1841ee02192SEnji Cooper runtest("/bin/sh", O_EXEC, "r+", false);
1851ee02192SEnji Cooper }
1861ee02192SEnji Cooper
1871ee02192SEnji Cooper ATF_TC_WITHOUT_HEAD(sh__O_EXEC__w_append);
ATF_TC_BODY(sh__O_EXEC__w_append,tc)1881ee02192SEnji Cooper ATF_TC_BODY(sh__O_EXEC__w_append, tc)
1891ee02192SEnji Cooper {
1901ee02192SEnji Cooper
1911ee02192SEnji Cooper runtest("/bin/sh", O_EXEC, "w+", false);
1921ee02192SEnji Cooper }
1931ee02192SEnji Cooper
ATF_TP_ADD_TCS(tp)1941ee02192SEnji Cooper ATF_TP_ADD_TCS(tp)
1951ee02192SEnji Cooper {
1961ee02192SEnji Cooper
1971ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_RDONLY__r_test);
1981ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_WRONLY__r_test);
1991ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_RDWR__r_test);
2001ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_RDONLY__w_test);
2011ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_WRONLY__w_test);
2021ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_RDWR__w_test);
2031ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_RDONLY__a_test);
2041ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_WRONLY__a_test);
2051ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_RDWR__test);
2061ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_RDONLY__r_append);
2071ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_WRONLY__r_append);
2081ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_RDWR__r_append);
2091ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_RDONLY__w_append);
2101ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_WRONLY__w_append);
2111ee02192SEnji Cooper ATF_TP_ADD_TC(tp, null__O_RDWR__w_append);
2121ee02192SEnji Cooper ATF_TP_ADD_TC(tp, sh__O_EXEC__r);
2131ee02192SEnji Cooper ATF_TP_ADD_TC(tp, sh__O_EXEC__w);
2141ee02192SEnji Cooper ATF_TP_ADD_TC(tp, sh__O_EXEC__r_append);
2151ee02192SEnji Cooper ATF_TP_ADD_TC(tp, sh__O_EXEC__w_append);
2161ee02192SEnji Cooper
2171ee02192SEnji Cooper return (atf_no_error());
2181ee02192SEnji Cooper }
2191ee02192SEnji Cooper
2201ee02192SEnji Cooper /*
2211ee02192SEnji Cooper vim:ts=8:cin:sw=8
2221ee02192SEnji Cooper */
223