Test for fseek bug wrt relative positioning.
[kopensolaris-gnu/glibc.git] / libio / bug-fseek.c
1 #include <errno.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5
6
7 static char *fname;
8
9
10 static void do_prepare (void);
11 #define PREPARE(argc, argv) do_prepare ()
12 static int do_test (void);
13 #define TEST_FUNCTION do_test ()
14 #include <test-skeleton.c>
15
16
17 static void
18 do_prepare (void)
19 {
20   static const char pattern[] = "12345678901234567890";
21   int fd = create_temp_file ("bug-fseek.", &fname);
22   if (fd == -1)
23     {
24       printf ("cannot create temporary file: %m\n");
25       exit (1);
26     }
27
28   if (write (fd, pattern, sizeof (pattern)) != sizeof (pattern))
29     {
30       perror ("short write");
31       abort ();
32     }
33   close (fd);
34 }
35
36
37
38 static int
39 do_test (void)
40 {
41   FILE *f;
42   int result = 0;
43   char buf[10];
44
45
46   if ((f = fopen (fname, "r")) == (FILE *) NULL)
47     {
48       perror ("fopen(\"r\")");
49     }
50
51   fread (buf, 3, 1, f);
52   errno = 0;
53   if (fseek (f, -10, SEEK_CUR) == 0)
54     {
55       printf ("fseek() for r to before start of file worked!\n");
56       result = 1;
57     }
58   else if (errno != EINVAL)
59     {
60       printf ("\
61 fseek() for r to before start of file did not set errno to EINVAL.  \
62 Got %d instead\n",
63          errno);
64       result = 1;
65     }
66
67   fclose (f);
68
69
70   if ((f = fopen (fname, "r+")) == (FILE *) NULL)
71     {
72       perror ("fopen(\"r+\")");
73     }
74
75   fread (buf, 3, 1, f);
76   errno = 0;
77   if (fseek (f, -10, SEEK_CUR) == 0)
78     {
79       printf ("fseek() for r+ to before start of file worked!\n");
80       result = 1;
81     }
82   else if (errno != EINVAL)
83     {
84       printf ("\
85 fseek() for r+ to before start of file did not set errno to EINVAL.  \
86 Got %d instead\n",
87          errno);
88       result = 1;
89     }
90
91   fclose (f);
92
93   return result;
94 }