• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *   Copyright (c) International Business Machines  Corp., 2002
4  *
5  *   This program is free software;  you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation; either version 2 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13  *   the GNU General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program;  if not, write to the Free Software
17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 /* ported from SPIE section2/filesuite/stream1.c, by Airong Zhang */
21 
22 /*======================================================================
23 	=================== TESTPLAN SEGMENT ===================
24 >KEYS:  < freopen()
25 >WHAT:  < 1) check that freopen substitutes the named file in place of stream.
26 >HOW:   < 1) open a stream, write something to it, perform freopen and
27 	<    write some more. Check that second write to stream went to
28 	<    the file specified by freopen.
29 >BUGS:  <
30 ======================================================================*/
31 
32 #include <stdio.h>
33 #include <errno.h>
34 #include "test.h"
35 
36 char *TCID = "stream01";
37 int TST_TOTAL = 1;
38 int local_flag;
39 
40 #define PASSED 1
41 #define FAILED 0
42 
43 /* XXX: add setup and cleanup. */
44 
45 char progname[] = "stream01()";
46 char tempfile1[40] = "";
47 char tempfile2[40] = "";
48 
49 /*--------------------------------------------------------------------*/
main(int ac,char * av[])50 int main(int ac, char *av[])
51 {
52 	FILE *stream;
53 	char buf[10];
54 	int i;
55 	int lc;
56 
57 	/*
58 	 * parse standard options
59 	 */
60 	tst_parse_opts(ac, av, NULL, NULL);
61 
62 	local_flag = PASSED;
63 	tst_tmpdir();
64 	for (lc = 0; TEST_LOOPING(lc); lc++) {
65 
66 		sprintf(tempfile1, "stream011.%d", getpid());
67 		sprintf(tempfile2, "stream012.%d", getpid());
68 	/*--------------------------------------------------------------------*/
69 		//block0:
70 		if ((stream = fopen(tempfile1, "a+")) == NULL) {
71 			tst_brkm(TFAIL, NULL, "fopen(%s) a+ failed: %s",
72 				 tempfile1,
73 				 strerror(errno));
74 		}
75 		fwrite("a", 1, 1, stream);
76 		if ((stream = freopen(tempfile2, "a+", stream)) == NULL) {
77 			tst_brkm(TFAIL | TERRNO, NULL, "freopen(%s) a+ failed",
78 				 tempfile2);
79 		}
80 		fwrite("a", 1, 1, stream);
81 		fclose(stream);
82 
83 		/* now check that a single "a" is in each file */
84 		if ((stream = fopen(tempfile1, "r")) == NULL) {
85 			tst_brkm(TFAIL | TERRNO, NULL, "fopen(%s) r failed",
86 				 tempfile1);
87 		} else {
88 			for (i = 0; i < 10; i++)
89 				buf[i] = 0;
90 			fread(buf, 1, 1, stream);
91 			if ((buf[0] != 'a') || (buf[1] != 0)) {
92 				tst_resm(TFAIL, "bad contents in %s",
93 					 tempfile1);
94 				local_flag = FAILED;
95 			}
96 			fclose(stream);
97 		}
98 		if ((stream = fopen(tempfile2, "r")) == NULL) {
99 			tst_brkm(TFAIL | TERRNO, NULL, "fopen(%s) r failed",
100 				 tempfile2);
101 		} else {
102 			for (i = 0; i < 10; i++)
103 				buf[i] = 0;
104 			fread(buf, 1, 1, stream);
105 			if ((buf[0] != 'a') || (buf[1] != 0)) {
106 				tst_resm(TFAIL, "bad contents in %s",
107 					 tempfile2);
108 				local_flag = FAILED;
109 			}
110 			fclose(stream);
111 		}
112 		if (local_flag == PASSED) {
113 			tst_resm(TPASS, "Test passed.");
114 		} else {
115 			tst_resm(TFAIL, "Test failed.");
116 		}
117 
118 		local_flag = PASSED;
119 
120 	/*--------------------------------------------------------------------*/
121 		unlink(tempfile1);
122 		unlink(tempfile2);
123 
124 	}			/* end for */
125 	tst_rmdir();
126 	tst_exit();
127 }
128