Home | History | Annotate | Download | only in readv
      1 /*
      2  *
      3  *   Copyright (C) Bull S.A. 2001
      4  *   Copyright (c) International Business Machines  Corp., 2001
      5  *
      6  *   This program is free software;  you can redistribute it and/or modify
      7  *   it under the terms of the GNU General Public License as published by
      8  *   the Free Software Foundation; either version 2 of the License, or
      9  *   (at your option) any later version.
     10  *
     11  *   This program 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
     14  *   the GNU General Public License for more details.
     15  *
     16  *   You should have received a copy of the GNU General Public License
     17  *   along with this program;  if not, write to the Free Software
     18  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     19  */
     20 
     21 /*
     22  * NAME
     23  * 	readv03.c
     24  *
     25  * DESCRIPTION
     26  *	Testcase to check the error condition of the readv(2) system call
     27  *	when fd refers to a directory.
     28  *
     29  * CALLS
     30  * 	readv()
     31  *
     32  * ALGORITHM
     33  *      loop if that option was specified
     34  *      call readv() when fd refers to a directory.
     35  *      check the errno value
     36  *        issue a PASS message if we get EISDIR - errno 21
     37  *      otherwise, the tests fails
     38  *        issue a FAIL message
     39  *      call cleanup
     40  *
     41  * USAGE$
     42  *	readv03
     43  *
     44  * HISTORY
     45  *	05/2002 Ported by Jacky Malcles
     46  *
     47  * RESTRICTIONS
     48  * 	None
     49  */
     50 #include <sys/types.h>
     51 #include <sys/uio.h>
     52 #include <fcntl.h>
     53 #include <errno.h>
     54 #include <string.h>
     55 #include <sys/stat.h>
     56 
     57 #include "test.h"
     58 #include "safe_macros.h"
     59 
     60 #define	K_1	1024
     61 #define MODES   S_IRWXU
     62 
     63 char buf1[K_1];
     64 
     65 struct iovec rd_iovec[1] = {
     66 	{buf1, K_1}
     67 };
     68 
     69 const char *TEST_DIR = "alpha";
     70 int r_val;
     71 int fd;
     72 
     73 char *TCID = "readv03";
     74 int TST_TOTAL = 1;
     75 
     76 void setup();
     77 void cleanup();
     78 
     79 int main(int ac, char **av)
     80 {
     81 	int lc;
     82 
     83 	tst_parse_opts(ac, av, NULL, NULL);
     84 
     85 	setup();
     86 
     87 	/* The following loop checks looping state if -i option given */
     88 	for (lc = 0; TEST_LOOPING(lc); lc++) {
     89 
     90 		/* reset tst_count in case we are looping */
     91 		tst_count = 0;
     92 
     93 		if (readv(fd, rd_iovec, 1) < 0) {
     94 			if (errno != EISDIR) {
     95 				tst_resm(TFAIL, "expected errno = EISDIR, "
     96 					 "got %d", errno);
     97 			} else {
     98 				tst_resm(TPASS, "got EISDIR");
     99 			}
    100 		} else {
    101 			tst_resm(TFAIL, "Error: readv returned a positive "
    102 				 "value");
    103 		}
    104 
    105 	}
    106 	cleanup();
    107 	tst_exit();
    108 
    109 }
    110 
    111 /*
    112  * setup() - performs all ONE TIME setup for this test.
    113  */
    114 void setup(void)
    115 {
    116 
    117 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
    118 
    119 	TEST_PAUSE;
    120 
    121 	/* make a temporary directory and cd to it */
    122 	tst_tmpdir();
    123 
    124 	/*
    125 	 * create a new directory and open it
    126 	 */
    127 
    128 	if ((r_val = mkdir(TEST_DIR, MODES)) == -1) {
    129 		tst_brkm(TBROK, cleanup, "%s - mkdir() in main() "
    130 			 "failed", TCID);
    131 	}
    132 
    133 	if ((fd = open(TEST_DIR, O_RDONLY)) == -1) {
    134 		tst_brkm(TBROK, cleanup, "open of directory failed");
    135 	}
    136 
    137 }
    138 
    139 /*
    140  * cleanup() - performs all ONE TIME cleanup for this test at
    141  *	       completion or premature exit.
    142  */
    143 void cleanup(void)
    144 {
    145 	SAFE_CLOSE(cleanup, fd);
    146 	tst_rmdir();
    147 
    148 }
    149