fdwalk should return 0 on an empty directory
[kopensolaris-gnu/glibc.git] / libio / bug-memstream1.c
1 #include <stdio.h>
2 #include <string.h>
3
4
5 static int
6 do_test (void)
7 {
8   size_t size;
9   char *buf;
10   FILE *fp = open_memstream (&buf, &size);
11   if (fp == NULL)
12     {
13       puts ("open_memstream failed");
14       return 1;
15     }
16
17   off64_t off = ftello64 (fp);
18   if (off != 0)
19     {
20       puts ("initial position wrong");
21       return 1;
22     }
23
24   if (fseek (fp, 32768, SEEK_SET) != 0)
25     {
26       puts ("fseek failed");
27       return 1;
28     }
29
30   if (fputs ("foo", fp) == EOF)
31     {
32       puts ("fputs failed");
33       return 1;
34     }
35
36   if (fclose (fp) == EOF)
37     {
38       puts ("fclose failed");
39       return 1;
40     }
41
42   if (size != 32768 + 3)
43     {
44       printf ("expected size %d, got %zu\n", 32768 + 3, size);
45       return 1;
46     }
47
48   for (int i = 0; i < 32768; ++i)
49     if (buf[i] != '\0')
50       {
51         printf ("byte at offset %d is %#hhx\n", i, buf[i]);
52         return 1;
53       }
54
55   if (memcmp (buf + 32768, "foo", 3) != 0)
56     {
57       puts ("written string incorrect");
58       return 1;
59     }
60
61   /* Mark the buffer.  */
62   memset (buf, 'A', size);
63   free (buf);
64
65   /* Try again, this time with write mode enabled before the seek.  */
66   fp = open_memstream (&buf, &size);
67   if (fp == NULL)
68     {
69       puts ("2nd open_memstream failed");
70       return 1;
71     }
72
73   off = ftello64 (fp);
74   if (off != 0)
75     {
76       puts ("2nd initial position wrong");
77       return 1;
78     }
79
80   if (fputs ("bar", fp) == EOF)
81     {
82       puts ("2nd fputs failed");
83       return 1;
84     }
85
86   if (fseek (fp, 32768, SEEK_SET) != 0)
87     {
88       puts ("2nd fseek failed");
89       return 1;
90     }
91
92   if (fputs ("foo", fp) == EOF)
93     {
94       puts ("3rd fputs failed");
95       return 1;
96     }
97
98   if (fclose (fp) == EOF)
99     {
100       puts ("2nd fclose failed");
101       return 1;
102     }
103
104   if (size != 32768 + 3)
105     {
106       printf ("2nd expected size %d, got %zu\n", 32768 + 3, size);
107       return 1;
108     }
109
110   if (memcmp (buf, "bar", 3) != 0)
111     {
112       puts ("initial string incorrect in 2nd try");
113       return 1;
114     }
115
116   for (int i = 3; i < 32768; ++i)
117     if (buf[i] != '\0')
118       {
119         printf ("byte at offset %d is %#hhx in 2nd try\n", i, buf[i]);
120         return 1;
121       }
122
123   if (memcmp (buf + 32768, "foo", 3) != 0)
124     {
125       puts ("written string incorrect in 2nd try");
126       return 1;
127     }
128
129   return 0;
130 }
131
132 #define TEST_FUNCTION do_test ()
133 #include "../test-skeleton.c"