Path: blob/main/lib/libc/tests/stdio/freopen_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 <paths.h>28#include <stdbool.h>29#include <stdio.h>30#include <string.h>3132#include <atf-c.h>3334static void35runtest(const char *fname1, const char *mode1, const char *fname2,36const char *mode2, bool success)37{38FILE *fp1, *fp2;39const char *fname2_print;4041fname2_print = fname2 != NULL ? fname2 : "<NULL>";42fp1 = fopen(fname1, mode1);43ATF_REQUIRE_MSG(fp1 != NULL,44"fopen(\"%s\", \"%s\") failed; errno=%d", fname1, mode1, errno);45fp2 = freopen(fname2, mode2, fp1);46if (fp2 == NULL) {47ATF_REQUIRE_MSG(success == false,48"freopen(\"%s\", \"%s\", fopen(\"%s\", \"%s\")) succeeded "49"unexpectedly", fname2_print, mode2, fname1, mode1);50return;51}52ATF_REQUIRE_MSG(success == true,53"freopen(\"%s\", \"%s\", fopen(\"%s\", \"%s\")) failed: %d",54fname2_print, mode2, fname1, mode1, errno);55fclose(fp2);56}5758ATF_TC_WITHOUT_HEAD(null__r__r__test);59ATF_TC_BODY(null__r__r__test, tc)60{6162runtest(_PATH_DEVNULL, "r", NULL, "r", true);63}6465ATF_TC_WITHOUT_HEAD(null__w__r__test);66ATF_TC_BODY(null__w__r__test, tc)67{6869runtest(_PATH_DEVNULL, "w", NULL, "r", false);70}7172ATF_TC_WITHOUT_HEAD(null__r_append__r__test);73ATF_TC_BODY(null__r_append__r__test, tc)74{7576runtest(_PATH_DEVNULL, "r+", NULL, "r", true);77}7879ATF_TC_WITHOUT_HEAD(null__r__w__test);80ATF_TC_BODY(null__r__w__test, tc)81{8283runtest(_PATH_DEVNULL, "r", NULL, "w", false);84}8586ATF_TC_WITHOUT_HEAD(null__w__w__test);87ATF_TC_BODY(null__w__w__test, tc)88{8990runtest(_PATH_DEVNULL, "w", NULL, "w", true);91}9293ATF_TC_WITHOUT_HEAD(null__r_append__w__test);94ATF_TC_BODY(null__r_append__w__test, tc)95{9697runtest(_PATH_DEVNULL, "r+", NULL, "w", true);98}99100ATF_TC_WITHOUT_HEAD(null__r__a__test);101ATF_TC_BODY(null__r__a__test, tc)102{103104runtest(_PATH_DEVNULL, "r", NULL, "a", false);105}106107ATF_TC_WITHOUT_HEAD(null__w__a__test);108ATF_TC_BODY(null__w__a__test, tc)109{110111runtest(_PATH_DEVNULL, "w", NULL, "a", true);112}113114ATF_TC_WITHOUT_HEAD(null__r_append__a__test);115ATF_TC_BODY(null__r_append__a__test, tc)116{117118runtest(_PATH_DEVNULL, "r+", NULL, "a", true);119}120121ATF_TC_WITHOUT_HEAD(null__r__r_append__test);122ATF_TC_BODY(null__r__r_append__test, tc)123{124125runtest(_PATH_DEVNULL, "r", NULL, "r+", false);126}127128ATF_TC_WITHOUT_HEAD(null__w__r_append__test);129ATF_TC_BODY(null__w__r_append__test, tc)130{131132runtest(_PATH_DEVNULL, "w", NULL, "r+", false);133}134135ATF_TC_WITHOUT_HEAD(null__r_append__r_append__test);136ATF_TC_BODY(null__r_append__r_append__test, tc)137{138139runtest(_PATH_DEVNULL, "r+", NULL, "r+", true);140}141142ATF_TC_WITHOUT_HEAD(null__r__w_append__test);143ATF_TC_BODY(null__r__w_append__test, tc)144{145146runtest(_PATH_DEVNULL, "r", NULL, "w+", false);147}148149ATF_TC_WITHOUT_HEAD(null__w__w_append__test);150ATF_TC_BODY(null__w__w_append__test, tc)151{152153runtest(_PATH_DEVNULL, "w", NULL, "w+", false);154}155156ATF_TC_WITHOUT_HEAD(null__r_append__w_append__test);157ATF_TC_BODY(null__r_append__w_append__test, tc)158{159160runtest(_PATH_DEVNULL, "r+", NULL, "w+", true);161}162163ATF_TC_WITHOUT_HEAD(sh__r__r__test);164ATF_TC_BODY(sh__r__r__test, tc)165{166167runtest("/bin/sh", "r", NULL, "r", true);168}169170ATF_TC_WITHOUT_HEAD(sh__sh__r__r__test);171ATF_TC_BODY(sh__sh__r__r__test, tc)172{173174runtest("/bin/sh", "r", "/bin/sh", "r", true);175}176177ATF_TC_WITHOUT_HEAD(sh__null__r__r__test);178ATF_TC_BODY(sh__null__r__r__test, tc)179{180181runtest("/bin/sh", "r", _PATH_DEVNULL, "r", true);182}183184ATF_TC_WITHOUT_HEAD(sh__null__r__w__test);185ATF_TC_BODY(sh__null__r__w__test, tc)186{187188runtest("/bin/sh", "r", _PATH_DEVNULL, "w", true);189}190191ATF_TP_ADD_TCS(tp)192{193194ATF_TP_ADD_TC(tp, null__r__r__test);195ATF_TP_ADD_TC(tp, null__w__r__test);196ATF_TP_ADD_TC(tp, null__r_append__r__test);197ATF_TP_ADD_TC(tp, null__r__w__test);198ATF_TP_ADD_TC(tp, null__w__w__test);199ATF_TP_ADD_TC(tp, null__r_append__w__test);200ATF_TP_ADD_TC(tp, null__r__a__test);201ATF_TP_ADD_TC(tp, null__w__a__test);202ATF_TP_ADD_TC(tp, null__r_append__a__test);203ATF_TP_ADD_TC(tp, null__r__r_append__test);204ATF_TP_ADD_TC(tp, null__w__r_append__test);205ATF_TP_ADD_TC(tp, null__r_append__r_append__test);206ATF_TP_ADD_TC(tp, null__r__w_append__test);207ATF_TP_ADD_TC(tp, null__w__w_append__test);208ATF_TP_ADD_TC(tp, null__r_append__w_append__test);209ATF_TP_ADD_TC(tp, sh__r__r__test);210ATF_TP_ADD_TC(tp, sh__sh__r__r__test);211ATF_TP_ADD_TC(tp, sh__null__r__r__test);212ATF_TP_ADD_TC(tp, sh__null__r__w__test);213214return (atf_no_error());215}216217/*218vim:ts=8:cin:sw=8219*/220221222