diff --git a/Userland/Libraries/LibC/stdio.cpp b/Userland/Libraries/LibC/stdio.cpp index 7380700d050..3e75b859fe1 100644 --- a/Userland/Libraries/LibC/stdio.cpp +++ b/Userland/Libraries/LibC/stdio.cpp @@ -666,6 +666,16 @@ int fgetc(FILE* stream) return EOF; } +int fgetc_unlocked(FILE* stream) +{ + VERIFY(stream); + char ch; + size_t nread = fread_unlocked(&ch, sizeof(char), 1, stream); + if (nread == 1) + return ch; + return EOF; +} + int getc(FILE* stream) { return fgetc(stream); @@ -673,8 +683,7 @@ int getc(FILE* stream) int getc_unlocked(FILE* stream) { - // FIXME: This currently locks the file - return fgetc(stream); + return fgetc_unlocked(stream); } int getchar() @@ -796,18 +805,24 @@ int ferror(FILE* stream) return stream->error(); } -size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream) +size_t fread_unlocked(void* ptr, size_t size, size_t nmemb, FILE* stream) { VERIFY(stream); VERIFY(!Checked::multiplication_would_overflow(size, nmemb)); - ScopedFileLock lock(stream); size_t nread = stream->read(reinterpret_cast(ptr), size * nmemb); if (!nread) return 0; return nread / size; } +size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream) +{ + VERIFY(stream); + ScopedFileLock lock(stream); + return fread_unlocked(ptr, size, nmemb, stream); +} + size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream) { VERIFY(stream); diff --git a/Userland/Libraries/LibC/stdio.h b/Userland/Libraries/LibC/stdio.h index d84e0d7979c..c1634ce011a 100644 --- a/Userland/Libraries/LibC/stdio.h +++ b/Userland/Libraries/LibC/stdio.h @@ -47,6 +47,7 @@ char* fgets(char* buffer, int size, FILE*); int fputc(int ch, FILE*); int fileno(FILE*); int fgetc(FILE*); +int fgetc_unlocked(FILE*); int getc(FILE*); int getc_unlocked(FILE* stream); int getchar(); @@ -66,6 +67,7 @@ int ferror(FILE*); int feof(FILE*); int fflush(FILE*); size_t fread(void* ptr, size_t size, size_t nmemb, FILE*); +size_t fread_unlocked(void* ptr, size_t size, size_t nmemb, FILE*); size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE*); int vprintf(const char* fmt, va_list) __attribute__((format(printf, 1, 0))); int vfprintf(FILE*, const char* fmt, va_list) __attribute__((format(printf, 2, 0)));