123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #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;
- }
|