Path: blob/main/lib/libc/tests/stdio/fdopen_test.c
39530 views
/*-1* Copyright (c) 2014 Jilles Tjoelker2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12*13* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND14* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE15* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE16* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE17* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS19* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)20* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT21* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY22* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF23* SUCH DAMAGE.24*/2526#include <errno.h>27#include <fcntl.h>28#include <paths.h>29#include <stdbool.h>30#include <stdio.h>31#include <string.h>32#include <unistd.h>3334#include <atf-c.h>3536static void37runtest(const char *fname, int intmode, const char *strmode, bool success)38{39FILE *fp;40int fd;4142fd = open(fname, intmode);43ATF_REQUIRE_MSG(fd != -1,44"open(\"%s\", %#x) failed; errno=%d", fname, intmode, errno);4546fp = fdopen(fd, strmode);47if (fp == NULL) {48close(fd);49ATF_REQUIRE_MSG(success == false,50"fdopen(open(\"%s\", %#x), \"%s\") succeeded unexpectedly",51fname, intmode, strmode);52return;53}54ATF_REQUIRE_MSG(success == true,55"fdopen(open(\"%s\", %#x), \"%s\") failed; errno=%d",56fname, intmode, strmode, errno);57fclose(fp);58}5960ATF_TC_WITHOUT_HEAD(null__O_RDONLY__r_test);61ATF_TC_BODY(null__O_RDONLY__r_test, tc)62{6364runtest(_PATH_DEVNULL, O_RDONLY, "r", true);65}6667ATF_TC_WITHOUT_HEAD(null__O_WRONLY__r_test);68ATF_TC_BODY(null__O_WRONLY__r_test, tc)69{7071runtest(_PATH_DEVNULL, O_WRONLY, "r", false);72}7374ATF_TC_WITHOUT_HEAD(null__O_RDWR__r_test);75ATF_TC_BODY(null__O_RDWR__r_test, tc)76{7778runtest(_PATH_DEVNULL, O_RDWR, "r", true);79}8081ATF_TC_WITHOUT_HEAD(null__O_RDONLY__w_test);82ATF_TC_BODY(null__O_RDONLY__w_test, tc)83{8485runtest(_PATH_DEVNULL, O_RDONLY, "w", false);86}8788ATF_TC_WITHOUT_HEAD(null__O_WRONLY__w_test);89ATF_TC_BODY(null__O_WRONLY__w_test, tc)90{9192runtest(_PATH_DEVNULL, O_WRONLY, "w", true);93}9495ATF_TC_WITHOUT_HEAD(null__O_RDWR__w_test);96ATF_TC_BODY(null__O_RDWR__w_test, tc)97{9899runtest(_PATH_DEVNULL, O_RDWR, "w", true);100}101102ATF_TC_WITHOUT_HEAD(null__O_RDONLY__a_test);103ATF_TC_BODY(null__O_RDONLY__a_test, tc)104{105106runtest(_PATH_DEVNULL, O_RDONLY, "a", false);107}108109ATF_TC_WITHOUT_HEAD(null__O_WRONLY__a_test);110ATF_TC_BODY(null__O_WRONLY__a_test, tc)111{112113runtest(_PATH_DEVNULL, O_WRONLY, "a", true);114}115116ATF_TC_WITHOUT_HEAD(null__O_RDWR__test);117ATF_TC_BODY(null__O_RDWR__test, tc)118{119120runtest(_PATH_DEVNULL, O_RDWR, "a", true);121}122123ATF_TC_WITHOUT_HEAD(null__O_RDONLY__r_append);124ATF_TC_BODY(null__O_RDONLY__r_append, tc)125{126127runtest(_PATH_DEVNULL, O_RDONLY, "r+", false);128}129130ATF_TC_WITHOUT_HEAD(null__O_WRONLY__r_append);131ATF_TC_BODY(null__O_WRONLY__r_append, tc)132{133134runtest(_PATH_DEVNULL, O_WRONLY, "r+", false);135}136137ATF_TC_WITHOUT_HEAD(null__O_RDWR__r_append);138ATF_TC_BODY(null__O_RDWR__r_append, tc)139{140141runtest(_PATH_DEVNULL, O_RDWR, "r+", true);142}143144ATF_TC_WITHOUT_HEAD(null__O_RDONLY__w_append);145ATF_TC_BODY(null__O_RDONLY__w_append, tc)146{147148runtest(_PATH_DEVNULL, O_RDONLY, "w+", false);149}150151ATF_TC_WITHOUT_HEAD(null__O_WRONLY__w_append);152ATF_TC_BODY(null__O_WRONLY__w_append, tc)153{154155runtest(_PATH_DEVNULL, O_WRONLY, "w+", false);156}157158ATF_TC_WITHOUT_HEAD(null__O_RDWR__w_append);159ATF_TC_BODY(null__O_RDWR__w_append, tc)160{161162runtest(_PATH_DEVNULL, O_RDWR, "w+", true);163}164165ATF_TC_WITHOUT_HEAD(sh__O_EXEC__r);166ATF_TC_BODY(sh__O_EXEC__r, tc)167{168169runtest("/bin/sh", O_EXEC, "r", false);170}171172ATF_TC_WITHOUT_HEAD(sh__O_EXEC__w);173ATF_TC_BODY(sh__O_EXEC__w, tc)174{175176runtest("/bin/sh", O_EXEC, "w", false);177}178179ATF_TC_WITHOUT_HEAD(sh__O_EXEC__r_append);180ATF_TC_BODY(sh__O_EXEC__r_append, tc)181{182183runtest("/bin/sh", O_EXEC, "r+", false);184}185186ATF_TC_WITHOUT_HEAD(sh__O_EXEC__w_append);187ATF_TC_BODY(sh__O_EXEC__w_append, tc)188{189190runtest("/bin/sh", O_EXEC, "w+", false);191}192193ATF_TP_ADD_TCS(tp)194{195196ATF_TP_ADD_TC(tp, null__O_RDONLY__r_test);197ATF_TP_ADD_TC(tp, null__O_WRONLY__r_test);198ATF_TP_ADD_TC(tp, null__O_RDWR__r_test);199ATF_TP_ADD_TC(tp, null__O_RDONLY__w_test);200ATF_TP_ADD_TC(tp, null__O_WRONLY__w_test);201ATF_TP_ADD_TC(tp, null__O_RDWR__w_test);202ATF_TP_ADD_TC(tp, null__O_RDONLY__a_test);203ATF_TP_ADD_TC(tp, null__O_WRONLY__a_test);204ATF_TP_ADD_TC(tp, null__O_RDWR__test);205ATF_TP_ADD_TC(tp, null__O_RDONLY__r_append);206ATF_TP_ADD_TC(tp, null__O_WRONLY__r_append);207ATF_TP_ADD_TC(tp, null__O_RDWR__r_append);208ATF_TP_ADD_TC(tp, null__O_RDONLY__w_append);209ATF_TP_ADD_TC(tp, null__O_WRONLY__w_append);210ATF_TP_ADD_TC(tp, null__O_RDWR__w_append);211ATF_TP_ADD_TC(tp, sh__O_EXEC__r);212ATF_TP_ADD_TC(tp, sh__O_EXEC__w);213ATF_TP_ADD_TC(tp, sh__O_EXEC__r_append);214ATF_TP_ADD_TC(tp, sh__O_EXEC__w_append);215216return (atf_no_error());217}218219/*220vim:ts=8:cin:sw=8221*/222223224