t_fflush.c revision 1.1 1 1.1 jruoho /* $NetBSD: t_fflush.c,v 1.1 2011/09/11 05:15:55 jruoho Exp $ */
2 1.1 jruoho
3 1.1 jruoho /*-
4 1.1 jruoho * Copyright (c) 2011 The NetBSD Foundation, Inc.
5 1.1 jruoho * All rights reserved.
6 1.1 jruoho *
7 1.1 jruoho * This code is derived from software contributed to The NetBSD Foundation
8 1.1 jruoho * by Jukka Ruohonen.
9 1.1 jruoho *
10 1.1 jruoho * Redistribution and use in source and binary forms, with or without
11 1.1 jruoho * modification, are permitted provided that the following conditions
12 1.1 jruoho * are met:
13 1.1 jruoho * 1. Redistributions of source code must retain the above copyright
14 1.1 jruoho * notice, this list of conditions and the following disclaimer.
15 1.1 jruoho * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 jruoho * notice, this list of conditions and the following disclaimer in the
17 1.1 jruoho * documentation and/or other materials provided with the distribution.
18 1.1 jruoho *
19 1.1 jruoho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 jruoho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 jruoho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 jruoho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 jruoho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 jruoho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 jruoho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 jruoho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 jruoho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 jruoho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 jruoho * POSSIBILITY OF SUCH DAMAGE.
30 1.1 jruoho */
31 1.1 jruoho #include <sys/cdefs.h>
32 1.1 jruoho __RCSID("$NetBSD: t_fflush.c,v 1.1 2011/09/11 05:15:55 jruoho Exp $");
33 1.1 jruoho
34 1.1 jruoho #include <atf-c.h>
35 1.1 jruoho #include <errno.h>
36 1.1 jruoho #include <stdio.h>
37 1.1 jruoho #include <unistd.h>
38 1.1 jruoho
39 1.1 jruoho static const char *path = "fflush";
40 1.1 jruoho
41 1.1 jruoho ATF_TC_WITH_CLEANUP(fflush_err);
42 1.1 jruoho ATF_TC_HEAD(fflush_err, tc)
43 1.1 jruoho {
44 1.1 jruoho atf_tc_set_md_var(tc, "descr", "Test errors from fflush(3)");
45 1.1 jruoho }
46 1.1 jruoho
47 1.1 jruoho ATF_TC_BODY(fflush_err, tc)
48 1.1 jruoho {
49 1.1 jruoho FILE *f;
50 1.1 jruoho
51 1.1 jruoho f = fopen(path, "w");
52 1.1 jruoho
53 1.1 jruoho ATF_REQUIRE(f != NULL);
54 1.1 jruoho ATF_REQUIRE(fflush(NULL) == 0);
55 1.1 jruoho ATF_REQUIRE(fclose(f) == 0);
56 1.1 jruoho
57 1.1 jruoho f = fopen(path, "r");
58 1.1 jruoho ATF_REQUIRE(f != NULL);
59 1.1 jruoho
60 1.1 jruoho /*
61 1.1 jruoho * In NetBSD the call should fail if the supplied
62 1.1 jruoho * parameteris not an open stream or the stream is
63 1.1 jruoho * not open for writing.
64 1.1 jruoho */
65 1.1 jruoho errno = 0;
66 1.1 jruoho ATF_REQUIRE_ERRNO(EBADF, fflush(f) == EOF);
67 1.1 jruoho
68 1.1 jruoho ATF_REQUIRE(fclose(f) == 0);
69 1.1 jruoho
70 1.1 jruoho errno = 0;
71 1.1 jruoho ATF_REQUIRE_ERRNO(EBADF, fflush(f) == EOF);
72 1.1 jruoho
73 1.1 jruoho (void)unlink(path);
74 1.1 jruoho }
75 1.1 jruoho
76 1.1 jruoho ATF_TC_CLEANUP(fflush_err, tc)
77 1.1 jruoho {
78 1.1 jruoho (void)unlink(path);
79 1.1 jruoho }
80 1.1 jruoho
81 1.1 jruoho ATF_TC_WITH_CLEANUP(fflush_seek);
82 1.1 jruoho ATF_TC_HEAD(fflush_seek, tc)
83 1.1 jruoho {
84 1.1 jruoho atf_tc_set_md_var(tc, "descr", "Test file offsets with fflush(3)");
85 1.1 jruoho }
86 1.1 jruoho
87 1.1 jruoho ATF_TC_BODY(fflush_seek, tc)
88 1.1 jruoho {
89 1.1 jruoho char buf[12];
90 1.1 jruoho int fd = -1;
91 1.1 jruoho FILE *f;
92 1.1 jruoho
93 1.1 jruoho /*
94 1.1 jruoho * IEEE Std 1003.1-2008:
95 1.1 jruoho *
96 1.1 jruoho * "For a stream open for reading, if the file
97 1.1 jruoho * is not already at EOF, and the file is one
98 1.1 jruoho * capable of seeking, the file offset of the
99 1.1 jruoho * underlying open file description shall be
100 1.1 jruoho * adjusted so that the next operation on the
101 1.1 jruoho * open file description deals with the byte
102 1.1 jruoho * after the last one read from or written to
103 1.1 jruoho * the stream being flushed."
104 1.1 jruoho */
105 1.1 jruoho f = fopen(path, "w");
106 1.1 jruoho ATF_REQUIRE(f != NULL);
107 1.1 jruoho
108 1.1 jruoho ATF_REQUIRE(fwrite("garbage", 1, 7, f) == 7);
109 1.1 jruoho ATF_REQUIRE(fclose(f) == 0);
110 1.1 jruoho
111 1.1 jruoho f = fopen(path, "r+");
112 1.1 jruoho ATF_REQUIRE(f != NULL);
113 1.1 jruoho
114 1.1 jruoho fd = fileno(f);
115 1.1 jruoho ATF_REQUIRE(fd != -1);
116 1.1 jruoho
117 1.1 jruoho ATF_REQUIRE(fread(buf, 1, 3, f) == 3);
118 1.1 jruoho ATF_REQUIRE(fflush(f) == 0);
119 1.1 jruoho ATF_REQUIRE(fseek(f, 0, SEEK_CUR) == 0);
120 1.1 jruoho
121 1.1 jruoho /*
122 1.1 jruoho * Verify that the offsets are right and that
123 1.1 jruoho * a read operation resumes at the correct location.
124 1.1 jruoho */
125 1.1 jruoho ATF_REQUIRE(ftell(f) == 3);
126 1.1 jruoho ATF_REQUIRE(lseek(fd, 0, SEEK_CUR) == 3);
127 1.1 jruoho ATF_REQUIRE(fgetc(f) == 'b');
128 1.1 jruoho
129 1.1 jruoho ATF_REQUIRE(fclose(f) == 0);
130 1.1 jruoho ATF_REQUIRE(unlink(path) == 0);
131 1.1 jruoho }
132 1.1 jruoho
133 1.1 jruoho ATF_TC_CLEANUP(fflush_seek, tc)
134 1.1 jruoho {
135 1.1 jruoho (void)unlink(path);
136 1.1 jruoho }
137 1.1 jruoho
138 1.1 jruoho ATF_TC_WITH_CLEANUP(fpurge_err);
139 1.1 jruoho ATF_TC_HEAD(fpurge_err, tc)
140 1.1 jruoho {
141 1.1 jruoho atf_tc_set_md_var(tc, "descr", "Test errors from fpurge(3)");
142 1.1 jruoho }
143 1.1 jruoho
144 1.1 jruoho ATF_TC_BODY(fpurge_err, tc)
145 1.1 jruoho {
146 1.1 jruoho FILE *f;
147 1.1 jruoho
148 1.1 jruoho f = fopen(path, "w");
149 1.1 jruoho ATF_REQUIRE(f != NULL);
150 1.1 jruoho ATF_REQUIRE(fclose(f) == 0);
151 1.1 jruoho
152 1.1 jruoho errno = 0;
153 1.1 jruoho ATF_REQUIRE_ERRNO(EBADF, fpurge(f) == EOF);
154 1.1 jruoho
155 1.1 jruoho (void)unlink(path);
156 1.1 jruoho }
157 1.1 jruoho
158 1.1 jruoho ATF_TC_CLEANUP(fpurge_err, tc)
159 1.1 jruoho {
160 1.1 jruoho (void)unlink(path);
161 1.1 jruoho }
162 1.1 jruoho
163 1.1 jruoho ATF_TP_ADD_TCS(tp)
164 1.1 jruoho {
165 1.1 jruoho
166 1.1 jruoho ATF_TP_ADD_TC(tp, fflush_err);
167 1.1 jruoho ATF_TP_ADD_TC(tp, fflush_seek);
168 1.1 jruoho ATF_TP_ADD_TC(tp, fpurge_err);
169 1.1 jruoho
170 1.1 jruoho return atf_no_error();
171 1.1 jruoho }
172