diff --git a/src/header/stdio/mod.rs b/src/header/stdio/mod.rs index b6c9c916a71a62e962a02e51e719d3e5220de525..73f1bba3e65bcfb51aa34460fb4dfdc56a410b31 100644 --- a/src/header/stdio/mod.rs +++ b/src/header/stdio/mod.rs @@ -519,6 +519,7 @@ pub unsafe extern "C" fn freopen( stream.flags = (stream.flags & constants::F_PERM) | new.flags; fclose(new); } + stream.orientation = 0; funlockfile(stream); stream } diff --git a/tests/expected/stdio/freopen.stdout b/tests/expected/stdio/freopen.stdout index e965047ad7c57865823c7d992b1d046ea66edf78..1dd338fd1adfba22cf85d7b6ffa88aed130b99cc 100644 --- a/tests/expected/stdio/freopen.stdout +++ b/tests/expected/stdio/freopen.stdout @@ -1 +1,3 @@ Hello +0 +0 diff --git a/tests/stdio/freopen.c b/tests/stdio/freopen.c index 6c658435f658d7cfd93a65e57694c65115e0f8f3..3fb6069cbfdb65ed4fb56febb2c486d5bdf81553 100644 --- a/tests/stdio/freopen.c +++ b/tests/stdio/freopen.c @@ -1,12 +1,38 @@ +#include <assert.h> #include <stdio.h> +#include <wchar.h> #include "test_helpers.h" -int main(void) { +int test_reopen_opens_file(void) { FILE *f = freopen("stdio/stdio.in", "r", stdin); ERROR_IF(freopen, f, == NULL); char in[6]; fgets(in, 6, stdin); printf("%s\n", in); // should print Hello + fclose(f); + return 0; +} + +int test_reopen_resets_orientation(void) { + FILE *f = freopen("stdio/stdio.in", "r", stdin); + assert(fwide(f, 0) == 0); + assert(fwide(f, -1) == -1); + + f = freopen("stdio/stdio.in", "r", stdin); + assert(fwide(f, 0) == 0); + + fclose(f); + return 0; +} + +int main(void) { + int(*tests[])(void) = { + &test_reopen_opens_file, + &test_reopen_resets_orientation, + }; + for(int i=0; i<sizeof(tests)/sizeof(int(*)(void)); i++) { + printf("%d\n", (*tests[i])()); + } }