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
do_prepare(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
do_test(void)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
94 if ((f = fopen (fname, "r+")) == (FILE *) NULL)
95 {
96 perror ("fopen(\"r+\")");
97 }
98
99 fread (buf, 3, 1, f);
100 if (ftell (f) != 3)
101 {
102 puts ("ftell failed");
103 return 1;
104 }
105 errno = 0;
106 if (fseek (f, -10, SEEK_CUR) == 0)
107 {
108 printf ("fseek() for r+ to before start of file worked!\n");
109 result = 1;
110 }
111 else if (errno != EINVAL)
112 {
113 printf ("\
114 fseek() for r+ to before start of file did not set errno to EINVAL. \
115 Got %d instead\n",
116 errno);
117 result = 1;
118 }
119
120 fclose (f);
121
122 return result;
123 }
124