Path: blob/main/lib/libc/tests/stdio/fopen_test.c
102412 views
/*-1* Copyright (c) 2013 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 <fcntl.h>27#include <paths.h>28#include <stdio.h>29#include <string.h>3031#include <atf-c.h>3233/*34* O_ACCMODE is currently defined incorrectly. This is what it should be.35* Various code depends on the incorrect value.36*/37#define CORRECT_O_ACCMODE (O_ACCMODE | O_EXEC)3839static void40runtest(const char *fname, const char *mode)41{42FILE *fp;43int exp_fget_ret, fget_ret, fd, flags, wantedflags;4445fp = fopen(fname, mode);46ATF_REQUIRE_MSG(fp != NULL,47"fopen(\"%s\", \"%s\") failed", fname, mode);48fd = fileno(fp);49ATF_REQUIRE_MSG(fd >= 0, "fileno() failed for fopen");50exp_fget_ret = strchr(mode, 'e') != NULL ? FD_CLOEXEC : 0;51ATF_REQUIRE_MSG((fget_ret = fcntl(fd, F_GETFD)) == exp_fget_ret,52"fcntl(.., F_GETFD) didn't FD_CLOEXEC as expected %d != %d",53exp_fget_ret, fget_ret);54flags = fcntl(fd, F_GETFL);55if (strchr(mode, '+'))56wantedflags = O_RDWR | (*mode == 'a' ? O_APPEND : 0);57else if (*mode == 'r')58wantedflags = O_RDONLY;59else if (*mode == 'w')60wantedflags = O_WRONLY;61else if (*mode == 'a')62wantedflags = O_WRONLY | O_APPEND;63else64wantedflags = -1;65fclose(fp);66if (wantedflags == -1)67atf_tc_fail("unrecognized mode: %s", mode);68else if ((flags & (CORRECT_O_ACCMODE | O_APPEND)) != wantedflags)69atf_tc_fail("incorrect access mode: %s", mode);70}7172ATF_TC_WITHOUT_HEAD(fopen_r_test);73ATF_TC_BODY(fopen_r_test, tc)74{7576runtest(_PATH_DEVNULL, "r");77}7879ATF_TC_WITHOUT_HEAD(fopen_r_append_test);80ATF_TC_BODY(fopen_r_append_test, tc)81{8283runtest(_PATH_DEVNULL, "r+");84}8586ATF_TC_WITHOUT_HEAD(fopen_w_test);87ATF_TC_BODY(fopen_w_test, tc)88{8990runtest(_PATH_DEVNULL, "w");91}9293ATF_TC_WITHOUT_HEAD(fopen_w_append_test);94ATF_TC_BODY(fopen_w_append_test, tc)95{9697runtest(_PATH_DEVNULL, "w+");98}99100ATF_TC_WITHOUT_HEAD(fopen_a_test);101ATF_TC_BODY(fopen_a_test, tc)102{103104runtest(_PATH_DEVNULL, "a");105}106107ATF_TC_WITHOUT_HEAD(fopen_a_append_test);108ATF_TC_BODY(fopen_a_append_test, tc)109{110111runtest(_PATH_DEVNULL, "a+");112}113114ATF_TC_WITHOUT_HEAD(fopen_re_test);115ATF_TC_BODY(fopen_re_test, tc)116{117118runtest(_PATH_DEVNULL, "re");119}120121ATF_TC_WITHOUT_HEAD(fopen_r_append_e_test);122ATF_TC_BODY(fopen_r_append_e_test, tc)123{124125runtest(_PATH_DEVNULL, "r+e");126}127128ATF_TC_WITHOUT_HEAD(fopen_we_test);129ATF_TC_BODY(fopen_we_test, tc)130{131132runtest(_PATH_DEVNULL, "we");133}134135ATF_TC_WITHOUT_HEAD(fopen_w_append_e_test);136ATF_TC_BODY(fopen_w_append_e_test, tc)137{138139runtest(_PATH_DEVNULL, "w+e");140}141142ATF_TC_WITHOUT_HEAD(fopen_ae_test);143ATF_TC_BODY(fopen_ae_test, tc)144{145146runtest(_PATH_DEVNULL, "ae");147}148149ATF_TC_WITHOUT_HEAD(fopen_a_append_e_test);150ATF_TC_BODY(fopen_a_append_e_test, tc)151{152153runtest(_PATH_DEVNULL, "a+e");154}155156ATF_TC_WITHOUT_HEAD(fopen_re_append_test);157ATF_TC_BODY(fopen_re_append_test, tc)158{159160runtest(_PATH_DEVNULL, "re+");161}162163ATF_TC_WITHOUT_HEAD(fopen_we_append_test);164ATF_TC_BODY(fopen_we_append_test, tc)165{166167runtest(_PATH_DEVNULL, "we+");168}169170ATF_TC_WITHOUT_HEAD(fopen_ae_append_test);171ATF_TC_BODY(fopen_ae_append_test, tc)172{173174runtest(_PATH_DEVNULL, "ae+");175}176177ATF_TP_ADD_TCS(tp)178{179180ATF_TP_ADD_TC(tp, fopen_r_test);181ATF_TP_ADD_TC(tp, fopen_r_append_test);182ATF_TP_ADD_TC(tp, fopen_w_test);183ATF_TP_ADD_TC(tp, fopen_w_append_test);184ATF_TP_ADD_TC(tp, fopen_a_test);185ATF_TP_ADD_TC(tp, fopen_a_append_test);186ATF_TP_ADD_TC(tp, fopen_re_test);187ATF_TP_ADD_TC(tp, fopen_r_append_e_test);188ATF_TP_ADD_TC(tp, fopen_we_test);189ATF_TP_ADD_TC(tp, fopen_w_append_e_test);190ATF_TP_ADD_TC(tp, fopen_ae_test);191ATF_TP_ADD_TC(tp, fopen_a_append_e_test);192ATF_TP_ADD_TC(tp, fopen_re_append_test);193ATF_TP_ADD_TC(tp, fopen_we_append_test);194ATF_TP_ADD_TC(tp, fopen_ae_append_test);195196return (atf_no_error());197}198199/*200vim:ts=8:cin:sw=8201*/202203204