#include <stdlib.h>
#include <unistd.h>
+#include <support/xstdio.h>
static char *fname;
perror ("fopen(\"r\")");
}
- fread (buf, 3, 1, f);
+ xfread (buf, 3, 1, f);
errno = 0;
if (fseek (f, -10, SEEK_CUR) == 0)
{
perror ("fopen(\"r+\")");
}
- fread (buf, 3, 1, f);
+ xfread (buf, 3, 1, f);
errno = 0;
if (fseek (f, -10, SEEK_CUR) == 0)
{
perror ("fopen(\"r+\")");
}
- fread (buf, 3, 1, f);
+ xfread (buf, 3, 1, f);
if (ftell (f) != 3)
{
puts ("ftell failed");
#include <stdio.h>
#include <string.h>
+#include <support/xstdio.h>
+
char x[4096], z[4096], b[21], m[4096 * 4];
int
}
rewind (f);
- fread (m, 4096 * 4 - 10, 1, f);
- fread (b, 20, 1, f);
+ xfread (m, 4096 * 4 - 10, 1, f);
+ xfread (b, 20, 1, f);
printf ("got %s (should be %s)\n", b, "zzzzzzzzzzxxxxxxxxxx");
if (strcmp (b, "zzzzzzzzzzxxxxxxxxxx"))
failed = 1;
fseek (f, -40, SEEK_CUR);
- fread (b, 20, 1, f);
+ xfread (b, 20, 1, f);
printf ("got %s (should be %s)\n", b, "zzzzzzzzzzzzzzzzzzzz");
if (strcmp (b, "zzzzzzzzzzzzzzzzzzzz"))
failed = 1;
- fread (b, 20, 1, f);
+ xfread (b, 20, 1, f);
printf ("got %s (should be %s)\n", b, "zzzzzzzzzzxxxxxxxxxx");
if (strcmp (b, "zzzzzzzzzzxxxxxxxxxx"))
failed = 1;
- fread (b, 20, 1, f);
+ xfread (b, 20, 1, f);
printf ("got %s (should be %s)\n", b, "xxxxxxxxxxxxxxxxxxxx");
if (strcmp (b, "xxxxxxxxxxxxxxxxxxxx"))
failed = 1;
#include <stdio.h>
#include <string.h>
+#include <support/xstdio.h>
+
int
main (void)
{
char buf[25];
buf[0] = j;
- fread (buf + 1, 1, 23, f);
+ xfread (buf + 1, 1, 23, f);
buf[24] = '\0';
if (strcmp (buf, "Where does this text go?") != 0)
{
#include <unistd.h>
#include <string.h>
+#include <support/xstdio.h>
+
int stdio_block_read = 1, stdio_block_write = 1;
int
fseek (f, 8180L, 0);
fwrite ("Where does this text come from?", 1, 31, f);
fseek (f, 8180L, 0);
- fread (buffer, 1, 31, f);
+ xfread (buffer, 1, 31, f);
fwrite (buffer, 1, 31, stdout);
fclose (f);
remove (filename);
#include <stdio.h>
+#include <support/xstdio.h>
+
#define THE_COOKIE ((void *) 0xdeadbeeful)
f = fopencookie (THE_COOKIE, "r+", fcts);
- fread (buf, 1, 1, f);
+ xfread (buf, 1, 1, f);
+
fwrite (buf, 1, 1, f);
fseek (f, 0, SEEK_CUR);
fclose (f);
#include <string.h>
#include <sys/types.h>
+#include <support/xstdio.h>
+
static void
print_buffer (const char *s, size_t n)
{
FILE *fp = fmemopen (buf, sizeof (buf), mode);
fseek (fp, offset, SEEK_END);
- fread (tmp, tmps, 1, fp);
+ xfread (tmp, tmps, 1, fp);
if (memcmp (tmp, expected, tmps) != 0)
{
xfclose \
xfopen \
xfork \
+ xfread \
xfreopen \
xftruncate \
xgetline \
--- /dev/null
+/* fread with error checking.
+ Copyright (C) 2023 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <support/xstdio.h>
+
+#include <support/check.h>
+#include <stdlib.h>
+
+void
+xfread (void *ptr, size_t size, size_t nmemb, FILE *stream)
+{
+ size_t count = 0;
+ char *p = ptr;
+
+ while (count < nmemb)
+ {
+ size_t ret = fread (p, size, nmemb - count, stream);
+ if (ret <= 0 && ferror(stream))
+ FAIL_EXIT1 ("read of %zu bytes failed after %td: %m",
+ size * nmemb, p - (char *) ptr);
+ count += ret;
+ p += size * ret;
+ }
+}
FILE *xfopen (const char *path, const char *mode);
void xfclose (FILE *);
FILE *xfreopen (const char *path, const char *mode, FILE *stream);
+void xfread (void *ptr, size_t size, size_t nmemb, FILE *stream);
/* Read a line from FP, using getline. *BUFFER must be NULL, or a
heap-allocated pointer of *LENGTH bytes. Return the number of