]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tools/nolibc: Add fread() to stdio.h
authorDaniel Palmer <daniel@thingy.jp>
Mon, 5 Jan 2026 02:36:27 +0000 (11:36 +0900)
committerThomas Weißschuh <linux@weissschuh.net>
Sun, 11 Jan 2026 11:47:47 +0000 (12:47 +0100)
Add a very basic version of fread() like we already have for fwrite().

Signed-off-by: Daniel Palmer <daniel@thingy.jp>
Link: https://patch.msgid.link/20260105023629.1502801-2-daniel@thingy.jp
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
tools/include/nolibc/stdio.h

index 1f16dab2ac8847d1d10af5b06f8b0164354734fd..6904252df97dff31f43c0a2f2e2014bacef89938 100644 (file)
@@ -170,7 +170,7 @@ int putchar(int c)
 }
 
 
-/* fwrite(), puts(), fputs(). Note that puts() emits '\n' but not fputs(). */
+/* fwrite(), fread(), puts(), fputs(). Note that puts() emits '\n' but not fputs(). */
 
 /* internal fwrite()-like function which only takes a size and returns 0 on
  * success or EOF on error. It automatically retries on short writes.
@@ -204,6 +204,38 @@ size_t fwrite(const void *s, size_t size, size_t nmemb, FILE *stream)
        return written;
 }
 
+/* internal fread()-like function which only takes a size and returns 0 on
+ * success or EOF on error. It automatically retries on short reads.
+ */
+static __attribute__((unused))
+int _fread(void *buf, size_t size, FILE *stream)
+{
+       int fd = fileno(stream);
+       ssize_t ret;
+
+       while (size) {
+               ret = read(fd, buf, size);
+               if (ret <= 0)
+                       return EOF;
+               size -= ret;
+               buf += ret;
+       }
+       return 0;
+}
+
+static __attribute__((unused))
+size_t fread(void *s, size_t size, size_t nmemb, FILE *stream)
+{
+       size_t nread;
+
+       for (nread = 0; nread < nmemb; nread++) {
+               if (_fread(s, size, stream) != 0)
+                       break;
+               s += size;
+       }
+       return nread;
+}
+
 static __attribute__((unused))
 int fputs(const char *s, FILE *stream)
 {