| #include <errno.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| |
| |
| static char *fname; |
| |
| |
| static void do_prepare (void); |
| #define PREPARE(argc, argv) do_prepare () |
| static int do_test (void); |
| #define TEST_FUNCTION do_test () |
| #include <test-skeleton.c> |
| |
| |
| static void |
| do_prepare (void) |
| { |
| static const char pattern[] = "12345678901234567890"; |
| int fd = create_temp_file ("bug-fseek.", &fname); |
| if (fd == -1) |
| { |
| printf ("cannot create temporary file: %m\n"); |
| exit (1); |
| } |
| |
| if (write (fd, pattern, sizeof (pattern)) != sizeof (pattern)) |
| { |
| perror ("short write"); |
| abort (); |
| } |
| close (fd); |
| } |
| |
| |
| |
| static int |
| do_test (void) |
| { |
| FILE *f; |
| int result = 0; |
| char buf[10]; |
| |
| |
| if ((f = fopen (fname, "r")) == (FILE *) NULL) |
| { |
| perror ("fopen(\"r\")"); |
| } |
| |
| fread (buf, 3, 1, f); |
| errno = 0; |
| if (fseek (f, -10, SEEK_CUR) == 0) |
| { |
| printf ("fseek() for r to before start of file worked!\n"); |
| result = 1; |
| } |
| else if (errno != EINVAL) |
| { |
| printf ("\ |
| fseek() for r to before start of file did not set errno to EINVAL. \ |
| Got %d instead\n", |
| errno); |
| result = 1; |
| } |
| |
| fclose (f); |
| |
| |
| if ((f = fopen (fname, "r+")) == (FILE *) NULL) |
| { |
| perror ("fopen(\"r+\")"); |
| } |
| |
| fread (buf, 3, 1, f); |
| errno = 0; |
| if (fseek (f, -10, SEEK_CUR) == 0) |
| { |
| printf ("fseek() for r+ to before start of file worked!\n"); |
| result = 1; |
| } |
| else if (errno != EINVAL) |
| { |
| printf ("\ |
| fseek() for r+ to before start of file did not set errno to EINVAL. \ |
| Got %d instead\n", |
| errno); |
| result = 1; |
| } |
| |
| fclose (f); |
| |
| |
| if ((f = fopen (fname, "r+")) == (FILE *) NULL) |
| { |
| perror ("fopen(\"r+\")"); |
| } |
| |
| fread (buf, 3, 1, f); |
| if (ftell (f) != 3) |
| { |
| puts ("ftell failed"); |
| return 1; |
| } |
| errno = 0; |
| if (fseek (f, -10, SEEK_CUR) == 0) |
| { |
| printf ("fseek() for r+ to before start of file worked!\n"); |
| result = 1; |
| } |
| else if (errno != EINVAL) |
| { |
| printf ("\ |
| fseek() for r+ to before start of file did not set errno to EINVAL. \ |
| Got %d instead\n", |
| errno); |
| result = 1; |
| } |
| |
| fclose (f); |
| |
| return result; |
| } |