diff options
Diffstat (limited to 'stdio-common')
-rw-r--r-- | stdio-common/Makefile | 2 | ||||
-rw-r--r-- | stdio-common/tst-fdopen.c | 49 | ||||
-rw-r--r-- | stdio-common/tst-ungetc.c | 12 |
3 files changed, 62 insertions, 1 deletions
diff --git a/stdio-common/Makefile b/stdio-common/Makefile index b72e71e..2212df2 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -56,7 +56,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \ scanf1 scanf2 scanf3 scanf4 scanf5 scanf7 scanf8 scanf9 scanf10 \ scanf11 scanf12 tst-tmpnam tst-cookie tst-obprintf tst-sscanf \ tst-swprintf tst-fseek tst-fmemopen test-vfprintf tst-gets \ - tst-perror tst-sprintf tst-rndseek + tst-perror tst-sprintf tst-rndseek tst-fdopen test-srcs = tst-unbputc tst-printf diff --git a/stdio-common/tst-fdopen.c b/stdio-common/tst-fdopen.c new file mode 100644 index 0000000..bbdc4c8 --- /dev/null +++ b/stdio-common/tst-fdopen.c @@ -0,0 +1,49 @@ +/* Test for fdopen bugs. */ + +#include <stdio.h> +#include <unistd.h> +#include <fcntl.h> + +#define assert(x) \ + if (!(x)) \ + { \ + fputs ("test failed: " #x "\n", stderr); \ + retval = 1; \ + goto the_end; \ + } + +char buffer[256]; + +int +main (int argc, char *argv[]) +{ + char *name; + FILE *fp = NULL; + int retval = 0; + int c, fd; + + name = tmpnam (NULL); + fp = fopen (name, "w"); + assert (fp != NULL) + fputs ("foobar and baz", fp); + fclose (fp); + fp = NULL; + + fd = open (name, O_RDONLY); + assert (fd != -1); + assert (lseek (fd, 5, SEEK_SET) == 5); + /* The file position indicator associated with the new stream is set to + the position indicated by the file offset associated with the file + descriptor. */ + fp = fdopen (fd, "r"); + assert (fp != NULL); + assert (getc (fp) == 'r'); + assert (getc (fp) == ' '); + +the_end: + if (fp != NULL) + fclose (fp); + unlink (name); + + return retval; +} diff --git a/stdio-common/tst-ungetc.c b/stdio-common/tst-ungetc.c index 08819b7..2cadf1c 100644 --- a/stdio-common/tst-ungetc.c +++ b/stdio-common/tst-ungetc.c @@ -18,6 +18,7 @@ main (int argc, char *argv[]) FILE *fp = NULL; int retval = 0; int c; + char buffer[64]; name = tmpnam (NULL); fp = fopen (name, "w"); @@ -40,6 +41,17 @@ main (int argc, char *argv[]) assert (feof (fp) == 0); assert (getc (fp) == c); assert (getc (fp) == EOF); + fclose (fp); + fp = NULL; + + fp = fopen (name, "r"); + assert (fp != NULL); + assert (getc (fp) == 'b'); + assert (getc (fp) == 'l'); + assert (ungetc ('b', fp) == 'b'); + assert (fread (buffer, 1, 64, fp) == 2); + assert (buffer[0] == 'b'); + assert (buffer[1] == 'a'); the_end: if (fp != NULL) |