X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fstdio%2Ffgetws.c;h=b08b30491af14982248461caafd62d3a3aa64909;hb=e95538fa07d2b460b25ee6c2fef05f820888776d;hp=fab9bd0f131b5f09cb61f3c0c81dc636b48853c6;hpb=400c5e5c8307a2ebe44ef1f203f5a15669f20347;p=musl diff --git a/src/stdio/fgetws.c b/src/stdio/fgetws.c index fab9bd0f..b08b3049 100644 --- a/src/stdio/fgetws.c +++ b/src/stdio/fgetws.c @@ -1,4 +1,6 @@ #include "stdio_impl.h" +#include +#include wint_t __fgetwc_unlocked(FILE *); @@ -10,6 +12,10 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f) FLOCK(f); + /* Setup a dummy errno so we can detect EILSEQ. This is + * the only way to catch encoding errors in the form of a + * partial character just before EOF. */ + errno = EAGAIN; for (; n; n--) { wint_t c = __fgetwc_unlocked(f); if (c == WEOF) break; @@ -17,7 +23,7 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f) if (c == '\n') break; } *p = 0; - if (ferror(f)) p = s; + if (ferror(f) || errno==EILSEQ) p = s; FUNLOCK(f);