diff options
Diffstat (limited to 'stdio-common/tst-rndseek.c')
-rw-r--r-- | stdio-common/tst-rndseek.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/stdio-common/tst-rndseek.c b/stdio-common/tst-rndseek.c new file mode 100644 index 0000000000..82a4cfd83e --- /dev/null +++ b/stdio-common/tst-rndseek.c @@ -0,0 +1,143 @@ +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + + +static char fname[] = "/tmp/rndseek.XXXXXX"; +static char tempdata[65 * 1024]; + + +static int do_test (void); +#define TEST_FUNCTION do_test () + +#include "../test-skeleton.c" + + +static int +fp_test (FILE *fp) +{ + int result = 0; + int rounds = 10000; + + do + { + int idx = random () % (sizeof (tempdata) - 2); + char ch1; + char ch2; + + if (fseek (fp, idx, SEEK_SET) != 0) + { + printf ("%d: fseek failed: %m\n", rounds); + result = 1; + break; + } + + ch1 = fgetc_unlocked (fp); + ch2 = tempdata[idx]; + if (ch1 != ch2) + { + printf ("%d: character at index %d not what is expected ('%c' vs '%c')\n", + rounds, idx, ch1, ch2); + result = 1; + break; + } + + ch1 = fgetc (fp); + ch2 = tempdata[idx + 1]; + if (ch1 != ch2) + { + printf ("%d: character at index %d not what is expected ('%c' vs '%c')\n", + rounds, idx + 1, ch1, ch2); + result = 1; + break; + } + } + while (--rounds > 0); + + fclose (fp); + + return result; +} + + +static int +do_test (void) +{ + int fd; + FILE *fp; + int i; + int result; + + fd = mkstemp (fname); + if (fd == -1) + { + printf ("cannot open temporary file: %m\n"); + return 1; + } + /* Make sure the file gets removed. */ + add_temp_file (fname); + + /* Repeatability demands this. */ + srandom (42); + + /* First create some temporary data. */ + for (i = 0; i < sizeof (tempdata); ++i) + tempdata[i] = (char) random (); + + /* Write this data to a file. */ + if (TEMP_FAILURE_RETRY (write (fd, tempdata, sizeof (tempdata))) + != sizeof (tempdata)) + { + printf ("cannot wrote data to temporary file: %m\n"); + return 1; + } + + /* Now try reading the data. */ + fp = fdopen (dup (fd), "r"); + if (fp == NULL) + { + printf ("cannot duplicate temporary file descriptor: %m\n"); + return 1; + } + + rewind (fp); + for (i = 0; i < sizeof (tempdata); ++i) + { + int ch0 = fgetc (fp); + char ch1 = ch0; + char ch2 = tempdata[i]; + + if (ch0 == EOF) + { + puts ("premature end of file while reading data"); + return 1; + } + + if (ch1 != ch2) + { + printf ("%d: '%c' vs '%c'\n", i, ch1, ch2); + return 1; + } + } + + result = fp_test (fp); + + fp = fopen (fname, "r"); + result |= fp_test (fp); + + fp = fopen64 (fname, "r"); + result |= fp_test (fp); + + /* The "rw" mode will prevent the mmap-using code from being used. */ + fp = fdopen (fd, "rw"); + result = fp_test (fp); + + fp = fopen (fname, "rw"); + result |= fp_test (fp); + + fp = fopen64 (fname, "rw"); + result |= fp_test (fp); + + return result; +} |