Home | History | Annotate | Download | only in open
      1 /*
      2  *   Copyright (c) International Business Machines  Corp., 2002
      3  *   Copyright (c) 2013 Wanlong Gao <gaowanlong (at) cn.fujitsu.com>
      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 /*
     21  * Description:
     22  *	1. open an O_WRONLY file, test if read failed.
     23  *	2. open an O_RDONLY file, test if write failed.
     24  */
     25 
     26 #include <sys/types.h>
     27 #include <sys/stat.h>
     28 #include <stdio.h>
     29 #include <fcntl.h>
     30 #include "test.h"
     31 
     32 char *TCID = "open09";
     33 int TST_TOTAL = 2;
     34 
     35 #define PASSED 1
     36 #define FAILED 0
     37 
     38 static char tempfile[40] = "";
     39 
     40 static void setup(void);
     41 static void cleanup(void);
     42 
     43 int main(int ac, char *av[])
     44 {
     45 	int fildes;
     46 	int ret = 0;
     47 	char pbuf[BUFSIZ];
     48 
     49 	int lc;
     50 
     51 	tst_parse_opts(ac, av, NULL, NULL);
     52 
     53 	setup();
     54 
     55 	for (lc = 0; TEST_LOOPING(lc); lc++) {
     56 
     57 		fildes = open(tempfile, O_WRONLY);
     58 		if (fildes == -1)
     59 			tst_brkm(TFAIL, cleanup, "\t\t\topen failed");
     60 
     61 		ret = read(fildes, pbuf, 1);
     62 		if (ret != -1)
     63 			tst_resm(TFAIL, "read should not succeed");
     64 		else
     65 			tst_resm(TPASS, "Test passed in O_WRONLY.");
     66 
     67 		close(fildes);
     68 
     69 		fildes = open(tempfile, O_RDONLY);
     70 		if (fildes == -1) {
     71 			tst_resm(TFAIL, "\t\t\topen failed");
     72 		} else {
     73 			ret = write(fildes, pbuf, 1);
     74 			if (ret != -1)
     75 				tst_resm(TFAIL, "write should not succeed");
     76 			else
     77 				tst_resm(TPASS, "Test passed in O_RDONLY.");
     78 		}
     79 		close(fildes);
     80 	}
     81 
     82 	cleanup();
     83 	tst_exit();
     84 }
     85 
     86 static void setup(void)
     87 {
     88 	int fildes;
     89 
     90 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
     91 	TEST_PAUSE;
     92 	tst_tmpdir();
     93 
     94 	sprintf(tempfile, "open09.%d", getpid());
     95 
     96 	fildes = creat(tempfile, 0600);
     97 	if (fildes == -1) {
     98 		tst_brkm(TBROK, cleanup, "\t\t\tcan't create '%s'",
     99 			 tempfile);
    100 	} else {
    101 		close(fildes);
    102 	}
    103 }
    104 
    105 static void cleanup(void)
    106 {
    107 	unlink(tempfile);
    108 	tst_rmdir();
    109 }
    110