Home | History | Annotate | Download | only in stream
      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 /*--------------------------------------------------------------------*/
     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