1 | /* Test for some *_unlocked stdio interfaces.
|
---|
2 | Copyright (C) 2004 Free Software Foundation, Inc.
|
---|
3 | This file is part of the GNU C Library.
|
---|
4 | Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
|
---|
5 |
|
---|
6 | The GNU C Library is free software; you can redistribute it and/or
|
---|
7 | modify it under the terms of the GNU Lesser General Public
|
---|
8 | License as published by the Free Software Foundation; either
|
---|
9 | version 2.1 of the License, or (at your option) any later version.
|
---|
10 |
|
---|
11 | The GNU C Library is distributed in the hope that it will be useful,
|
---|
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
14 | Lesser General Public License for more details.
|
---|
15 |
|
---|
16 | You should have received a copy of the GNU Lesser General Public
|
---|
17 | License along with the GNU C Library; if not, write to the Free
|
---|
18 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
---|
19 | 02111-1307 USA. */
|
---|
20 |
|
---|
21 | #include <stdlib.h>
|
---|
22 | #include <stdio.h>
|
---|
23 | #include <string.h>
|
---|
24 |
|
---|
25 | int fd;
|
---|
26 | static void do_prepare (void);
|
---|
27 | static int do_test (void);
|
---|
28 | #define PREPARE(argc, argv) do_prepare ()
|
---|
29 | #define TEST_FUNCTION do_test ()
|
---|
30 | #include "../test-skeleton.c"
|
---|
31 |
|
---|
32 | static int
|
---|
33 | do_test (void)
|
---|
34 | {
|
---|
35 | const char blah[] = "BLAH";
|
---|
36 | char buf[strlen (blah) + 1];
|
---|
37 | FILE *fp, *f;
|
---|
38 | const char *cp;
|
---|
39 | char *wp;
|
---|
40 |
|
---|
41 | if ((fp = fdopen (fd, "w+")) == NULL)
|
---|
42 | exit (1);
|
---|
43 |
|
---|
44 | flockfile (fp);
|
---|
45 |
|
---|
46 | f = fp;
|
---|
47 | cp = blah;
|
---|
48 | if (ftello (fp) != 0
|
---|
49 | || fwrite_unlocked (blah, blah - blah, strlen (blah), f++) != 0
|
---|
50 | || f != fp + 1
|
---|
51 | || fwrite_unlocked ("", 5.0, 0, --f) != 0
|
---|
52 | || f != fp
|
---|
53 | || fwrite_unlocked (cp++, 16, 0.25, fp) != 0
|
---|
54 | || cp != blah + 1
|
---|
55 | || fwrite_unlocked (--cp, 0.25, 16, fp) != 0
|
---|
56 | || cp != blah
|
---|
57 | || fwrite_unlocked (blah, 0, -0.0, fp) != 0
|
---|
58 | || ftello (fp) != 0)
|
---|
59 | {
|
---|
60 | puts ("One of fwrite_unlocked tests failed");
|
---|
61 | exit (1);
|
---|
62 | }
|
---|
63 |
|
---|
64 | if (fwrite_unlocked (blah, 1, strlen (blah) - 2, fp) != strlen (blah) - 2)
|
---|
65 | {
|
---|
66 | puts ("Could not write string into file");
|
---|
67 | exit (1);
|
---|
68 | }
|
---|
69 |
|
---|
70 | if (putc_unlocked ('A' + 0x1000000, fp) != 'A')
|
---|
71 | {
|
---|
72 | puts ("putc_unlocked failed");
|
---|
73 | exit (1);
|
---|
74 | }
|
---|
75 |
|
---|
76 | f = fp;
|
---|
77 | cp = blah + strlen (blah) - 1;
|
---|
78 | if (putc_unlocked (*cp++, f++) != 'H'
|
---|
79 | || f != fp + 1
|
---|
80 | || cp != strchr (blah, '\0'))
|
---|
81 | {
|
---|
82 | puts ("fputc_unlocked failed");
|
---|
83 | exit (1);
|
---|
84 | }
|
---|
85 |
|
---|
86 | if (ftello (fp) != (off_t) strlen (blah))
|
---|
87 | {
|
---|
88 | printf ("Failed to write %zd bytes to temporary file", strlen (blah));
|
---|
89 | exit (1);
|
---|
90 | }
|
---|
91 |
|
---|
92 | rewind (fp);
|
---|
93 |
|
---|
94 | f = fp;
|
---|
95 | wp = buf;
|
---|
96 | memset (buf, ' ', sizeof (buf));
|
---|
97 | if (ftello (fp) != 0
|
---|
98 | || fread_unlocked (buf, buf - buf, strlen (blah), f++) != 0
|
---|
99 | || f != fp + 1
|
---|
100 | || fread_unlocked (buf, 5.0, 0, --f) != 0
|
---|
101 | || f != fp
|
---|
102 | || fread_unlocked (wp++, 16, 0.25, fp) != 0
|
---|
103 | || wp != buf + 1
|
---|
104 | || fread_unlocked (--wp, 0.25, 16, fp) != 0
|
---|
105 | || wp != buf
|
---|
106 | || fread_unlocked (buf, 0, -0.0, fp) != 0
|
---|
107 | || ftello (fp) != 0
|
---|
108 | || memcmp (buf, " ", sizeof (buf)) != 0)
|
---|
109 | {
|
---|
110 | puts ("One of fread_unlocked tests failed");
|
---|
111 | exit (1);
|
---|
112 | }
|
---|
113 |
|
---|
114 | if (fread_unlocked (buf, 1, strlen (blah) - 2, fp) != strlen (blah) - 2)
|
---|
115 | {
|
---|
116 | puts ("Could not read string from file");
|
---|
117 | exit (1);
|
---|
118 | }
|
---|
119 |
|
---|
120 | if (getc_unlocked (fp) != 'A')
|
---|
121 | {
|
---|
122 | puts ("getc_unlocked failed");
|
---|
123 | exit (1);
|
---|
124 | }
|
---|
125 |
|
---|
126 | f = fp;
|
---|
127 | if (fgetc_unlocked (f++) != 'H'
|
---|
128 | || f != fp + 1
|
---|
129 | || fgetc_unlocked (--f) != EOF
|
---|
130 | || f != fp)
|
---|
131 | {
|
---|
132 | puts ("fgetc_unlocked failed");
|
---|
133 | exit (1);
|
---|
134 | }
|
---|
135 |
|
---|
136 | if (ftello (fp) != (off_t) strlen (blah))
|
---|
137 | {
|
---|
138 | printf ("Failed to read %zd bytes from temporary file", strlen (blah));
|
---|
139 | exit (1);
|
---|
140 | }
|
---|
141 |
|
---|
142 | funlockfile (fp);
|
---|
143 | fclose (fp);
|
---|
144 |
|
---|
145 | return 0;
|
---|
146 | }
|
---|
147 |
|
---|
148 | static void
|
---|
149 | do_prepare (void)
|
---|
150 | {
|
---|
151 | fd = create_temp_file ("tst-unlockedio.", NULL);
|
---|
152 | if (fd == -1)
|
---|
153 | {
|
---|
154 | printf ("cannot create temporary file: %m\n");
|
---|
155 | exit (1);
|
---|
156 | }
|
---|
157 | }
|
---|